如何在VIM中的每个注释(例如“#”)之前插入一个空行?

时间:2010-04-20 07:04:16

标签: vim

嗨在Gvim我需要在文件中的每个评论之前插入一两行空白。

例如

#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

5 个答案:

答案 0 :(得分:21)

您也可以使用此命令::g/^#/norm O

好的,这是一个解释:

这是:global/^#/normal O的快捷方式,意思是:

  • 表示以“#”(:global/^#/
  • 开头的每一行
  • 在“正常模式”(normal O)中执行“O”命令 - 这意味着在“正常”(非插入且不是:命令)VIM模式下执行“O”键操作。 'O'插入一个新行。

答案 1 :(得分:2)

有一个解决方案,它也适用于“未经改进的vi”:

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

其中必须输入TAB和^ M作为相应的控制字符。

希望这会有所帮助 - 感谢Heikki指出一线问题

答案 2 :(得分: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

答案 3 :(得分:0)

使用此命令::%s/^\ze\s*#/\r/

答案 4 :(得分:0)

另一种方式(也适用于第一行)

:s/^[ TAB]*#-1s/^/\r/