Пользователь
0,0
рейтинг
6 апреля 2013 в 21:50

Разработка → Vim и переключение раскладки клавиатуры

VIM*
Все команды Vim нужно вводить на английском языке. Если основной текст вводится на каком-либо другом языке, то это представляет из себя проблему, т.к. нужно часто переключать раскладку. Одно из решений представлено тут, однако оно заставляет привыкать к новой горячей клавише для переключения раскладки. Так же существует множество платформенно-зависимых решений с вызовом тех или иных утилит. Целью плагина vim-xkbswitch является предоставить единое поведение для многих операционных систем и языков.

Предысторию разработки плагина с моей стороны можно посмотреть тут, со стороны Алексея тут и тут.

Плагин использует платформенно-зависимые библиотеки для смены раскладки средствами операционной системы. На данный момент поддерживаются:

  1. UNIX / X Server через библиотеку xkb-switch
  2. Windows 32/64bit, для которой пришлось сделать свой велосипед
  3. Mac OS X через Xkbswitch-macosx


Так что кроме непосредственной установки плагина в Vim необходимо эти библиотеки скачать и указать в конфиге Vim, откуда эти библиотеки загружать. Например, под Windows работающий функционал можно получить так:

  1. Скачать и установить плагин: отсюда либо отсюда
  2. Скачать библиотеку переключения языка (бинарные файлы для 32-х бит и для 64-х бит, около 5kb) и скопировать её в корневую директорию вима
  3. Добавить в vimrc следующие строки:
    let g:XkbSwitchEnabled = 1 
    let g:XkbSwitchIMappings = ['ru']


Приближаемся к ещё одной интересной возможности плагина — добавление локализованных горячих клавиш. Например, если я в режиме редактирования нажму <C-N>v, то у меня отобразится NerdTree. Но если я редактирую текст на русском языке, то будет нажато "<C-N>м" и плагин, естественно, не запустится. Однако если опция плагина «g:XkbSwitchIMappings» установлена, то плагин переберёт все маппинги режима редактирования с создаст аналогичные локализованные, т.е. добавит для меня "<C-N>м".

По умолчанию из коробки поддерживаются маппинги только для русского языка. Однако плагин умеет загружать языковые карты из файла, что позволит создать локализованные imap'ы для любого языка. Под Windows это может помочь сделать charmapgen.

Если есть желание получить работающий плагин под другую ОС, то нужно сделать Vim-совместимую библиотеку. У кого есть желание и возможность — пишите в личку.
Храбров Дмитрий @DeXPeriX
карма
23,5
рейтинг 0,0
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама

Самое читаемое Разработка

Комментарии (17)

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

        Название 'ru' в g:XkbSwitchImappings = ['ru'] очень условно — в принципе оно может быть названо 'blahblah' или как угодно — важно что мы его используем и что во что оно переводит. Это означает что для одного языка можно настроить сразу много вариантов раскладки. Еще это означает, что этот механизм можно использовать вообще для любых транслейшнов инсерт маппингов, не обязательно связанных с задачей русификации/германизации и т.п., а вообще для каких-то своих произвольных целей.
        Hardware-code — это очень сильный механизм, с его помощью можно в принципе настроить клавиши для любых режимов — в т.ч. для нормального и т.п., но в vime почему-то этого не сделали, наверное есть на то причина.
        Плюс получится тот же самый бездумный автоматизм, который добавит проблемы, вроде той, которую я описал для немецкой раскладки (там "=" заменено на "+" и из-за этого не хочет работать )
        Так что я за хардкод плюс пользовательские настройки через файл или vimrc :)
        К тому же vim в маппингах исходно манипулирует понятием символов, а не hardware кейкодов. Это опять связано с той же самой проблемой всеобщей глобальной локализацией, с помощью которой они бы могли и команды в нормальном режиме локализовать, но не сделали этого.
  • 0
    спасибо большое, очень не хватало
    • 0
      Не за что. Самим не хватало, поэтому и сделали :-)
  • 0
    Я для себя проблему с русским языком в 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. Хабр некорректно распарсил, тут вот нормально
    • 0
      Это великолепно. Вот и весь плагин.
  • +2
    А мне больше нравится «нативный» вариант — выставить
    set keymap=russian-jcukenwin
    и использовать i_CTRL-^ для переключения раскладки.

    Мечта только одна — выставить то же сочетание клавиш в X-ах, и научить xkb не переключаться, когда активно окно Vim'а, а передавать сигнал ему. Если кто знает как это сделать «малой кровью», буду очень благодарен.
    • +1
      Меня тоже больше порадовал бы нативный вим-вариант. Но привыкать к новому хоткею для переключения раскладки — это выше моих сил.
  • 0
    Если есть желание получить работающий плагин под другую ОС (например, под Mac OS), то нужно сделать Vim-совместимую библиотеку. У кого есть желание и возможность — пишите в личку.
    Есть вот такой плагин для OS X KeyboardLayoutSwitcher. Надо бы обобщить с вашим, какой интерфейс должна предоставлять библиотека переключения языка (тыкните носом, если где-то уже описано)?
    • 0
      По большому счёту нужны всего 2 функции: 1) Которая возвращает раскладку окна вима (или текущего окна) 2) Которая умеет для этого окна раскладку устанавливать. Обе функции принимают и возвращают один аргумент (можно либо строки, либо int'ы). Пример XKbSwitchApi.cpp, смотрите секцию 'extern «C»'.
  • 0
    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, что в русской, что в английской раскладке сдвигает текст.
    • 0
      Создал задачу на гитхабе: github.com/lyokha/vim-xkbswitch/issues/1
    • 0
      <C-t> в разных раскладках — это собственная возможность X’ов (при условии, что X’ам сообщили о нескольких раскладках; с некоторыми переключалками может не работать).
  • 0
    Установил под MacVim

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

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

    Подскажите, у кого срабатывает переключение в терминальном vim, какие у вас настройки?
    • 0
      В сочетании с этим нативным переключателем, все заработало.

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.