Pull to refresh

Плагин для Vim, который обеспечивает удобное переключение раскладки клавиатуры в Mac OS X

Reading time3 min
Views3.5K

Предисловие


Совсем недавно, буквально пару недель назад, я решил перейти на Vim. Меня привлекла потенциальная мощь этого редактора: настроив всё правильным образом, можно получить полноценную IDE, которая работает именно так, как тебе надо. К тому же, куча всевозможных сочетаний клавиш позволяют создавать и редактировать тексты со сверхзвуковой скоростью, достаточно лишь один раз запомнить необходимые комбинации. Плюс, можно добавить свои.

Единственное, что меня напрягало, — необходимость постоянного переключения раскладки для того, чтобы полноценно работать в Vim. Да, конечно, можно делать маппинги для клавиш, но это далеко не всегда работает.

История создания


Первое решение мне подсказал kossnocorp. Суть этого решения состояла в том, чтобы использовать маленькое приложение, написанное на Objective-C, которое будет активировать раскладку США в нужный момент (например, при выходе из режима ввода). Даже был исходный код этой программки, которым с kossnocorp поделился хабраюзер labria. Но это решение меня не устраивало: я использую типографскую раскладку Ильи Бирмана. Тогда я решил написать своё решение, взяв за основу ту же самую идею.

Сам я не Objective-C программист, но, вооружившись неплохими знаниями C и отличнейшей документацией от Apple, начал копать. Сказано — сделано. Убив полдня, я всё-таки добился желаемого результата. Если первоначальное решение железно переключало раскладку именно на раскладку США, находя её по имени, то моё решение обладало гибкостью, оно оперировало не именем раскладки, а её так называевым индексом. Мы просто берём установленные раскладки (в моём случае это английская раскладка США и русская и английская раскладки Бирмана) и выбираем нужную по номеру.

Затем, естественно, последовал черёд плагина для Vim. Тут всё довольно просто, используя autocmd, можно вызывать свои функции для определённых событий (например, тот же самый InsertLeave — выход из режима ввода).

Однако, в процессе изучения документации по VimL я понял, насколько мощен этот язык. В нём есть практически всё: событийная модель, объекты, списки, функции для работы со списками, регулярные выражения, математические функции и многое другое. И тогда мне в голову пришла мысль, почему бы не запоминать раскладку клавиатуры при потере фокуса ввода Vim?

Результат


В итоге получился удобный плагин, который умеет переключать раскладку:
  • При запуске Vim;
  • При выходе из режима ввода;
  • Во врема входа в командный режим;
  • При двойном нажатии <Esc> в нормальном и командном режимах.
И самое вкусное: плагин запоминает раскладку, если Vim потерял фокус ввода, и переключается на неё при возврате фокуса (например, если вы отвлеклись на мессенджер или что-то ещё).

Ах да, при всём при этом плагин хранит раскладку отдельно для каждого таба. Ну разве не здорово?

Установка и настройка


Исходный код самого плагина лежит на 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 будет отключена.
Tags:
Hubs:
+23
Comments76

Articles