我正在使用vim在c / c ++中编写程序,我想知道如何在代码中添加“\ n”(代表换行符)或使用:%s
使用“%”
例如,有时我会忘记将“%”放在“d”或“f”的前面,或忘记在某些printf()
次调用中加上“\ n”。
printf("This is my d code.", x);
但是以下命令不起作用,它用一个空格代替“\ n”!
:%s/\<code.\>/code.\n/gc
或
:%s/\<d\>/%d/gc
我怎样才能做我想做的事?
答案 0 :(得分:4)
:help s/\n
有答案:
\n insert a <NL> (<NUL> in the file) (does NOT break the line) *s/\n*
你也会在那里找到解决方案:插入一个文字反斜杠,通过加倍来逃避它\\
;要拆分该行,必须使用\r
。是的,这是不一致的,它在sed
等类似工具中的工作方式不同,但不幸的是它是如何的。
\n
不会插入空格,而是插入特殊<NL>
字符,通常显示为^@
。\<code.\>
不正确;要匹配文字句号,你必须逃避它:\.
。否则,它匹配任何角色。同样,.
通常不是关键字字符,因此\>
边界不匹配。&
。另请阅读捕获组(:help /\(
)和子匹配参考:help s/\1
。这是一种更好的方法::%s/\<code\./&\\n/gc
(我没有看到第二次替换的问题。)
答案 1 :(得分:3)
您想要插入双字符序列\n
,而不是文字换行符(后者会产生语法错误)。
要更改的示例行是:
printf("This is my d code.", x);
您的尝试存在一个问题:
:%s/\<code.\>/code.\n/gc
在.
后面的"
和code
之间没有字边界。另一个问题是目标中的\
用于转义特殊字符(例如,您可以将/
字符称为\/
),因此\
必须自己逃脱。
这应该做的工作:
:%s/\<code\."/code.\\n"/gc
更通用的解决方案可能是:
:g/printf/s/"/\\n"/egc
提供在"
的每一行上\n"
替换printf
- 但是会错过任何跨越多行的printf
次调用。
至于d
替换%d
,您在问题中的命令:
:%s/\<d\>/%d/gc
是对的。