VIM - 同一行上多个命令的第一个命令被忽略

VIM - First command on multiple command on same line being ignored

我正在从几个文件中提取信息,并编写了以下命令:

:g!/Value/d | %s/.*=//ge | %s/\;//ge | %y

它基本上是这样的: 'delete lines without "Value" | delete everything up to the = sign | remove ";" | copy all to register'

但是第一个 :g!/Value/d 被忽略了,似乎 %y 以某种方式导致它被忽略为

:g!/Value/d | %s/.*=//ge | %s/\;//ge

正确清理文档。

我还尝试从命令执行中获取日志,但没有任何帮助。

我不明白最后一个命令如何影响第一个命令。

所以我找到了解决这个问题的方法

execute 'g!/\.Value/de' | %s/.*=//ge | %s/\;//ge | %y

这将产生预期的行为,但仍不清楚为什么该栏对 :g 命令不起作用。

| 命令分隔符根据命令具有不同的优先级,如 :help :bar 所述。对于 :global 命令,它(和后续命令)被 视为命令参数本身的一部分 。这意味着你的替换和 yank 不会执行一次(在 :global 之后),但实际上 :global 选择的每一行 !

您已经找到了正确的解决方法:通过将命令包装在 :execute 中(尊重 | 命令分隔)并引用它,以下命令仅在第一个命令之后计算.