Проблема
Думаю многие из русскоговорящих пользователей Vim часто сталкивались с проблемой, что при переключении на Vim с почты/скайпа/браузера забывали переключить раскладку. Далее события развиваются следующим образом:
- У вас нет никакого map руских символов — Vim пищит, вы материтесь и переключаете раскладку;
- У вас есть 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
проблем нет, но протестировать, к сожалению, возможности нет.
Автор: evindor