我想编写简单的 bash 脚本,在不同的键盘布局之间转换输入。例如,如果我的系统有俄语和英语布局,并且我将“Руддщ”字符串传递给此脚本,则它应该输出“Hello”。
目前我正在使用这段代码:
echo "$@" | iconv -t cp1251 | tr $(echo "[йцукенгшщзхъфывапролджэ\\ячсмитьбю.ЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭ/ЯЧСМИТЬБЮ,\"№;:?Ёё]" | iconv -t cp1251) "[qwertyuiop\[\]asdfghjkl;'\\zxcvbnm,./QWERTYUIOP{}ASDFGHJKL:\"|ZXCVBNM<>?@#$^&~\`]"
有明显的缺点:
- 我必须使用
iconv
,因为我的系统使用utf8并且tr
不能使用它。 - 我必须手动输入所有字符,这导致缺乏适用性并且错误可能性很高。
我知道xneur
有类似的功能,但我不想动态切换布局,只需根据请求翻译字符串。我查看了xneur
源代码,但没有发现任何有用的东西。
答案1
我猜一些存在这个库(如果只是在谷歌内部?)。例如,https://www.google.com/search?q=hjccbz正确显示 россия 的结果。它不适合ghbdn,不过(也许是因为像这样拼写错误привет是一个常见的笑话?)
事实上,搜索这些字符串会带来一些有希望的结果,尽管没有任何明确的直接适用的结果。
无论如何,您没有理由不能将自己的代码放入脚本中,这显然消除了正确重新输入的需要。
如果您使用编辑器中的 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
。