嗨在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
答案 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/