我正在编写一个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普通模式时实现了这个插件vim-im来禁用输入法。这很重要,因为如果将iBus设置为非ascii输入法,则Vim正常模式不可用。如果你使用vim用日语,中文,韩语等写作......你可能会理解这个问题。
问题是,由于iBus 1.5我的插件所依赖的启用/禁用方法已被弃用。所以我的插件在Ubuntu&lt; = 13.04中运行,但在Debian Jessie中没有,并且可能无法在未来的Ubuntu版本上运行。
我认为具有类似功能的唯一方法是定义默认的iBus引擎和输入法,并在每次Vim进入正常模式时将iBus更改为。
答案 0 :(得分:2)
阅读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,我需要将其设置为&#34; Direct&#34;而对于anthy,我必须使用&#34; WideLatin&#34;为了在vim Normal Mode中获得正确的输入。
如果有人知道查询iBus引擎以获取支持的InputMode列表的方法会很棒。另外一种查询引擎以获取当前集合InputMethod的方法也会有所帮助。