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

时间:2014-02-26 04:18:46

标签: 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_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更改为。

1 个答案:

答案 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的方法也会有所帮助。