2010-04-20 3 views
9

Привет В Gvim Мне нужно вставить пустую строку или две перед каждым комментарием в файле.Как вставить пустую строку перед каждым комментарием (например, «#») в VIM?

Например

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

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

#comment 1 

#comment 2 
statement 1 
statement 2 

#comment 3 

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

Благодаря

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

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

например

#comment 1 
#comment 2 

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

#comment 1 

#comment 2 

ответ

20

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

Ok, здесь является объяснением:

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

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

Я думаю, что это лучший ответ до сих пор так как это самый интуитивный, но, возможно, вам следует объяснить, как и почему это работает. – matias

+0

Объяснение добавлено –

+0

': g [lobal]' trumps': s [ubstitute] '+1 для вас sir –

0

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

1

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

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

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

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

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

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

\%>1 совпадений ниже линии 1.См :h \%>l


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

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

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

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

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

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

в

 
#comment 1 
#comment 2 
statement 1 
statement 2 

#comment 3 
2

есть решение, которое работает в "незастроенных VI", а также:

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

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

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

0

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

:s/^[ TAB]*#-1s/^/\r/ 
Смежные вопросы