2010-01-14 2 views
17

В нормальном режиме (в Vim), если курсор находится на номер, ударяя Ctrl - увеличивает число на 1. Теперь я хочу сделать то же самое, но из командной строки. В частности, я хочу, чтобы перейти к определенным линиям, чей первый символ является числом, и увеличить его, то есть, я хочу, чтобы выполнить следующую команду:Использование Ctrl-A в командной строке Vim, чтобы увеличить число

:g/searchString/ Ctrl-A 

Я пытался сохранить Ctrl - в макросъемки (скажем a), и с помощью :g/searchString/ @a, но я получаю сообщение об ошибке:

E492: Not an editor command ^A

Любые предложения?

ответ

22

Вы должны использовать normal выполнить нормальный режим команд в режиме командной:

:g/searchString/ normal ^A 

Заметим, что вы должны нажать Ctrl - VCtrl - A в получите символ ^A.

+0

не использую Vim в течение многих лет и никогда не сталкивался с "нормальным" - Kool –

+0

@James: Красота неизвестного :) Vim удивляет л Никакого другого программного обеспечения! –

+1

Попробуйте темные углы вопроса vim для обнаружения большего количества неизвестных: http://stackoverflow.com/questions/726894/what-are-the-dark-corners-of-vim-your-mom-never-told-you -от около – idbrii

0

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

$ cat file 
one 
2two 
three 

$ awk '/two/{x=substr($0,1,1);x++;$0=x substr($0,2)}1' file #search for "two" and increment 
one 
3two 
three 
9

Как и :g//normal трюк отправленный CMS, если вам нужно сделать это с более сложным поиском, чем просто найти номер в начале строки, вы можете сделать что-то вроде это:

:%s/^prefix pattern\zs\d\+\zepostfix pattern/\=(submatch(0)+1) 

в качестве объяснения:

:%s/X/Y   " Replace X with Y on all lines in a file 
" Where X is a regexp: 
^     " Start of line (optional) 
prefix pattern  " Exactly what it says: find this before the number 
\zs    " Make the match start here 
\d\+    " One or more digits 
\ze    " Make the match end here 
postfix pattern " Something to check for after the number (optional) 

" Y is: 
\=     " Make the output the result of the following expression 
(
    submatch(0) " The complete match (which, because of \zs and \ze, is whatever was matched by \d\+) 
    + 1   " Add one to the existing number 
) 
+1

Очень полезно! И мне нравится, как вы это объяснили. Спасибо. – romar

Смежные вопросы