VIM несколько конкретных отображений

293
omnesia

Каков наилучший способ указать несколько режимов для карты в vim?


Я знаю, что nmap x yсрабатывает у при получении х, когда в normal mode,

imap x yзапускает y при получении x, когда в insert mode, и так далее.

Скажем, я специально хочу эти два режима. Тогда я не могу использовать map x y.

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

0

1 ответ на вопрос

0
DJMcMayhem

От :h mapmode-n:

Есть шесть наборов отображений

  • Для нормального режима: при наборе команд.
  • Для визуального режима: при наборе команд, когда выделена визуальная область.
  • Для режима выбора: аналогично визуальному режиму, но ввод текста заменяет ввод текста.
  • Для режима ожидания оператора: когда оператор находится в режиме ожидания (после «d», «y», «c» и т. Д.). Смотрите ниже: | omap-info |.
  • Для режима вставки. Они также используются в режиме замены.
  • Для режима командной строки: при вводе команды «:» или «/».

Существует много разных способов составления карт. Если вы :h map, вы увидите, какие режимы различные команды отображают режимы для:

:map |mapmode-nvo| *:map* :nm[ap] |mapmode-n| *:nm* *:nmap* :vm[ap] |mapmode-v| *:vm* *:vmap* :xm[ap] |mapmode-x| *:xm* *:xmap* :smap |mapmode-s| *:smap* :om[ap] |mapmode-o| *:om* *:omap* :map! |mapmode-ic| *:map!* :im[ap] |mapmode-i| *:im* *:imap* :lm[ap] |mapmode-l| *:lm* *:lmap* :cm[ap] |mapmode-c| *:cm* *:cmap* 

Как видите, :mapговорит mapmode-nvo, что означает нормальный, визуальный и режим ожидания оператора . Это причина того, что map x yне работает в обычном режиме. Просматривая этот список, вы можете увидеть, что ни один из них не имеет mapmode-in, так что нет единого способа сделать это. Так что вам нужно будет сделать nmap x yи imap x y. Или, если вы хотите, чтобы он применялся к каждому режиму map x y, и map! x y.

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

Если вы действительно делаете много отображений, вы можете сделать это:

function! DoubleMap(x, y) exec "nmap ".x." ".y exec "imap ".x." ".y endfunction 

затем

imap x y nmap x y imap foo bar nmap foo bar imap blah spam nmap blah spam 

становится

call DoubleMap('x', 'y') call DoubleMap('foo', 'bar') call DoubleMap('blah', 'spam') 

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

Спасибо за этот подробный ответ. Жаль, что для этой комбинации не существует режима карты. Похоже, мне придется больше узнать о vimscript в целом. Использование функции кажется хорошим вариантом для простых привязок. omnesia 6 лет назад 0
@omnesia Рад, что смог помочь! :) Кстати, есть также [vi & vim site] (https://vi.stackexchange.com), который обычно лучше подходит для вопросов, касающихся vim. DJMcMayhem 6 лет назад 0