Rusmode — решение проблемы с русской раскладкой

от автора

Проблема

Думаю многие из русскоговорящих пользователей Vim часто сталкивались с проблемой, что при переключении на Vim с почты/скайпа/браузера забывали переключить раскладку. Далее события развиваются следующим образом:

  1. У вас нет никакого map руских символов — Vim пищит, вы материтесь и переключаете раскладку;
  2. У вас есть map русских символов — скорее всего он кривой, команды не выполняются, Vim пищит, вы материтесь и меняете раскладку.

Очевидно, что map русских символов — не выход из положения.

Решение

Правильное решение — по нажатию русского символа в normal mode переключать раскладку на английский и ввести уже нажатую клавишу.

Реализация

Именно такое поведение я и захотел реализовать. Скрипт(github) получился очень простым и понятным.
Сначала мы проверяем, не загружен ли уже наш скрпит

if exists('g:loaded_rusmode') || &cp || version < 700 	finish endif let g:loaded_rusmode = 1 

Затем создадим функцию для переключения раскладки и ввода нажатого символа:

function ChangeLayout(key)     call system('osascript -e "tell application \"System Events\" to key code 49 using command down"')     if a:key ==? ':'         execute("normal! \<esc>:")     else         execute("normal!" . a:key)     endif endfunction 

И затем следует долгий и нудный nmap:

nmap <silent> <unique> й :call ChangeLayout('q')<CR> nmap <silent> <unique> ц :call ChangeLayout('w')<CR> nmap <silent> <unique> у :call ChangeLayout('e')<CR> ... nmap <silent> <unique> Ь :call ChangeLayout('M')<CR> nmap <silent> <unique> Б :call ChangeLayout('<')<CR> nmap <silent> <unique> Ю :call ChangeLayout('>')<CR> 

Я использую MacOS, поэтому решение было написано только для этой системы. Если уважаемым юзерам Linux нравится такой подход — очень жду Pull request’ов на гитхабе, самому написать

setxkbmap -layout us

проблем нет, но протестировать, к сожалению, возможности нет.

ссылка на оригинал статьи http://habrahabr.ru/post/174741/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *