Как я вставляю пустую строку перед каждым комментарием (например, “#\”) в VIM?

Привет В 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
9
задан excray 24 April 2010 в 12:51
поделиться

5 ответов

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

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

Это сокращение от : global / ^ # / normal O , что означает:

  • для каждой строки, начинающейся с ' # '(: global / ^ # / )
  • выполнить команду' O 'в' нормальном режиме '( нормальный O ) - что означает делать то, что клавиша' O ' работает в «нормальном» (не вставке и не команде) режиме VIM. И «O» вставляет новую строку.
21
ответ дан 4 December 2019 в 08:51
поделиться

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

0
ответ дан 4 December 2019 в 08:51
поделиться

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

:s/^[ TAB]*#-1s/^/\r/
0
ответ дан 4 December 2019 в 08:51
поделиться

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

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

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

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

2
ответ дан 4 December 2019 в 08:51
поделиться

Не затрагивая первую строку

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

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

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

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

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

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


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

:g/^\%^\@

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

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

Этот regex изменит

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

на

#comment 1
#comment 2
statement 1
statement 2

#comment 3
1
ответ дан 4 December 2019 в 08:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: