Какой самый удобный способ работы с разными клавиатурами в vim?


19

Иногда мне нужно писать греческие слова, но когда я использую греческую клавиатуру, удар, скажем, <C-p>будет пониматься как, <C-π>а не как команда, которую я намереваюсь. Это можно исправить с помощью :map <C-p> <C-π>. Могу ли я сделать это для всех писем без составления списка всех?

PS. Составление списка всего не дает идеального результата. Например, qесть ;на Gr. клавиатура, но мы не хотим отображать; к вопросу Кроме того, по какой-то причине ΖΖ (дзета дзета) не работает после :map Ζ Z. И команда, которую я определил, \lwне работает как \λς.


2
Я думаю, что картографирование - не самый лучший способ: возможно, то, что вы ищете, это langmapвариант (см. Документ, который включает пример греческого макета). Эта опция фактически была сделана, чтобы помочь справиться с нелатинскими клавиатурами, такими как греческая или кириллическая. Это позволяет вам определять пары символов, которые будут обычно интерпретироваться в режиме вставки, но будут заменены в других режимах, возможно, это вам поможет.
statox

@statox: Спасибо! Я пытался использовать бывший. но ничего не случилось В справке говорится, что vim должен быть соблюден с опцией + langmap. Есть ли простой способ проверить, было ли это? Я использую версию, которая поставляется с Mac OS.
зубочистка

1
Вы можете использовать, :echo has('langmap')если у вас есть, у 1вас есть, если у 0вас нет.
statox

@statox: Спасибо! Я обновил с brew install vim --override-system-viи :echo has &cтеперь возвращает 1. ZZ работает. Проблема с \lv& c остается.
Зубной рот

Я не понимаю эту :echo has &cчасть, я не понимаю, как она связана с тем, что langmapпосле того, как вы скомпилировали vim, langmapвы должны указать сопоставления :set langmap=ΑA,ΒB,ΨC [...]в вашем vimrc.
statox

Ответы:


6

Я бы порекомендовал keymap, который может решить вашу проблему. Поместите это в свой vimrc

" set keymap=greek_utf-8
set iminsert=0
set imsearch=-1

отключить греческий язык по умолчанию. Вы можете включить или выключить опцию (греческий), используя <ctrl>+^(вы также можете использовать <ctrl>+6, он отображается на ключе, а не на символе) в режиме вставки и режиме замены (не работает в Нормальный режим). Для автоматического отключения при выходе из режима вставки вы можете использовать

inoremap <ESC> <ESC>:set iminsert=0<CR>

Подробнее об этих

:h iminsert :h keymap :h imsearch :h i_CTRL-^


РЕДАКТИРОВАТЬ ко второму комментарию:

Вы можете попробовать это, чтобы автоматически включить греческий язык, если входите в режим вставки (и заменить режим), и автоматически отключить, если вы выходите (тогда вам не нужно отображение, упомянутое ранее).

augroup Greek
    au InsertEnter * set iminsert=1
    au InsertLeave * set iminsert=0
augroup END

Действительно ли необходимо использовать политонный греческий? Мне кажется, что нужно только правильное кодирование, а затем использовать встроенный вход MacOS X. Но это, наверное, просто мое неправильное впечатление. Вы также можете переключиться на многогранную греческую клавиатуру в MacOS X (и выучить ее, но я думаю, что это не то, что вы ищете :-) Что касается отставания от can, может быть какое-то отображение, попробуйте найти его :map >a, и если есть , разархивируйте его :unmap >a. Как не греческий и не MacOs пользователь, я уже в своем уме. Извините и удачи!
Рюичиро

10

Как я сказал в комментариях, отображения не предназначены для того, что вы хотите делать. Интересный вариант для этого варианта использования langmap.

Эта опция позволяет сохранить поведение вашей клавиатуры в режиме вставки и изменить ее поведение в других режимах.

Чтобы использовать его, нужно скомпилировать Vim +langmap, вы можете проверить, включена echo has('langmap')ли эта опция : если команда вернет 1опцию, включена, иначе вам нужно будет настроить ее с включенной опцией (чтобы узнать, как это сделать, это другой вопрос).

Когда эта опция включена, опция принимает пары символов, например set langmap += à@, позволит вам добавить àв буфер, когда вы находитесь в режиме вставки, и вы вводите, àно ввод àв обычном режиме фактически вызовет @(этот пример может быть полезен на azerty клавиатуры для облегчения работы с макросами).

Чтобы использовать langmap на греческом языке, вы можете следовать примеру, приведенному в :h 'langmap'добавлении этой строки к вашему vimrc (Копирование этой строки отсюда не может быть хорошей идеей, так как я действительно не уверен в кодировке, вероятно, выдергивание строки непосредственно из файла справки безопаснее) :

:set langmap=ΑA,ΒB,ΨC,ΔD,ΕE,ΦF,ΓG,ΗH,ΙI,ΞJ,ΚK,ΛL,ΜM,ΝN,ΟO,ΠP,QQ,ΡR,ΣS,ΤT,ΘU,ΩV,WW,ΧX,ΥY,ΖZ,αa,βb,ψc,δd,εe,φf,γg,ηh,ιi,ξj,κk,λl,μm,νn,οo,πp,qq,ρr,σs,τt,θu,ωv,ςw,χx,υy,ζz

