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

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

我通常在我的设备上使用美国布局,因为我不喜欢德国布局,但必须按 Compose 来输入 ä、ö、ü、ß 等,这很烦人。在 Windows 上,我有一个 AutoHotKey 脚本,当我键入时,它会用 ö 等替换 oe它在我的键盘上“热弦”选项。有什么程序/黑客可以用来在 Linux 上获得这个吗?

这是我在 Windows 上使用 AutoHotKey 的脚本:

:*?:ue::ü
:*?:ae::ä
:*?:oe::ö
:*?:sss::ß

这是打字时的样子:

在此输入图像描述

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

答案1

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

默认情况下,Compose-o-e生成 –。

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

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

# This file defines custom Compose sequences for Unicode characters

# Import default rules from the system:
include "%L"

<Multi_key> <o> <e>                     : "ö"   odiaeresis # LATIN SMALL LETTER O WITH DIARESIS

更多文档在man XCompose.

该方法与xmodmap有关,参见。https://wiki.debian.org/XCompose

编辑:但是问题要求一种方法不是使用 Compose(即 Multi_key)。 Compose 框架处理所有击键,因此也可以根据问题的具体要求进行调整,直接重新处理 o 和 e 形成 ö:

<o> <e>                     : "ö"   odiaeresis # LATIN SMALL LETTER O WITH DIARESIS

答案2

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

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

let binds = [
  ["ae", "ä"],
  ["oe", "ö"],
  ["ue", "ü"],
  ["sss", "ß"],
]
let sleep = ms => new Promise(r=>setTimeout(r,ms))
let {keyboard, Key, clipboard} = require("@nut-tree/nut-js");
let {uIOhook: io, UiohookKey: K} = require('uiohook-napi')
let maxlen = Math.max(...binds.map(e=>e[0].length))
binds=binds.map(e=>({len: e[0].length, keys: e[0].split('').map(f=>K[f.toUpperCase()])+'', out: e[1]}))
let last=Array(maxlen).fill(-1)
io.on("keydown", async e=>{
  last.push(e.keycode)
  last.shift()
  let cur = last+''
  let find = binds.find(e=>cur.endsWith(e.keys))
  if (find) {
    for (let i=0;i<find.len;i++) { await keyboard.type(Key.Backspace) }
    let cb = await clipboard.paste()
    await clipboard.copy(e.shiftKey ? find.out.toUpperCase() : find.out)
    await sleep(10)
    await keyboard.type(Key.LeftControl, Key.V)
    await sleep(10)
    await clipboard.copy(cb)
  }
})

io.start()

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

答案3

我使用美国国际键盘。所以德语特殊字符位于键盘布局的第三层和第四层

> cat .Xkbmap
-layout us
-variant altgr-intl

! if gnome-settings-daemon is installed execute :
! gsettings set org.gnome.desktop.input-sources sources "[('xkb', 'us+altgr-intl')]"
! gsettings set org.gnome.desktop.input-sources xkb-options "['lv3:caps_switch', 'terminate:ctrl_alt_bksp']"

-option lv3:caps_switch
-option terminate:ctrl_alt_bksp

相关内容