Проблема
Думаю многие из русскоговорящих пользователей 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
проблем нет, но протестировать, к сожалению, возможности нет.
ссылка на оригинал статьи http://habrahabr.ru/post/174741/
Добавить комментарий