Как я могу создать режим псевдо-вставки с другой раскладкой?

9

Я нахожусь в несколько необычном положении использования двух разных раскладок клавиатуры на регулярной основе ( Programmers-Dvorak и Turkish-F ). Эти макеты сильно отличаются друг от друга, и я могу быть опытным в VIM только с одним набором мышечных воспоминаний. Я довольно хорошо разбираюсь в командах vim в раскладке Dvorak, но практически невозможно использовать, если моя клавиатура находится в раскладке Turkish-F. К сожалению, я регулярно редактирую файлы на английском, турецком и даже смешанных языках. Мое знание таково, что я могу довольно хорошо набирать любой язык на соответствующей раскладке клавиатуры, но мой мозг отказывается соединять их и набирать даже несколько букв слова на турецком языке из раскладки Дворак или наоборот.

У меня есть привязки двух клавиш для изменения макета в Xorg, но даже это оставляет мне неловкий рабочий процесс в vim при редактировании файлов на разных языках:

<vim commands…>i<switch to tr>…content…<escape><switch to en><vim commands…>

Я хотел бы иметь возможность сократить это до чего-то вроде:

<vim commands…><leader>i…content…<escape><vim commands…>

... такой, что использование <leader>iустанавливает множество :imapзначений для эмуляции турецкой раскладки без изменения раскладки системной клавиатуры. В то же время iпереключился бы в режим вставки, но без дополнительных :imapзначений. Сами значения просты, мне просто нужно сопоставление алфавита примерно так:

:imap a u
:imap A U
:imap o i
:imap O İ
"etc.

Вопрос заключается в том , как установить два режима вставки, один нормальный режим вставки и один псевдо вставки режим , который идентичен для связки отображений , кроме, и как я могу вызвать эти режимы с <leader>i, <leader>aи т.д.?

Калеб
источник
1
Вот другая идея: у вас есть InsertEnterи InsertLeaveautocmds, которые вы можете использовать для автоматического переключения раскладок. В частности, InsertLeaveвы можете проверить, является ли он турецким, если он есть, переключиться на Дворжак, установить флаг, и при вводе вставки снова переключиться обратно на турецкий, если это было в последний раз, когда вы выходили из режима вставки.
Мартин Турной
@Carpetsmoker Я не понимаю, как это решает мои проблемы. Даже если было что-то, что нужно «проверить» (я не уверен, что вы думаете, я бы проверил там… отчасти проблема в том, что я перебираю слово за словом), одна из причин, по которой я я думал в том же духе, :imapчто он будет работать даже в удаленном сеансе SSH или когда $DISPLAYне установлено иное.
Калеб

Ответы:

7

В Vim есть что-то подобное в виде раскладок клавиш . От :help mbyte-keymap:

When the keyboard doesn't produce the characters you want to enter in your
text, you can use the 'keymap' option.  This will translate one or more
(English) characters to another (non-English) character.  This only happens
when typing text, not when typing Vim commands.  This avoids having to switch
between two keyboard settings.

Только в режиме вставки Caps Lock описывает такое отображение для эмуляции Caps Lock; Как вы можете видеть, файл сопоставлений аналогичен тому, что вы указали в своем вопросе.

Вы включаете этот параметр через :set iminsert=1или динамически через i_CTRL-^. Это также работает /searchс 'imsearch'опцией.

Инго Каркат
источник
3

Ответ Инго Карката, похоже, был верным решением и решил мою ситуацию. Однако вот несколько более подробных инструкций для тех, кто только начинает работать с функциями языковой карты vim.

Во-первых, вам нужен файл языковой карты. Как и в примере с Caps Lock, вы захотите добавить что-то вроде следующего ~/.vim/keymap/dvorak2turkishf.vim(скачайте мое полное отображение из Githu b):

let b:keymap_name = "dvorak2turkishf"
loadkeymap
; f
, g
. ğ
p ı
y o
f d
g r
" etc...

После этого остается настроить привязки, чтобы активировать его в некоторых случаях, но не в других. Вы хотите добавить что-то в свой ~/.vimrcфайл.

Сначала свяжите таблицу поиска с входной:

set imsearch=-1

Затем установите, какая раскладка будет использоваться для режима ввода на другом языке:

set keymap=dvorak2turkishf

Отключите режим альтернативного ввода, чтобы по умолчанию не было никаких изменений:

set iminsert=0

Настройте автоматическую команду для запуска при выходе из режима вставки, чтобы отключить альтернативный языковой переключатель:

autocmd InsertLeave * set iminsert=0

Добавьте привязки для всех различных способов, которыми вы можете оказаться в режиме ввода на другом языке, чтобы при использовании <leader>(Обычно \) перед ними включалось переключение языковой карты перед переключением:

nnoremap <leader>i :set iminsert=1<Cr>i
nnoremap <leader>I :set iminsert=1<Cr>I
nnoremap <leader>a :set iminsert=1<Cr>a
nnoremap <leader>A :set iminsert=1<Cr>A
nnoremap <leader>c :set iminsert=1<Cr>c
nnoremap <leader>C :set iminsert=1<Cr>C
nnoremap <leader>r :set iminsert=1<Cr>r
nnoremap <leader>R :set iminsert=1<Cr>R
nnoremap <leader>o :set iminsert=1<Cr>o
nnoremap <leader>O :set iminsert=1<Cr>O

Установите другой цвет курсора, когда карта включена:

:highlight Cursor guifg=NONE guibg=Green
:highlight lCursor guifg=NONE guibg=Cyan

Все вместе, вот что изменилось в моем конфиге . В заключение: если вы находитесь в режиме вставки, вы можете включать и выключать опцию языковой карты <ctrl>+^.

Калеб
источник