Pull to refresh

Comments 17

Надеюсь, это решит данную, довольно старую проблему. :)
Как раз сегодня писал нечто похожее. Жаль, вы просто захардкодили значения клавиш — не будет работать для других раскладок.
В GTK для кнопок есть понятия keyval и hardware_keycode. Значение keyval разное для «f» и «а», например; hardware_keycode же не меняется при переключении раскладок. Возможно, нечто похожее есть и для XKB?
Захардкодили значения раскладки по умолчанию. Плагин поддерживает загрузку чармапов из файла — введите один раз свою и всё будет прекрасно работать!
Дополнение от Алексея:

Название 'ru' в g:XkbSwitchImappings = ['ru'] очень условно — в принципе оно может быть названо 'blahblah' или как угодно — важно что мы его используем и что во что оно переводит. Это означает что для одного языка можно настроить сразу много вариантов раскладки. Еще это означает, что этот механизм можно использовать вообще для любых транслейшнов инсерт маппингов, не обязательно связанных с задачей русификации/германизации и т.п., а вообще для каких-то своих произвольных целей.
Hardware-code — это очень сильный механизм, с его помощью можно в принципе настроить клавиши для любых режимов — в т.ч. для нормального и т.п., но в vime почему-то этого не сделали, наверное есть на то причина.
Плюс получится тот же самый бездумный автоматизм, который добавит проблемы, вроде той, которую я описал для немецкой раскладки (там "=" заменено на "+" и из-за этого не хочет работать )
Так что я за хардкод плюс пользовательские настройки через файл или vimrc :)
К тому же vim в маппингах исходно манипулирует понятием символов, а не hardware кейкодов. Это опять связано с той же самой проблемой всеобщей глобальной локализацией, с помощью которой они бы могли и команды в нормальном режиме локализовать, но не сделали этого.
Не за что. Самим не хватало, поэтому и сделали :-)
Я для себя проблему с русским языком в vim частично решил так:

set langmap=ёйцукенгшщзхъфывапролджэячсмитьбюЁЙЦУКЕHГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮ;`qwertyuiop[]asdfghjkl\\;'zxcvbnm\\,.~QWERTYUIOP{}ASDFGHJKL:\\"ZXCVBNM<> nmap Ж : " yank nmap Н Y nmap з p nmap ф a nmap щ o nmap г u nmap З P

На 90% лично мне этого хватает.

upd. Хабр некорректно распарсил, тут вот нормально
Это великолепно. Вот и весь плагин.
А мне больше нравится «нативный» вариант — выставить
set keymap=russian-jcukenwin
и использовать i_CTRL-^ для переключения раскладки.

Мечта только одна — выставить то же сочетание клавиш в X-ах, и научить xkb не переключаться, когда активно окно Vim'а, а передавать сигнал ему. Если кто знает как это сделать «малой кровью», буду очень благодарен.
Меня тоже больше порадовал бы нативный вим-вариант. Но привыкать к новому хоткею для переключения раскладки — это выше моих сил.
Если есть желание получить работающий плагин под другую ОС (например, под Mac OS), то нужно сделать Vim-совместимую библиотеку. У кого есть желание и возможность — пишите в личку.
Есть вот такой плагин для OS X KeyboardLayoutSwitcher. Надо бы обобщить с вашим, какой интерфейс должна предоставлять библиотека переключения языка (тыкните носом, если где-то уже описано)?
По большому счёту нужны всего 2 функции: 1) Которая возвращает раскладку окна вима (или текущего окна) 2) Которая умеет для этого окна раскладку устанавливать. Обе функции принимают и возвращают один аргумент (можно либо строки, либо int'ы). Пример XKbSwitchApi.cpp, смотрите секцию 'extern «C»'.
ArchLinux, VIM.

Выставил:
let g:XkbSwitchEnabled = 1 let g:XkbSwitchLib = '/usr/lib/libxkbswitch.so' let g:XkbSwitchIMappings = ['ru']

$ xkb-switch -l us ru

Перезапускаю VIM.
1) Вхожу в режим редактирования,
2) Включаю русский
3) Выхожу из режима редактирования не переключая языка

Пытаюсь сделать хоть что-то `dd` не пашет, двоеточие не пашет. Но при этом в режиме вставки работают горячие клавиши. Например, ctrl+t, что в русской, что в английской раскладке сдвигает текст.
<C-t> в разных раскладках — это собственная возможность X’ов (при условии, что X’ам сообщили о нескольких раскладках; с некоторыми переключалками может не работать).
Установил под MacVim

let g:XkbSwitchEnabled = 1
let g:XkbSwitchLib = '/usr/local/lib/libInputSourceSwitcher.dylib'

Переключение срабатывает в графическом MacVim, но не работает в терминальной версии. Пробовал в iTerm2 и в стандартном терминале.
MacVim устанавливал через Homebrew с ключем --override-system-vim

Подскажите, у кого срабатывает переключение в терминальном vim, какие у вас настройки?
В сочетании с этим нативным переключателем, все заработало.
Sign up to leave a comment.

Articles