Как повторить какое-то действие определенное время на Vim? - PullRequest
22 голосов
/ 14 июля 2010

В Vim я обычно хочу повторить несколько серий команд несколько раз.Скажем, я хочу прокомментировать 5 строк, я бы использовал

I//<Esc>j
.j.j.j.j

Есть ли способ повторить последнюю часть ".j" несколько раз?

Ответы [ 5 ]

34 голосов
/ 14 июля 2010

Один из способов сделать это - назначить последовательность клавиш макросу, а затем запустить макрос один раз, а затем выполнить команду @@ run-last-macro. Например:

qa.jq@a@@

Если вы знаете, сколько раз вы хотите повторить макрос, вы можете использовать 4@@ или любое другое.

14 голосов
/ 14 июля 2010

Вы можете визуально выбрать строки, для которых вы хотите повторить, введите :normal! ., чтобы vim использовал . в каждой строке.Поскольку вы начали с визуального выделения, оно в итоге выглядит следующим образом:

:'<,'>normal! .

Однако, если вы добавляете и удаляете // комментариев много, вы можете найти следующие полезные сопоставления:

" add // comment with K
noremap K :s,^\(//\)\=,//,e <BAR> nohls<CR>j
" remove // comment with CTRL+K
noremap <C-K> :s,^//,,e <BAR> nohls<CR>j

Вы можете использовать 5K, чтобы комментировать 5 строк, вы можете использовать визуальный режим, чтобы сначала выбрать ваши строки, или вы можете просто набрать K, пока не прокомментируете все, что хотите.

9 голосов
/ 14 июля 2010

Что касается вашего конкретного примера, я предпочитаю вставлять несколько строк, используя режим визуального блока (доступ с помощью Ctrl-v).Например, если бы у меня были следующие строки:

This should be a comment.
So should this.
This is definitely a comment.
Is this a comment? Yes.

Я бы перешел к верхнему первому символу в верхней строке, нажал Ctrl-v, чтобы войти в режим визуального блока, перейти к последней строке (возможно, используя3j, чтобы переместиться на 3 строки вниз, возможно, используя 4g, чтобы перейти непосредственно к 4-й строке, или просто G, чтобы перейти к концу), затем введите I// <esc>, чтобы вставить комментарии сразу во все строки:

// This should be a comment.
// So should this.
// This is definitely a comment.
// Is this a comment? Yes.

Кроме того, есть очень удобный плагин commenter / un-commenter, который поддерживает многие языки здесь .Это проще, чем вручную вставлять / удалять комментарии.

3 голосов
/ 14 июля 2010

Для вашего конкретного примера. Вы также можете использовать диапазон .,.5s#^#//# (чтобы сделать это и следующие 5 строк) или визуальный блок (нажмите v, затем выберите нужный текст) и затем :%s#^#//#.

2 голосов
/ 14 июля 2010

Еще один способ сделать это - установить метки и выполнить замены в этом диапазоне:

ma
jjjj
mb
:'a,'bs,^,// ,
...