Предисловие
Совсем недавно, буквально пару недель назад, я решил перейти на Vim. Меня привлекла потенциальная мощь этого редактора: настроив всё правильным образом, можно получить полноценную IDE, которая работает именно так, как тебе надо. К тому же, куча всевозможных сочетаний клавиш позволяют создавать и редактировать тексты со сверхзвуковой скоростью, достаточно лишь один раз запомнить необходимые комбинации. Плюс, можно добавить свои.
Единственное, что меня напрягало, — необходимость постоянного переключения раскладки для того, чтобы полноценно работать в Vim. Да, конечно, можно делать маппинги для клавиш, но это далеко не всегда работает.
История создания
Первое решение мне подсказал kossnocorp. Суть этого решения состояла в том, чтобы использовать маленькое приложение, написанное на Objective-C, которое будет активировать раскладку США в нужный момент (например, при выходе из режима ввода). Даже был исходный код этой программки, которым с kossnocorp поделился хабраюзер labria. Но это решение меня не устраивало: я использую типографскую раскладку Ильи Бирмана. Тогда я решил написать своё решение, взяв за основу ту же самую идею.
Сам я не Objective-C программист, но, вооружившись неплохими знаниями C и отличнейшей документацией от Apple, начал копать. Сказано — сделано. Убив полдня, я всё-таки добился желаемого результата. Если первоначальное решение железно переключало раскладку именно на раскладку США, находя её по имени, то моё решение обладало гибкостью, оно оперировало не именем раскладки, а её так называевым индексом. Мы просто берём установленные раскладки (в моём случае это английская раскладка США и русская и английская раскладки Бирмана) и выбираем нужную по номеру.
Затем, естественно, последовал черёд плагина для Vim. Тут всё довольно просто, используя autocmd, можно вызывать свои функции для определённых событий (например, тот же самый InsertLeave — выход из режима ввода).
Однако, в процессе изучения документации по VimL я понял, насколько мощен этот язык. В нём есть практически всё: событийная модель, объекты, списки, функции для работы со списками, регулярные выражения, математические функции и многое другое. И тогда мне в голову пришла мысль, почему бы не запоминать раскладку клавиатуры при потере фокуса ввода Vim?
Результат
В итоге получился удобный плагин, который умеет переключать раскладку:
- При запуске Vim;
- При выходе из режима ввода;
- Во врема входа в командный режим;
- При двойном нажатии <Esc> в нормальном и командном режимах.
Ах да, при всём при этом плагин хранит раскладку отдельно для каждого таба. Ну разве не здорово?
Установка и настройка
Исходный код самого плагина лежит на GitHub. Всё как обычно, качаем исходный код в .zip, разархивируем и кладём всё добро в ~/.vim.
Там же, на GitHub, можно найти исходный код вспомогательного приложения. Он может понадобиться для тех, кто до сих пор использует Mac OS X Leopard, им придётся всё компилировать самим. Это несложно, в исходниках всё подробно описано.
В плагине задаётся индекс раскладки по умолчанию равным нулю:
let g:defaultInputSourceIndex = 0
Если вы, как и я, используете раскладку Бирмана или какую-либо другую, то вам придётся поменять значение индекса. Выяснить его очень просто: достаточно переключиться на нужную раскладку и запустить вспомогательное приложение (~/.vim/bin/KeyboardLayoutSwitcher). При этом откроется окно терминала, в котором и будет нужный номер:

После этого открываем ~/.vimrc и добавляем нужную строчку:
let g:defaultInputSourceIndex = nГде n — полученный номер (на скриншоте это 1).
Приятного вам кодирования в Vim.
Update: по просьбе хабраюзера cypok вынес опцию «самого вкусного». Если в ~/.vimrc добавить строчку:
let g:kls_focusSwitching = 0то функция запоминания и восстановления раскладки при потери и восстановлении фокуса ввода у Vim будет отключена.