Pull to refresh

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

Reading time2 min
Views8.6K

Проблема


Думаю многие из русскоговорящих пользователей 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
проблем нет, но протестировать, к сожалению, возможности нет.
Tags:
Hubs:
Total votes 15: ↑15 and ↓0+15
Comments21

Articles