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


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

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

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

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

1 ответ1

0

От :h mapmode-n:

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

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

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

:map    {lhs} {rhs}     |mapmode-nvo|       *:map*
:nm[ap] {lhs} {rhs}     |mapmode-n|     *:nm* *:nmap*
:vm[ap] {lhs} {rhs}     |mapmode-v|     *:vm* *:vmap*
:xm[ap] {lhs} {rhs}     |mapmode-x|     *:xm* *:xmap*
:smap   {lhs} {rhs}     |mapmode-s|         *:smap*
:om[ap] {lhs} {rhs}     |mapmode-o|     *:om* *:omap*
:map!   {lhs} {rhs}     |mapmode-ic|        *:map!*
:im[ap] {lhs} {rhs}     |mapmode-i|     *:im* *:imap*
:lm[ap] {lhs} {rhs}     |mapmode-l|     *:lm* *:lmap*
:cm[ap] {lhs} {rhs}     |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')

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .