为什么我的自定义函数添加了一个额外的“/!” (Vim)?

Why is my custom function adding an additional "/!" (Vim)?

我想转这个:

A
a
a
B
b
b

进入这个:

a/!
a/!
b/!
b/!

所以我写了一个自定义函数:

function PrepareDic()
  :g/[A-Z]/d | :%s/$/\/!/g
endfunction

但是当我这样做时 :PrepareDic() 我最终得到的是这样的东西:

a/!/!
a/!/!
b/!/!
b/!/!

我做错了什么?

既然你写了一个函数,你就不需要像那样链接命令。 (这样的链接命令也不符合您的预期。)

全局命令不能用横线分隔。相反,它正在做的是 运行ning d | :%s/$/\/!/g 在每一行 [A-Z]。这显然是错误的。要解决此问题,您只需要 运行 全局命令后的替代命令(这正是您想要的)。由于有两行大写字母,因此替换完成了两次。所以你得到 /!/! 添加每一行的结尾。

所以下面应该是固定函数

function PrepareDic()
  g/[A-Z]/d
  %s/$/\/!/g
endfunction

如果你真的想使用 bar 来分隔命令,你需要将全局传递给 exec。然而,这并不是真正必要的。

exec 'g/[A-Z]/d' | %s/$/\/!/g