如何在python中更改iBus输入法?

如何在python中更改iBus输入法?,python,vim,vim-plugin,Python,Vim,Vim Plugin,我正在编写一个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_eng

我正在编写一个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
函数!im#设置引擎(名称)

python阅读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
不幸的是,输入法名称取决于所使用的引擎。例如,对于mozc,我需要将其设置为“Direct”,而对于anthy,我必须使用“WideLatin”,以便在vim正常模式下获得正确的输入

如果有人知道一种查询iBus引擎以获得支持的InputMode列表的方法,那就太好了。还有一种查询引擎中当前设置InputMethod的方法也会有所帮助

call im#setInputMode("Hiragana")