我通常在我的设备上使用美国布局,因为我不喜欢德国布局,但在 Windows 上按 Compose 键入 \xc3\xa4、\xc3\xb6、\xc3\xbc、\xc3\x9f 等很烦人我有一个 AutoHotKey 脚本,当我使用“热字符串”选项在键盘上键入它时,它将 oe 替换为 \xc3\xb6 等。有什么程序/黑客可以用来在 Linux 上实现此目的吗?
\n这是我在 Windows 上通过 AutoHotKey 使用的脚本:
\n:*?:ue::\xc3\xbc\n:*?:ae::\xc3\xa4\n:*?:oe::\xc3\xb6\n:*?:sss::\xc3\x9f\nRun Code Online (Sandbox Code Playgroud)\n这是打字时的样子:
\n\n编辑:澄清一下,我希望它能够在 X11 服务器上全局运行。如果我可以在不需要重新启动的情况下打开/关闭它,那就太好了(我只在输入德语文本时需要它)。我使用的i3wm没有完整的桌面环境,但如果需要的话我可以安装一个DE程序。另外,我正在摆弄libuiohook atm,并且可能会一起破解一些东西来做到这一点,当它工作时我会在这里更新它:)
\nX 识别 Multi_key 键(或 Compose),桌面环境(例如 Gnome)可能使用键盘上的 Windows 键等键作为 Compose 键(可以在 Gnome 键盘设置中进行配置)。
\n默认情况下,Compose-o-e生成 \xc5\x93。
X 已经通过双引号提供了 \xc3\xb6,即Compose-"-o生成 \xc3\xb6 (并Compose-"-a生成 \xc3\xa4 等)。
如果您想覆盖它,您可以在~/.XCompose\ne.g中创建自定义设置。
# This file defines custom Compose sequences for Unicode characters\n\n# Import default rules from the system:\ninclude "%L"\n\n<Multi_key> <o> <e> : "\xc3\xb6" odiaeresis # LATIN SMALL LETTER O WITH DIARESIS\nRun Code Online (Sandbox Code Playgroud)\n更多文档在man XCompose.
该方法与xmodmap有关,参见。https://wiki.debian.org/XCompose
\n编辑:但问题要求一种不使用 Compose 的方法(即 Multi_key)。Compose 框架处理所有击键,因此也可以适应问题的具体要求,直接重新处理 o 和 e 形成 \xc3\xb6:
\n<o> <e> : "\xc3\xb6" odiaeresis # LATIN SMALL LETTER O WITH DIARESIS\nRun Code Online (Sandbox Code Playgroud)\n
好吧,这不是最好的解决方案,但它有效:
\n安装 node.js 和https://github.com/kwhat/libuiohoo的依赖项,运行npm i @nut-tree/nut-js uiohook-napi然后在 Node 中运行此文件:
let binds = [\n ["ae", "\xc3\xa4"],\n ["oe", "\xc3\xb6"],\n ["ue", "\xc3\xbc"],\n ["sss", "\xc3\x9f"],\n]\nlet sleep = ms => new Promise(r=>setTimeout(r,ms))\nlet {keyboard, Key, clipboard} = require("@nut-tree/nut-js");\nlet {uIOhook: io, UiohookKey: K} = require(\'uiohook-napi\')\nlet maxlen = Math.max(...binds.map(e=>e[0].length))\nbinds=binds.map(e=>({len: e[0].length, keys: e[0].split(\'\').map(f=>K[f.toUpperCase()])+\'\', out: e[1]}))\nlet last=Array(maxlen).fill(-1)\nio.on("keydown", async e=>{\n last.push(e.keycode)\n last.shift()\n let cur = last+\'\'\n let find = binds.find(e=>cur.endsWith(e.keys))\n if (find) {\n for (let i=0;i<find.len;i++) { await keyboard.type(Key.Backspace) }\n let cb = await clipboard.paste()\n await clipboard.copy(e.shiftKey ? find.out.toUpperCase() : find.out)\n await sleep(10)\n await keyboard.type(Key.LeftControl, Key.V)\n await sleep(10)\n await clipboard.copy(cb)\n }\n})\n\nio.start()\nRun Code Online (Sandbox Code Playgroud)\n如果您发现比这更好的东西,请告诉我,因为这个解决方案非常老套,哈哈
\n| 归档时间: |
|
| 查看次数: |
1264 次 |
| 最近记录: |