Теперь из того, что я понимаю в ваших комментариях, остается проблема, когда вы пытаетесь использовать предопределенные команды: при вводе команды поведение режима вставки будет запускаться вместо поведения, определенного в langmap. К сожалению, я не уверен, что у меня есть хорошее решение для этого. Одна идея может состоять в том, чтобы переопределить команды, например, так:

command λς lw

Таким образом, когда вы введете команду, λςVim будет выполняться, lwно я вижу несколько недостатков этого метода:

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

Так что, возможно, плагин, предложенный @Alexander Myshov в его ответе на этот вопрос, может быть полезен (поскольку я никогда не пробовал ни одного из них, я не знаю, решают ли они проблему, но кажется, что они это делают).


1

Я регулярно печатаю на английском и шведском языках. Шведский - это меньшая проблема, чем греческий, потому что он расширяет английский алфавит всего несколькими символами, но я думаю, что мое решение можно перенести на греческий.

Я привык переключаться с помощью переключателя системной клавиатуры моей ОС. Проблема с этим, как отметил OP, заключается в том, что он прерывает целый набор команд, поскольку в обычном режиме каждая клавиша посылает Vim другой сигнал с неанглийской клавиатуры. В шведской раскладки клавиатуры, кроме того, целая куча не-буквенных символов перемещены , чтобы освободить место для новых персонажей å, äи ö. Например, }набирается с помощью Alt-Shift-9 (соответствует открывающей скобке на английской клавиатуре), а обратная косая черта - с помощью Alt-Shift-7. Таким образом, переключение на ванильную шведскую раскладку клавиатуры для режима вставки вызывает целую кучу головных болей.

Мое решение состояло в том, чтобы переназначить соответствующие ключи только в режиме вставки и обернуть эти сопоставления в функцию, чтобы я мог легко переключаться назад и вперед. Код ниже, как я сделал это в моем .vimrc. Это только добавляет нужные мне символы в положение, которое они имеют в шведской раскладке клавиатуры, оставляя все остальное. Чтобы ввести символы, которые маскируются ими ( ;, :, [, {, ", и '), я просто нажмите клавишу дважды. К счастью, только глупые люди даже должны напечатать дваäподряд. (Если это двойное нажатие не подходит, вы можете сопоставить их с Ctrl или что-то в этом роде. Основной принцип заключается в том, что маскированные символы остаются на своих местах на клавиатуре, но одно нажатие клавиши удаляется из реализации. Я считаю, что это намного проще чем перемещать их.) Что означает, что, когда я хочу печатать на шведском языке, я нажимаю <Leader>s, который переключается на эти сопоставления и применяет шведскую проверку орфографии. Переключаться обратно я делаю <Leader>e.

Теперь, для греческого, это будет включать в себя сопоставления для всего алфавита, что на самом деле меньше хлопот, чем кажется, как только вы поняли принцип. Сложнее было бы отключить все эти изменения при переключении на английский. Возможно, кто-то может придумать отличный способ сделать это.

Я планирую сделать функцию вставки, аналогичную приведенной ниже, для арабского языка, другого языка, который я часто печатаю. Я мог бы вернуться сюда, чтобы сообщить о процессе.

" Switch to Swedish
function! SweType()
  set spelllang=sv
  inoremap ; ö
  inoremap ;; ;
  inoremap : Ö
  inoremap :: :
  inoremap [ å
  inoremap { Å
  inoremap ' ä
  inoremap '' '
  inoremap " Ä
  inoremap "" "
  inoremap [[ [
  inoremap {{ {
endfunction
nmap <Leader>s :<C-U>call SweType()<CR>


" Switch to English
function! EngType()
  set spelllang=en_us
  inoremap ; ;
  iunmap ;;
  inoremap : :
  iunmap ::
  inoremap [ [
  iunmap [[
  inoremap { {
  iunmap {{
  inoremap ' '
  iunmap ''
  inoremap " "
  iunmap ""
endfunction
nmap <Leader>e :<C-U>call EngType()<CR>

1
Я могу ошибаться, но я думаю, что ваш ответ позволяет легко получить неанглийские символы в режиме вставки, в то время как проблема OP состояла в том, чтобы легко получить английские символы в режимах, отличных от режима вставки. Я не уверен, что ваш ответ решает начальную проблему. Тем не менее, идея функции включения / выключения отображений довольно интересна.
statox

@statox Ну, возможно, я неправильно понял вопрос, но если проблема заключается в том, чтобы легко вставлять неанглийские символы в режиме вставки при сохранении функций нормального режима, я думаю, что мой вопрос по крайней мере пытается решить эту проблему.
Андреас

Извините, я не хотел обидеть: я указывал, что между вопросом и вашим ответом может быть разрыв, но, конечно, вы пытаетесь решить проблему, и, как я уже сказал, мне действительно нравится идея включения функций. и отключение сопоставлений. Я действительно не отрицал ваш ответ, и мне очень жаль, что это звучало так.
statox

1
@statox Без обид. И если бы вы отрицали мой ответ, все было бы в порядке.
Андреас

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.