18.04 中的自定义 ComposeKey 序列

18.04 中的自定义 ComposeKey 序列

如何在 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故障:

xim 故障

当我尝试时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 指出(12):

在里面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_keybtw。)

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。

相关内容