Допустим, у меня есть следующий очень простой файл
a
b
c
d
e
и я решил, что я хочу добавить пустые строки после каждой строки. Несколько разных методов сразу приходят мне на ум. Мы могли бы просто сделать это (и таким образом принять неудачу). Мы могли бы записать макрос qqo<ESC>jq
и повторить его несколько раз.
Два других метода казались мне более очевидными в то время.
Во-первых, я думал, что буду вводить :norm
команду o
в каждой строке. Итак, я бегу :%norm o
. Но в действительности мы получаем 5 пустых строк, за которыми следуют неразделенные строки, как указано выше. Я понимаю, что это означает, что %norm
vim на самом деле принимает сообщение о выдаче следующей обычной команды в первых пяти строках этого файла из пяти строк . Команда o
создает новую строку, а vim «тупой» в том смысле, что она ссылается по номеру строки, а не по какому-то другому идентификатору.
Ну, я был смущен. Конечно. Я попробовал несколько других вещей, чтобы увидеть, смогу ли я заставить вышеуказанный метод работать, но, увы, я не смог. Из любопытства я попробовал другой мой любимый метод массового применения. Это заставило меня попробовать :g/^/norm o
. К моему удивлению, это работает просто отлично! Так что, на мой взгляд, vim здесь не "тупой" так же, как выше, и ссылается на строки не просто на номер строки.
Что именно происходит?
источник
:%s/$/\r/
или так::%s/\n/\r\r/
. Вывод заключается в том, что с символами новой строки можно сопоставить\n
, но они должны быть записаны как\r
значения заменыОтветы:
Ну,
%
это сокращение от1,$
(диапазон от первой строки до последней). От:he :%
:И для
:global
:Итак, первый случай подобен обходу списка при его изменении, поэтому счетчик элементов списка становится недействительным. Во втором случае мы помечаем элементы, на которые хотим нацелиться, за один проход, так что даже если список изменяется на втором проходе, мы все равно знаем, над какими элементами мы хотим работать.
источник
g
это безумно полезно я должен потратить больше времени, чтобы перейти от среднего пользователя vi к