如何在 Ubuntu 18.04 中添加用户定义的 Compose 键规则?我Compose使用 Gnome Tweaks(位于 CapsLock 上)打开了我的键,并.XCompose
以以下几行开头:
include "%L" # import the default Compose file for your locale
# IPA
<Multi_key> <a> <h> : "ɑ"
<Multi_key> <A> <h> : "Ɑ"
# Some more lines
<Multi_key> <ampersand> <underscore> <m> : "̼"
# Math
<Multi_key> <minus> <0> : "−"
<Multi_key> <asterisk> <1> : "⋅"
<Multi_key> <x> <x> : "×"
# ...
我跟着这个建议,安装uim
并将其设置为GTK_
和QT_IM_MODULE
,但以该<minus> <0>
行开头的每个序列都会被忽略。当我尝试时xim
,它表现得更好,但它产生了gedit
故障:
。
当我尝试时GTK_IM_MODULE=gtk-im-context-simple
,大多数序列开始起作用,但有些却不起作用。
<Multi_key> <minus> <0> : "−" # doesn't work
<Multi_key> <asterisk> <1> : "⋅" # doesn't work
<Multi_key> <e> <m> <o> <colon> <space> : "
答案1
您指向的链接基本上是正确的,但有几点需要注意:
Compose插入与第一个(最短)匹配对应的字符。假设
.XCompose
包含以下条目:<Multi_key> <space> : " " nobreakspace # NO-BREAK SPACE <Multi_key> <space> <space> : " " U2002 # EN SPACE <Multi_key> <space> <space> <space> : " " U2003 # EM SPACE
尝试使用 EN-SPACE 或 EM-SPACE 永远不会成功。
要Compose使用 GTK,请将以下行添加到
.profile
:export GTK_IM_MODULE=gtk-im-context-simple
关于这一点gtk-im-context-simple
,Jens Mühlenhoff 指出(1,2):
在里面API 文档:
GtkIMContextSimple 从以下找到的第一个文件中读取额外的组合序列:
〜/ .config / gtk-3.0 / Compose
~/.XCompose、/usr/share/X11/locale/$locale/Compose(适用于具有非平凡 Compose 文件的语言环境)
因此,gtk-im-context-simple 方法有一个内置表,它从几个其他位置加载组合序列。这意味着它可能会加载您意想不到的较短序列。
答案2
Gtk+ 输入法模块有几种可能性。
im 模块决定在 Gtk+ 中如何处理除直接键翻译之外的附加输入。
因此,可用的组合键序列取决于您使用的 im 模块。(组合键的符号 X11 名称是Multi_key
btw。)
该gtk-query-immodules-3.0
命令可用于显示已安装的模块,也可用于更新缓存(使用sudo gtk-query-immodules-3.0 --update-cache
)。
示例输出:
# GTK+ Input Method Modules file
# Automatically generated file, do not edit
# Created by gtk-query-immodules-3.0 from gtk+-3.24.1
#
# ModulesPath = /usr/lib64/gtk-3.0/3.0.0/x86_64-pc-linux-gnu/immodules:/usr/lib64/gtk-3.0/3.0.0/immodules:/usr/lib64/gtk-3.0/x86_64-pc-linux-gnu/immodules:/usr/lib64/gtk-3.0/immodules
#
"/usr/lib64/gtk-3.0/3.0.0/immodules/im-am-et.so"
"am_et" "Amharic (EZ+)" "gtk30" "/usr/share/locale" "am"
"/usr/lib64/gtk-3.0/3.0.0/immodules/im-cedilla.so"
"cedilla" "Cedilla" "gtk30" "/usr/share/locale" "az:ca:co:fr:gv:oc:pt:sq:tr:wa"
"/usr/lib64/gtk-3.0/3.0.0/immodules/im-cyrillic-translit.so"
"cyrillic_translit" "Cyrillic (Transliterated)" "gtk30" "/usr/share/locale" ""
"/usr/lib64/gtk-3.0/3.0.0/immodules/im-ibus.so"
"ibus" "IBus (Intelligent Input Bus)" "ibus" "" "ja:ko:zh:*"
"/usr/lib64/gtk-3.0/3.0.0/immodules/im-inuktitut.so"
"inuktitut" "Inuktitut (Transliterated)" "gtk30" "/usr/share/locale" "iu"
"/usr/lib64/gtk-3.0/3.0.0/immodules/im-ipa.so"
"ipa" "IPA" "gtk30" "/usr/share/locale" ""
"/usr/lib64/gtk-3.0/3.0.0/immodules/im-multipress.so"
"multipress" "Multipress" "gtk30" "" ""
"/usr/lib64/gtk-3.0/3.0.0/immodules/im-thai.so"
"thai" "Thai-Lao" "gtk30" "/usr/share/locale" "lo:th"
"/usr/lib64/gtk-3.0/3.0.0/immodules/im-ti-er.so"
"ti_er" "Tigrigna-Eritrean (EZ+)" "gtk30" "/usr/share/locale" "ti"
"/usr/lib64/gtk-3.0/3.0.0/immodules/im-ti-et.so"
"ti_et" "Tigrigna-Ethiopian (EZ+)" "gtk30" "/usr/share/locale" "ti"
"/usr/lib64/gtk-3.0/3.0.0/immodules/im-viqr.so"
"viqr" "Vietnamese (VIQR)" "gtk30" "/usr/share/locale" "vi"
"/usr/lib64/gtk-3.0/3.0.0/immodules/im-wayland.so"
"wayland" "Wayland" "gtk30" "/usr/share/locale" ""
"/usr/lib64/gtk-3.0/3.0.0/immodules/im-waylandgtk.so"
"waylandgtk" "Waylandgtk" "gtk30" "/usr/share/locale" ""
"/usr/lib64/gtk-3.0/3.0.0/immodules/im-xim.so"
"xim" "X Input Method" "gtk30" "/usr/share/locale" "ko:ja:th:zh"
西姆是传统的 X11 输入法。
伊布斯是一种更为现代的输入法。
有多种输入法可用于输入使用非拉丁文字/字母的语言。
有两个内置模块未被该工具列出,它们是:
- gtk-im-context-none(禁用所有高级输入)
- gtk-im-上下文-简单(xiotas 的回答中有很好的描述)
如果您具备必要的编程技能,可以编写自己的模块,请参阅此处的 API 文档:
https://developer.gnome.org/gtk3/stable/GtkIMContext.html#GtkIMContext.description
我发现了一个有用的测试工具,可以轻松尝试输入法:
https://github.com/ibus/ibus/files/1829333/window.py.txt
from gi import require_version as gi_require_version
gi_require_version('Gtk', '3.0')
gi_require_version('Gdk', '3.0')
from gi.repository import Gtk
from gi.repository import Gdk
import sys
label = None
def __entry_key_press_cb(entry, event):
label.set_text('%s %x %x' % (Gdk.keyval_name(event.keyval), event.hardware_keycode, event.state))
Gtk.init(sys.argv)
window = Gtk.Window(type = Gtk.WindowType.TOPLEVEL)
window.connect('destroy', Gtk.main_quit)
box = Gtk.Box(orientation = Gtk.Orientation.VERTICAL, spacing = 0)
window.add(box)
entry = Gtk.Entry()
entry.connect('key-press-event', __entry_key_press_cb)
#box.pack_start(entry, False, False, 0)
box.add(entry)
label = Gtk.Label(label = 'Press keys')
#box.pack_start(label, False, False, 0)
box.add(label)
window.show_all()
Gtk.main()
您可以像这样运行它:
env GTK_IM_MODULE=gtk-im-context-simple python window.py
或者
env GTK_IM_MODULE=xim python window.py
ETC。