Ibus IMEを使用してGVimに日本語のテキストを入力しています。 GVimの起動時にソースとなる次のVimスクリプトがあります。
autocmd InsertLeave * :call bug#onInsertLeave()
function! bug#onInsertLeave()
python << EOT
import vim
import ibus
bus = ibus.Bus()
ic = ibus.InputContext(bus, bus.current_input_contxt())
ic.disable()
print "bug#onInsertLeave(): exiting"
EOT
endfunction
InputContextを構築する行は例外を発生させます:
dbus.exception.DBusException:org.freedesktop.DBus.Error.Failed:フォーカスされた入力コンテキストなし
これは、次の条件下で発生します。
IMEで日本語のテキストを入力しない場合、例外は発生しません。
また、IMEが有効な状態で日本語のテキストを入力した後に挿入モードを終了すると、IME入力が無効になることに気付きました(タスクバーでアイコンの変更を確認できます)。日本語テキストを入力せずに挿入モードを終了しても、IMEがまだ有効な場合、IMEは有効なままです(アイコンは変わりません)。 GVimがいくつかの条件でIMEを無効にしている(またはIMEがオフになっている)ようです。それは例外に関係しているのでしょうか?
[〜#〜] edit [〜#〜]これはコマンドラインVimでは発生せず、GVimのみで発生することに気付きました。 IMEはまだ無効になっていますが、上記の例外はスローされません。
私の質問は:
[〜#〜] edit [〜#〜]
私のシステム情報:
> misha@misha-lmd:~/git/iwait2013/lagos$ apt-cache policy ibus ibus:
> Installed: 1.4.1-3ubuntu1 Candidate: 1.4.1-3ubuntu1 Version table:
> *** 1.4.1-3ubuntu1 0
> 500 http://jp.archive.ubuntu.com/ubuntu/ precise/main AMD64 Packages
> 100 /var/lib/dpkg/status misha@misha-lmd:~/git/iwait2013/lagos$ apt-cache policy vim vim:
> Installed: 2:7.3.429-2ubuntu2.1 Candidate: 2:7.3.429-2ubuntu2.1
> Version table: *** 2:7.3.429-2ubuntu2.1 0
> 500 http://jp.archive.ubuntu.com/ubuntu/ precise-updates/main AMD64 Packages
> 100 /var/lib/dpkg/status
> 2:7.3.429-2ubuntu2 0
> 500 http://jp.archive.ubuntu.com/ubuntu/ precise/main AMD64 Packages
Ubuntu 12.04、Fluxbox。
[〜#〜] edit [〜#〜]
Unityでも確認された動作。
これは主に予想される動作のようです。 ibusがアクティブで、たとえばメニューに移動するか、入力モードを終了すると、ibusはフォーカスのあるgui要素が表示されなくなり、テキストの入力が可能になるため、入力メソッドをオフに切り替えます。表示されたエラーメッセージ(「フォーカスのない入力コンテキスト」)はこれと一致しています。 ibusコンテキストはまだ生きているため、コマンドを実行せずにテキストウィンドウに戻ると、Ibusはオンのままです。バグは、アクションを実行し、それに続いてテキストウィンドウでクリックすると、ibusコンテキストが強制終了されることです。挿入モードのままですが、ibusコンテキストが無効になっているため、ibusを再度オンにする必要があります。これは、LibreOfficeのようなプログラムでは発生しません。
このバグは、vimが標準のguiイベントモデルではなく特別な挿入モードを使用する方法に起因していると思います。通常、テキストウィンドウをクリックすると、テキスト領域にフォーカスが設定されますが、ここでは設定しません。動作させるには、emacs用のibus-elのようなアドオンが必要です。このバグをどこに報告すればよいかわかりません。
回避策として、ibusの設定でibusを有効にするショートカットを設定することをお勧めします。 ibusメニュー> [設定]> [全般]タブ> [有効化]ボックスから。これは、入力モードを有効にするためのiのすぐ隣にあり、[入力モードを終了するために使用している可能性があるため、Ctrl-pのように思えます。同じエリアに指を置いています。テキスト領域に戻ったら、マウスを上に移動して2回クリックするよりも、指ですばやくフリックする方がはるかに簡単です。