我正在使用 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
Run Code Online (Sandbox Code Playgroud)
构造 InputContext 的行引发异常:
dbus.exception.DBusException: org.freedesktop.DBus.Error.Failed: 没有聚焦的输入上下文
这发生在以下条件下:
如果我不通过 IME 输入任何日语文本,则不会引发异常。
我还注意到,如果在 IME 仍然启用的情况下输入一些日语文本后退出插入模式,则 IME 输入将被禁用(我可以看到任务栏中的图标发生了变化)。如果我在没有输入任何日语文本的情况下退出插入模式,但当 IME 仍然启用时,IME 将保持启用状态(图标不会改变)。在某些情况下,GVim 似乎正在禁用 IME(或 IME 正在关闭)。它可能与异常有关吗?
编辑我注意到这不会发生在命令行 Vim,只有 GVim。IME 仍然被禁用,但不会抛出上述异常。
我的问题是:
编辑
我的系统信息:
> 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
Run Code Online (Sandbox Code Playgroud)
Ubuntu 12.04,Fluxbox。
编辑
在 Unity 上也确认了行为。
这似乎是大多数预期的行为。当 ibus 处于活动状态并且向上移动到菜单或退出输入模式时,ibus 会切换到输入法关闭,因为它不再看到具有焦点且可以输入文本的 gui 元素。您看到的错误消息(“没有聚焦的输入上下文”)与此一致。当您返回文本窗口而未执行命令时,ibus 会保持打开状态,因为 ibus 上下文仍然存在。错误在于,当您执行操作并在文本窗口中单击后,ibus 上下文将被终止。您仍处于插入模式,但 ibus 上下文已失效,您需要再次打开 ibus。在 LibreOffice 等程序中不会发生这种情况。
我想这个错误来自 vim 使用特殊插入模式而不是标准 gui 事件模型的方式。单击文本窗口通常会将焦点设置在文本区域上,但此处并非如此。为了让它工作,我们需要一个像 emacs 的 ibus-el 这样的插件。我不确定您应该在哪里为此提交错误。
对于解决方法,我认为最好的办法是在 ibus 首选项中设置一个启用 ibus 的快捷方式。从 ibus 菜单 > 首选项 > 常规选项卡 > 启用框。Ctrl-p 似乎是一个不错的选择,因为它就在用于启用输入模式的 i 和用于退出输入模式的 [ 旁边。我让你的手指保持在同一个区域。当您返回文本区域时,用手指快速轻拂比向上移动鼠标并单击两次要容易得多。