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

в 17:10, , рубрики: vim, vim plugins, метки: ,

Проблема

Думаю многие из русскоговорящих пользователей 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

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

Автор: evindor

Источник


* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js