Vim 禁用 ibus IME——这是一个错误吗?

Vim 禁用 ibus IME——这是一个错误吗?

我正在使用 ibus IME 将日文文本输入 GVim。我有以下 Vim 脚本,我在 GVim 启动时将其作为源代码:

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:没有焦点输入上下文

这种情况在以下条件下会发生:

  1. 我进入插入模式
  2. 我插入了一些日文
  3. 我退出插入模式

如果我没有通过 IME 输入任何日语文本,则不会引发异常。

我还注意到,如果我在输入一些日文文本后退出插入模式,而此时 IME 仍处于启用状态,则 IME 输入将被禁用(我可以看到任务栏中的图标发生变化)。如果我在未输入任何日文文本的情况下退出插入模式,但此时 IME 仍处于启用状态,则 IME 保持启用状态(图标不变)。似乎 GVim 在某些情况下禁用了 IME(或 IME 正在关闭)。这可能与异常有关吗?

编辑我注意到,命令行 Vim 不会发生这种情况,只有 GVim 才会发生这种情况。IME 仍然被禁用,但不会抛出上述异常。

我的问题是:

  1. 这是一个错误吗?如果是,那么是谁的错误?Vim、Ibus 还是其他?
  2. 有没有什么方法可以解决这个异常?

编辑

我的系统信息:

> 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。

编辑

在 Unity 上也确认了行为。

答案1

这似乎大多是预期的行为。当 ibus 处于活动状态并且有人(例如)向上移动到菜单或退出输入模式时,ibus 会切换到输入法关闭,因为它不再看到具有焦点的 gui 元素,并且无法在其中输入文本。您看到的错误消息(“没有焦点输入上下文”)与此一致。当您返回文本窗口而未执行命令时,Ibus 保持打开状态,因为 ibus 上下文仍然处于活动状态。错误在于,当您执行操作并在文本窗口中单击时,ibus 上下文会被终止。您仍处于插入模式,但 ibus 上下文已死,您需要再次打开 ibus。这不会发生在 LibreOffice 等程序中。

我认为该错误源自 vim 使用特殊插入模式而非标准 gui 事件模型的方式。单击文本窗口通常会将焦点置于文本区域上,但此处并非如此。要使其正常工作,我们需要一个类似 emacs 的 ibus-el 之类的附加组件。我不确定您应该在哪里为此提交错误。

对于解决方法,我认为最好的办法是在 ibus 首选项中设置一个快捷方式来启用 ibus。从 ibus 菜单 > 首选项 > 常规选项卡 > 启用框。一个好办法似乎是 Ctrl-p,因为它就在用于启用输入模式的 i 和您可能用来退出输入模式的 [ 旁边。I 让您的手指保持在同一区域。当您回到文本区域时,用手指快速轻拂比将鼠标向上移动并单击两次要容易得多。

相关内容