如何在输入时将 oe 替换为 ö?

lxh*_*hom 10 keyboard input

我通常在我的设备上使用美国布局,因为我不喜欢德国布局,但在 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\n
Run Code Online (Sandbox Code Playgroud)\n

这是打字时的样子:

\n

在此输入图像描述

\n

编辑:澄清一下,我希望它能够在 X11 服务器上全局运行。如果我可以在不需要重新启动的情况下打开/关闭它,那就太好了(我只在输入德语文本时需要它)。我使用的i3wm没有完整的桌面环境,但如果需要的话我可以安装一个DE程序。另外,我正在摆弄libuiohook atm,并且可能会一起破解一些东西来做到这一点,当它工作时我会在这里更新它:)

\n

Riz*_*zer 7

X 识别 Multi_key 键(或 Compose),桌面环境(例如 Gnome)可能使用键盘上的 Windows 键等键作为 Compose 键(可以在 Gnome 键盘设置中进行配置)。

\n

默认情况下,Compose-o-e生成 \xc5\x93。

\n

X 已经通过双引号提供了 \xc3\xb6,即Compose-"-o生成 \xc3\xb6 (并Compose-"-a生成 \xc3\xa4 等)。

\n

如果您想覆盖它,您可以在~/.XCompose\ne.g中创建自定义设置。

\n
# 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\n
Run Code Online (Sandbox Code Playgroud)\n

更多文档在man XCompose.

\n

该方法与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\n
Run Code Online (Sandbox Code Playgroud)\n

  • 提问者说“必须按 Compose 来输入 ä、ö、ü、ß 等很烦人”,所以我认为他们正在寻找不需要在序列之前按 Compose 键的东西。 (9认同)
  • 话又说回来,XCompose 是完全灵活的。答案已更新,可提供不使用 Compose 键的直接解决方案。不过,祝你好运,写下你的 shös(鞋子);) (2认同)

lxh*_*hom 2

好吧,这不是最好的解决方案,但它有效:

\n

安装 node.js 和https://github.com/kwhat/libuiohoo的依赖项,运行npm i @nut-tree/nut-js uiohook-napi然后在 Node 中运行此文件:

\n
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()\n
Run Code Online (Sandbox Code Playgroud)\n

如果您发现比这更好的东西,请告诉我,因为这个解决方案非常老套,哈哈

\n