我使用 ibus 输入不同语言(我主要使用英语和俄语,但有时也使用世界语、乌克兰语、希腊语、德语、法语等)。对于英语,我使用的引擎xkb:us::eng
本质上是英语的基本 xkb 表。但是我找不到如何在 ibus 中使用 xkb 选项的任何方法。当 xkb 引擎是 1 时,setxkbmap -query
给出以下输出:
rules: evdev
model: pc105
layout: us
options: compose:menu,grp:caps_toggle
但我更希望有其他选项。首先,我grp:caps_toggle
根本不需要,因为我禁用并重新映射了~/.Xmodmap
Plus 中的 Capslock 键,我希望有印刷符号、Alt_R 的 lv3 开关和其他方便的东西setxkbmap
。在使用 ibus 之前,我使用 uim 和美国键盘,我的启动文件中有以下内容:
setxkbmap "us" -option "compose:menu,lv3:ralt_switch,grp_led:scroll,misc:typo,terminate:ctrl_alt_bksp"
uim 在 xkb 之上使用了它的引擎,因此所有这些选项都可以在直接模式和任何引擎(至少是来自 m17n 的引擎)中工作。另一方面,Ibus 使用 xkb 作为其引擎之一,因此调用setxkbmap
似乎会破坏一切。如何在 ibus 内部将选项传递给 xkb 引擎?这可能吗?
附加问题:如何将相同的 xkb 选项用于 m17n 引擎?在 ibus GUI 中,有一个用于 m17n 引擎的首选项选项卡,但它只有一个“使用美国键盘布局”复选标记,无法指定要使用哪种 xkb 布局以及使用哪些选项。我使用m17n:ru:kbd
引擎(而不是 xkb 引擎)来处理俄语,但我希望在使用时拥有 xkb 的所有方便选项。对于我偶尔使用的所有其他语言/引擎也是如此。
答案1
我设法找到了一种解决方法,即完全摆脱 Ibus 的正确引擎切换机制,转而使用sh
脚本。我编写了一个名为的脚本switchim.sh
并将其放入~/keyboard/
目录中。每次切换布局时,我都会通过它传递setxkbmap
选项。因为我想从英语切换到俄语,并从其他任何语言切换到英语,所以它看起来像这样:
#!/bin/bash
if [ $(ibus engine) == xkb:us::eng ]; then
ibus engine m17n:ru:kbd
setxkbmap -option "compose:menu,lv3:ralt_switch,grp_led:scroll,misc:typo,terminate:ctrl_alt_bksp"
else
ibus engine xkb:us::eng
setxkbmap -option "compose:menu,lv3:ralt_switch,grp_led:scroll,misc:typo,terminate:ctrl_alt_bksp"
fi
然后,我将此脚本与我的 DE(即 XFCE)热键功能绑定到我的“下一个组”键,即 Caps Lock。我还制作了类似的脚本来切换到其他语言,例如这个用于世界语的脚本:
#!/bin/bash
ibus engine m17n:eo:x-sistemo
setxkbmap -option "compose:menu,lv3:ralt_switch,grp_led:scroll,misc:typo,terminate:ctrl_alt_bksp"
我绑定到 Super+ 的那些脚本信键。
这或多或少是可行的。Compose 键仍然只能在英语中使用,但其他一切似乎都运行良好。这是一个肮脏的黑客行为,但现在不得不这么做。