Я хочу иметь возможность напечатать что-то вроде 'Ncom' в обычном режиме, который закомментирует текущую, а затем следующие N-1 строки. Назначение клавиш, которое я сделал для этого :nmap com ^i#<ESC>j
. Это фактически закомментирует текущую строку, но не работает для N строк аналогично встроенным командам vim. Что мне нужно знать о vim, который объяснит разрыв между тем, что я хочу, и тем, что происходит? Кроме того, как я могу правильно реализовать то, что я хочу?
2 ответа
:nnoremap com :normal! I#<CR>
Объяснение ...
I
такой же, как^i
но лучше. Обычно вместо^i#<Esc>
вы должны сделать следующее:I#<Esc>
Кстати, за
$a
.:normal
- это команда Ex, которая позволяет вам запускать команду нормального режима из командной строки. Используется так, за которым следует<CR>
::normal! I#
Когда команде нормального режима предшествует
count
:6w
, команда выполняется 6 раз. Однакоcount
не распространяется на последующие команды:6wifoo
не добавляетfoo
перед каждым из 6 следующих слов. В зависимости от команды, правила могут различаться: обратитесь к документации, если вы не уверены.Когда к команде Ex добавляется команда
count
:6:command
Vim автоматически добавляет диапазон, начиная с текущей строки и заканчивая строкойcount-1
ниже. Если вы делаете6:normal! I#
, команда становится::.,.+5normal! I#
что означает «вставьте
#
перед первым печатным символом этой строки и 5 строк ниже».Когда Vim встречает команду Ex в отображении с
:
он всегда добавляет соответствующий диапазон. Вот почему лучше всего использовать:normal
в отображениях, которые предназначены для использования в нескольких строках или сcount
.
Смотрите :help range
и :help :normal
.
Я думаю, что этот плагин делает свою работу: https://github.com/tpope/vim-repeat
пример:
silent! call repeat#set("\<Plug>MyWonderfulMap", v:count)