Всем привет. Я достаточно давно пользуюсь редактором 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.
Надеюсь, статья поможет сохранить немного нервных клеток.
Автор: mtex