Как вставить пустую строку перед каждым комментарием (например, "#") в VIM? - PullRequest
9 голосов
/ 20 апреля 2010

Привет В Gvim мне нужно вставить пустую строку или две перед каждым комментарием в файле.

Например

#comment 1
#comment 2
statement 1
statement 2
#comment 3

После запуска команды должно быть

#comment 1

#comment 2
statement 1
statement 2  

#comment 3

Как мне это сделать?

Спасибо

Обновление: спасибо за ответы

Но если комментарии непрерывны, я не хочу, чтобы между ними добавлялась новая строка. Есть ли способ сделать это?

например

#comment 1
#comment 2

Я не хочу, чтобы это было

#comment 1

#comment 2

Ответы [ 5 ]

21 голосов
/ 20 апреля 2010

Вы также можете использовать эту команду: :g/^#/norm O

Хорошо, вот объяснение:

Это ярлык :global/^#/normal O, который означает:

  • для каждой строки, начинающейся с '#' (:global/^#/)
  • команда «O» в «нормальном режиме» (normal O) - это означает, что делать, что клавиша «O» делает в «нормальном» режиме (не вставлять и не: команда) VIM. И «О» вставляет новую строку.
2 голосов
/ 20 апреля 2010

есть решение, которое работает и в "не улучшенном vi":

: 2, $ г / ^ [TAB] * # / s / ^ / ^ M /

где TAB и ^ M должны быть введены как соответствующий управляющий символ.

Надеюсь, это поможет - и я благодарю Хейкки за указание на проблему с 1-й строкой

1 голос
/ 20 апреля 2010

Не влияет на первую строку

Пример вывода выглядит так, что не должно быть новой строки перед первой строкой в ​​файле. Вы можете добавить проверку lookbehind , чтобы достичь этого.

:%s/^\n\@<=\ze\s*#/\r/

\n\@<= Соответствует только в том случае, если перед текущей позицией стоит новая строка, поэтому первая строка не будет соответствовать. Для получения дополнительной информации см :h \@<=

Это также можно сделать с помощью проверки строки . Следующее регулярное выражение соответствует только тем строкам, которые не являются первой.

:%s/^\%>1l\ze\s*#/\r/

\%>1 Соответствует строке 1. См. :h \%>l

<ч />

Вот кое-что, что должно работать с обновленным вопросом, то есть только добавлять новую строку перед текущей строкой, если нет строки комментариев перед .

:g/^\%^\@<!\(^\s*#.*\n\)\@<!\s*#/norm O

^\%^\@<! Не сопоставлять эту строку, если начало файла находится перед ней. :h \%^ и: ч \@<!

\(^\s*#.*\n\)\@<! Соответствует этой строке, только если первый непустой символ в предыдущей строке не является #.

Это регулярное выражение изменится

#comment 1
#comment 2
statement 1
statement 2
#comment 3

до

#comment 1
#comment 2
statement 1
statement 2

#comment 3
0 голосов
/ 20 апреля 2010

Еще один способ (работает и для 1-й строки)

:s/^[ TAB]*#-1s/^/\r/
0 голосов
/ 20 апреля 2010

Используйте эту команду: :%s/^\ze\s*#/\r/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...