2014-02-26 75 views
4

我寫一個Vim插件設置的ibus引擎和輸入法。到目前爲止,我可以用下面的代碼修改引擎:如何更改python中的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 < = 13.04,但不在Debian Jessie中,也可能在未來的Ubuntu版本上無法工作。

我看到具有類似的功能的唯一方法是定義一個默認IBUS發動機和輸入方法並改變IBUS那些每Vim的在正常模式下輸入的時間。

回答

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,我需要將它設置爲「Direct」,而對於anthy,我必須使用「WideLatin」才能在vim正常模式下獲得正確的輸入。

如果有人知道的方式來查詢的ibus引擎獲得支持INPUTMODE的名單將是巨大的。另外一種查詢當前設置的InputMethod引擎的方法也會有所幫助。