Vim - отображение ключа на функцию, которая делает что-то еще плюс оригинальную функцию этой клавиши - PullRequest
0 голосов
/ 28 сентября 2019

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

Моя первая попытка состояла в том, чтобы отобразить ключ j следующим образом:

nn j :<C-U>execute "call MyFun(" . v:count . ")"<CR>

(как вы можете видеть, я собираюсь сделать Поведение j зависит от счетчика, который к нему предшествует) и определить соответствующую функцию MyFun:

fu! MyFun(count)
  " do more stuff based on a:count
  normal j
endf

, которая является ошибочной, поскольку теперь она нажимает j приводит к ошибке E169: Command too recursive, поскольку нерекурсивность nnoremap, если мой вывод верен, применяется к «буквальному» содержанию {rhs} отображения, а не ко всему, что «внутри»это (другими словами, тело function использует значение j в тот момент, когда оно вызывается, вызывая рекурсию в бесконечности).

Поэтому я попробовал следующее

nn , j
nn j :<C-U>execute "call MyFun(" . v:count . ")"<CR>
fu! MyFun(count)
  " do more stuff based on a:count
  normal ,
endf

Однако это означает, что я теряю ключ , .Я знаю, что могу избежать траты этого отображения, делая

nn <Plug>Nobody j

, но тогда я не знаю, как использовать <Plug>Nobody (мое понимание действительно, что его использование только в {rhs} другого, не - nore отображение)

1 Ответ

3 голосов
/ 28 сентября 2019

Моя первоначальная попытка состояла в том, чтобы сопоставить ключ j таким образом

Использование execute здесь излишне.Достаточно сделать:

nnoremap j :<C-U>call MyFun(v:count)<CR>

теперь приводит к ошибке E169: слишком рекурсивная команда

Это из-за normal.Чтобы подавить переназначение, вы должны использовать "bang" -form: normal! j.Пожалуйста, обратитесь к документации для :normal, чей второй абзац точно описывает ваш вариант использования:

Если указан [!], сопоставления не будут использоваться.Без этого, когда эта команда вызывается из сопоставления без переназначения (:noremap), аргумент может быть сопоставлен в любом случае.

Кроме того, обратите внимание, что j обычно поддерживает count, поэтому 2j ожидается сдвиг на две строки вниз.Так что вы, вероятно, должны вместо этого сделать execute 'normal!' a:count . 'j'.

...