
Я хочу написать простой скрипт bash, который переводит ввод между различными раскладками клавиатуры. Например, если в моей системе есть русская и английская раскладки, и я передаю строку 'Руддщ' этому скрипту, он должен вывести 'Hello'.
В настоящее время я использую этот код:
echo "$@" | iconv -t cp1251 | tr $(echo "[йцукенгшщзхъфывапролджэ\\ячсмитьбю.ЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭ/ЯЧСМИТЬБЮ,\"№;:?Ёё]" | iconv -t cp1251) "[qwertyuiop\[\]asdfghjkl;'\\zxcvbnm,./QWERTYUIOP{}ASDFGHJKL:\"|ZXCVBNM<>?@#$^&~\`]"
Есть и очевидные недостатки:
- Мне приходится использовать
iconv
, потому что моя система использует utf8 иtr
не может его использовать. - Мне приходится вводить все символы вручную, что приводит к невозможности применения и высокой вероятности ошибок.
Я знаю, xneur
что есть похожий функционал, но я не хочу переключать раскладку на лету, просто переводить строки по запросу. Я просмотрел xneur
исходный код, но ничего полезного не нашел.
решение1
Наверноенекоторыйбиблиотека для этого существует (хотя бы внутри Google?). Например,https://www.google.com/search?q=hjccbzправильно отображает результаты для россия. Это не работает длягхбдтн, хотя (возможно, потому, что неправильное написание слова привет — это распространённая шутка?)
На самом деле поиск этих строк выдает несколько многообещающих результатов, хотя и ничего, что можно было бы напрямую применить.
В любом случае, нет никаких причин, по которым вы не могли бы поместить свой собственный код в скрипт, что, очевидно, устраняет необходимость его корректного повторного ввода.
Если вы сохраните это в кодировке CP1251 из вашего редактора, вы можете избежать вложенных iconv
:
#!/bin/sh
LC_ALL=C
iconv -t cp1251 |
tr 'йцукенгшщзхъфывапролджэ\ячсмитьбю.ЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭ/ЯЧСМИТЬБЮ,"№;:?Ёё' "qwertyuiop[]asdfghjkl;'\\zxcvbnm,./QWERTYUIOP{}ASDFGHJKL:\"|ZXCVBNM<>?@#$^&~\`"
ядуматьУ вас было ложное предположение о необходимости использования квадратных скобок вокруг аргументов, tr
которое я также попытался исправить.
Сохраните файл в папке на вашем компьютере, PATH
дав ему легко запоминающееся и легко вводимое имя, chmod +x
и все готово.
решение2
Я не представляю, что это возможно, поскольку при заданной раскладке может быть несколько способов набрать один и тот же символ. Например, при использовании моей французской раскладки я могу набрать «É» либо включив CapsLock
и набрав é
, либо Compose
- '
- Shift
- e
.