我正在编写一个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文档还缺乏细节。
是否有人可以提供关于如何以编程方式更改iBus输入方法的指针或示例?另外,获得每个引擎所支持的输入方法列表的方法也是很棒的。
====
从这一点开始,我将尝试提供更多关于我正在试图解决的问题的上下文。如果你不感兴趣就跳吧。
当进入Vim正常模式时,我实现了这个插件维姆来禁用输入方法。这一点很重要,因为如果将iBus设置为非ascii输入方法,Vim正常模式是不可用的。如果你用vim写日文、中文、韩文等.你可以理解这个问题。
问题是,由于iBus 1.5,我的插件所依赖的启用/禁用方法被废弃了。因此,我的插件在Ubuntu <= 13.04中工作,但在Debian中不起作用,而且可能也不会在未来的Ubuntu版本中工作。
我看到具有类似功能的唯一方法是定义一个默认的iBus引擎和输入方法,并在每次iBus进入正常模式时将其更改为那些。
发布于 2014-02-26 09:33:03
阅读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“,而对于WideLatin,我必须使用"WideLatin”才能在vim正常模式下获得正确的输入。
如果有人知道如何查询iBus引擎以获得受支持的InputMode列表,那就太好了。另外,查询引擎中当前集InputMethod的方法也会有所帮助。
https://stackoverflow.com/questions/22031653
复制相似问题