我正在编写一个 Vim 插件来设置 iBus 引擎和输入法。到目前为止,我可以使用以下代码更改引擎:
function! im#setEngine(name)
python << EOF
try:
import ibus,vim
bus = ibus.Bus()
ic = ibus.InputContext(bus, bus.current_input_contxt())
name = vim.eval("a:name")
engines = bus.get_engines_by_names([name])
size = len(engines)
if size <= 0:
print "Could not find engine %s"%name
else:
engine = engines[0]
ic.set_engine(engine)
except Exception, e:
print "Failed to connect to iBus"
print e
EOF
endfunction
function! im#listEngines()
let l:engines = []
python << EOF
try:
import ibus,dbus,vim
bus = ibus.Bus()
names = []
for engine in bus.list_engines():
names.append(str(engine.name))
vim.command("let l:engines = %s"% names)
except Exception, e:
print "Failed to connect to iBus"
print e
EOF
return l:engines
endfunction
现在我还尝试为引擎设置输入法,但我无法找到如何执行此操作。到目前为止,iBus 文档缺乏详细信息。
有没有人可以提供有关如何以编程方式(Python)更改 iBus 输入法的指针或示例?还有一种获取每个引擎支持的输入法列表的方法会很棒。
====
从这一点来看,我将尝试提供有关我正在尝试解决的问题的更多背景信息。如果您不感兴趣,请跳过。
我实现了这个插件 vim-im 以在进入 Vim 正常模式时禁用输入法。这很重要,因为如果 iBus 设置为非 ascii 输入法,Vim 正常模式将无法使用。如果你用 vim 写日文、中文、韩文等……你可能明白这个问题。
问题是,从 iBus 1.5 开始,我的插件依赖的启用/禁用方法已被弃用。所以我的插件适用于 Ubuntu
我认为具有类似功能的唯一方法是定义一个默认的 iBus 引擎和输入法,并在每次 Vim 进入正常模式时将 iBus 更改为那些。
最佳答案
阅读 ibus 库代码我找到了一个可以接受的解决方案:
function! im#setInputMode(mode)
python << EOF
try:
import ibus,dbus,vim
bus = ibus.Bus()
conn = bus.get_dbusconn().get_object(ibus.common.IBUS_SERVICE_IBUS, bus.current_input_contxt())
ic = dbus.Interface(conn, dbus_interface=ibus.common.IBUS_IFACE_INPUT_CONTEXT)
mode = vim.eval("a:mode")
ic.PropertyActivate("InputMode." + mode, ibus.PROP_STATE_CHECKED)
except Exception, e:
print "Failed to connect to iBus"
print e
EOF
endfunction
此方法允许我通过传递一个名称来更改 iBus 的输入法,例如:
call im#setInputMode("Hiragana")
不幸的是,输入法名称取决于所使用的引擎。例如,对于 mozc,我需要将其设置为“Direct”,而对于 anthy,我必须使用“WideLatin”才能在 vim 正常模式下获得正确的输入。
如果有人知道一种查询 iBus 引擎以获取支持的 InputMode 列表的方法,那就太好了。查询当前设置的 InputMethod 引擎的方法也会有所帮助。
关于python - 如何在python中更改iBus输入法?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22031653/