0

我有一个文件:

"""I'm a multiline string.
I say 
  "hey, single line string", 
and it says 
  "\they, multiline string,\nI can do multiple lines\ntoo".
and I say, 
  "it's cute that you think you can".

Yeah, I'm kind of a jerk."""

我可以使用嵌套substitute()来转换它:

:%s/"""\(\_.\{-}\)"""/\='"'.substitute(submatch(1),'["\\\n]','\\\0','g').'"'/g

在 vim 7.3 中,我得到了我想要的东西:

"I'm a multiline string.\
I say \
  \"hey, single line string\", \
and it says \
  \"\\they, multiline string,\\nI can do multiple lines\\ntoo\".\
and I say, \
  \"it's cute that you think you can\".\
\
Yeah, I'm kind of a jerk."

但是,在 vim 7.2 中,对于相同的输入和命令,我会得到不同的结果:

"I'm a multiline string.^@I say ^@  "hey, single line string", ^@and it says ^@ "\they, multiline string,\nI can do multiple lines\ntoo".^@and I say, ^@  "it's cute that you think you can".^@^@Yeah, I'm kind of a jerk." 

^@(据我所知,零字节在哪里)。

为什么我会得到如此不同的行为?我应该如何修改我的:%s命令以在 7.2 和 7.3 中具有相同的效果?

4

1 回答 1

1

我认为您遇到的行为是由于补丁 7.3.225 修复的错误:

“:s”内的替代()中的“\ n”未正确处理

Vim 7.2 来自 2008 年,非常过时。应该可以安装最新的7.3版本;如果您找不到适合您的发行版的软件包(对于 Windows,请检查Cream 项目中的二进制文件,在 Linux 上编译(例如从 Mercurial 源代码)也不是很困难。

如果您确实需要支持较旧的 Vim 版本并且您找到了解决方法,您可以实现一个条件:

if v:version > 703 || v:version == 703 && has('patch225')
    " new implementation
else
    " workaround
endif
于 2013-04-06T10:22:38.463 回答