Команда подстановки Vi - PullRequest
4 голосов
/ 23 февраля 2009

Используя vi, как мне заменить номер текущей строки где-нибудь в текущей строке? Например, если курсор находится в строке 10, я хотел бы поместить число 10 в эту строку.

Ответы [ 3 ]

6 голосов
/ 23 февраля 2009

Вы хотите физически вставить номер строки, а не просто отобразить ее на полях? Если так -

:s/$/\=line(".")/

Это добавит его в конец строки. Замените $ на ^, чтобы добавить к строке.

4 голосов
/ 23 февраля 2009

Во-первых: следующие предполагают, что вы используете vim, а не vi или аналог, или проект семейной реликвии vi.

Вот несколько вариантов:

Сначала, если вы собираетесь использовать :s, затем наведите курсор на выбранную вами строку и:

:s/texttoreplace/<C-R>=line(".")<CR>/

, где <C-R>= означает, что на самом деле нажмите Ctrl - R , затем введите знак равенства. Подсказка изменится, и вы можете ввести:

line(".")

, а затем нажмите клавишу возврата, как указано <CR>. В этот момент вы вернетесь к своему :s Команда с вставленным номером строки. Вы можете сделать тот же трюк в режиме вставки а также (<C-R>=line(".")<CR>).

Во-вторых, вы можете использовать \=, чтобы вставить номер строки в регулярное выражение в таким же образом, но это не работает в режиме вставки или в других местах.

Наконец, это полезно, если вы хотите Ctrl - A в режиме вставки и командной строки для вставки текущего номера строки:

:imap <silent> <C-A> <C-R>=line(".")<CR>
:cmap <C-A> <C-R>=line(".")<CR>

не добавляйте атрибут silent в строку cmap: он запрещает вывод строки в набираемую вами команду до тех пор, пока вы не отступите.

1 голос
/ 01 июня 2011

Я пытался

:s/texttoreplace/<C-R>=line(".")<CR>/

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

Следующее сработало для меня.

g/^/exec "s/texttoreplace/(".line(".")."/"

g/^/exec выполняет данную команду в каждой строке, соответствующей регулярному выражению /^/ (т.е. в каждой строке). Выражение line(".") затем оценивается в области строки, над которой выполняется работа, а не в строке в области действия, когда вводится команда.

...