Vim В Windows И Переключение Раскладки Клавиатуры

УПД: Это «историческая» версия темы.

Новое решение проблемы с часами Здесь .

Проблема русской раскладки в Vim поднималась неоднократно.

Одно из решений можно увидеть Здесь Однако требуется некоторое привыкание к новой горячей клавише для переключения раскладки.

Также существует множество решений, предполагающих вызов системной утилиты для изменения раскладки, но под Windows мне не удалось найти такую утилиту, поэтому пришлось реализовывать ее самостоятельно.

По сути, это оказался консольный интерфейс для функций WinAPI. Чтобы задать новую раскладку окна, программа получает имя класса окна и двухбуквенный код языка.

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

Чтобы переключение работало в Windows, нужно добавить в _vimrc следующие строки:

  
   

fun! <SID>xkb_switch(mode) let cur_layout = system('dxlsw.exe -get VIM') if a:mode == 0 if cur_layout != 'en' call system('dxlsw.exe -set VIM en') endif let b:xkb_layout = cur_layout elseif a:mode == 1 if exists('b:xkb_layout') && b:xkb_layout != cur_layout call system('dxlsw.exe -set VIM '.

b:xkb_layout) endif endif endfun if executable('dxlsw.exe') autocmd InsertEnter * call <SID>xkb_switch(1) autocmd InsertLeave * call <SID>xkb_switch(0) endif

Также не забудьте поставить dxlsw.exe (3,5 КБ) где-то %ПУТЬ , например, в C:\Windows\System32 .

Если кому-то понадобится, есть 64-битная версия (5 КБ).

Источник (6,8 КБ) доступен по лицензии LGPL2. Достоинства: работает, переключает раскладку только в окне Vim. Недостатки: при вызове системной функции из GVim на короткое время открывается окно cmd.exe и окно GVim ненадолго теряет фокус.

УПД: По совету Хаброузера ивник Я создал DLL-версию переключателя языка.

Окно cmd не появляется, тормозов нет. _vimrc изменен на:

fun! <SID>lib_kb_switch(mode) let cur_layout = libcallnr('libdxlsw', 'dxGetLayout', 0) if a:mode == 0 if cur_layout != 1033 call libcallnr('libdxlsw', 'dxSetLayout', 1033) endif let b:lib_kb_layout = cur_layout elseif a:mode == 1 if exists('b:lib_kb_layout') && b:lib_kb_layout != cur_layout call libcallnr('libdxlsw', 'dxSetLayout', b:lib_kb_layout) endif endif endfun autocmd InsertEnter * call <SID>lib_kb_switch(1) autocmd InsertLeave * call <SID>lib_kb_switch(0)

Поместите файл DLL в каталог с EXE-файлом Gvim. Если сборка Vim 64-битная, используйте соответствующую библиотеку.

32-битная DLL: libdxlsw.dll , зеркало (3 КБ) 64-битная DLL: libdxlsw64.dll , зеркало (3,5 КБ) Код: libdxlsw.c , пастабина (1,9 КБ) Теги: #vim #Windows #Русская #раскладка клавиатуры #vim

Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.