Pull to refresh

Vim и переключение раскладок: о наболевшем

Reading time 2 min
Views 28K
Всем привет. Я достаточно давно пользуюсь редактором Vim для редактирования очень разных текстов: правки конфигов, написания кода, в качестве внешнего редактора в браузере и почтовом клиенте…

Редактор почти идеален, но было одно маленькое «но». В частности, бесило переключение раскладки. Недавно в личной беседе зашла речь о лежащих на пути использования Vim граблях, и решил я набросать эдакие «заметки на полях».


Казалось бы, ну что там такого: нажал сочетание, вводишь латиницу, нажал еще раз — кириллицу. Однако, в нормальном режиме, пребывание в котором занимает как минимум 80% времени, накладываются свои отпечатки. Ладно, про langmap, думаю, знают все.

Прописываем в ~/.vimrc следующее:

set langmap=ФИСВУАПРШОЛДЬТЩЗЙКЫЕГМЦЧНЯ;ABCDEFGHIJKLMNOPQRSTUVWXYZ,фисвуапршолдьтщзйкыегмцчня;abcdefghijklmnopqrstuvwxyz

И можем выполнять команды в нормальном режиме с кириллической раскладкой. Правда, для ввода команд через <:> по-прежнему требуется переключить раскладку, что бесило.

Тогда я вспомнил, что редактор имеет собственную переключалку.

set keymap=russian-jcukenwin

Более детально прием описывался, например, здесь.

Вроде бы, проблема решилась: раскладка переключается только в режиме вставки, а команды вводятся латиницей. Но вновь проблема: встроенная переключалка ну очень сильно конфликтует с иксовой. Да и дефолтное сочетание <C-^> не особо эргономично.

Отключать иксовую и полностью полагаться на Vim? В принципе, на это можно было пойти, но очень не хотелось. Вызывать редактор, для набора кириллических названий в терминале показалось мне некоторым перебором. Какое-то время пользовался, путался и матерился.

Так дело не пойдет, снова в гугл. Нашел интересную статью Храброва Дмитрия DeXPeriX о написанном им и Алексеем Радковым плагине vim-xkbswitch.

Вкратце, плагин делает следующее: при переходе в нормальный режим, переключает общесистемную раскладку (через xkb-switch, который должен быть установлен в системе) на латиницу, запомнив текущую раскладку, а при переходе в режим вставки, переключает на запомненную. Сказать, что я был рад — не сказать ничего. Огромная благодарность авторам за то, чего так не хватало все эти годы.

Однако, в процессе эксплуатации, столкнулся-таки с некоторыми трудностями. Зашел как-то на свой компьютер по ssh:

$vim file.txt
Vim: Caught deadly signal SEGV
Vim: Finished.
zsh: segmentation fault  vim file.txt

Сразу на плагин не подумал, были мысли о посыпавшемся жестком диске, сбойнувшей файловой системе и тому подобных «приятных» вещах… В общем, xkb-switch при неустановленной переменной DISPLAY выпадает в segfault, а следом за ним и плагин, унося за собой и vim.

В качестве решения, можно проверить задана ли переменная и, только в случае успеха, активировать плагин. Выглядит это примерно так:

if $DISPLAY == "" 
	let g:XkbSwitchEnabled = 0
else
	let g:XkbSwitchEnabled = 1
	let g:XkbSwitchLib = '~/.local/lib/libxkbswitch.so'
	let g:XkbSwitchIMappings = ['ru']
endif 

После этого вылеты прекратились. Если хочется иметь функционал плагина при редактировании по ssh, то нужно подключаться с поддержкой X-forwarding'a, с ключами -X или -Y.

Надеюсь, статья поможет сохранить немного нервных клеток.

UPD: Сделал pull request разработчику.
Tags:
Hubs:
+27
Comments 31
Comments Comments 31

Articles