Я использую 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: нет сфокусированного входного контекста
blockquote>Это происходит при следующих условиях:
- Я вхожу в режим вставки
- Я вставляю некоторый японский текст
- Я выхожу из режима вставки
Если я не введу японский текст через IME, то исключение не возникает.
Я также заметил, что если я выйду из режима вставки после ввода текста на японском языке, когда IME все еще включен, то ввод IME отключен (я вижу изменение значка на панели задач). Если я выйду из режима вставки без ввода текста на японском языке, но пока IME все еще включен, IME остается включенным (значок не меняется). Похоже, что GVim отключает IME (или IME отключается) в некоторых условиях. Может ли это быть связано с исключением?
РЕДАКТИРОВАТЬ Я заметил, что это не происходит с командной строкой Vim, только с GVim. IME все еще отключен, но вышеприведенное исключение не выдается.
Мои вопросы:
- Это ошибка? Если это так, то чья это ошибка? Vim, Ibus или что-то еще?
- Есть ли способы обойти исключение?
РЕДАКТИРОВАТЬ
Моя системная информация:
> 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. [+1121]
Это, кажется, в основном ожидаемое поведение. Когда ibus активен и один, скажем, переходит в меню или выходит из режима ввода, ibus переключается на метод ввода, отключенный, поскольку он больше не видит элемент графического интерфейса с фокусом и там, где ввод текста возможен. Сообщение об ошибке («не сфокусированный входной контекст») соответствует этому. Ibus остается включенным, когда вы возвращаетесь в текстовое окно, не выполнив команду, потому что контекст ibus все еще жив. Ошибка в том, что контекст ibus уничтожается, когда вы выполняете действие и выполняете его щелчком в текстовом окне. Вы все еще в режиме вставки, но контекст ibus мертв, вам нужно снова включить ibus. Это не происходит в таких программах, как LibreOffice.
Я предполагаю, что ошибка связана с тем, что vim использует специальный режим вставки, а не стандартную модель событий графического интерфейса. Щелчок в текстовом окне обычно устанавливает фокус на текстовой области, но здесь это не так. Чтобы это работало, нам нужен дополнительный модуль, например ibus-el для emacs. Я не уверен, где вы должны подать ошибку для этого.
Для временного решения, я думаю, лучше всего установить ярлык для включения ibus в настройках ibus. Из меню ibus> настройки> вкладка «Общие»> включить окно. Хорошим кажется Ctrl-p, поскольку он находится рядом с i для включения режима ввода и [вы можете использовать для выхода из режима ввода. Я держу тебя пальцами в той же области. Когда вы вернетесь в текстовую область, быстрое движение пальцами намного проще, чем переместить мышь вверх и дважды щелкнуть мышью.