如何在没有换行符的情况下捕获寄存器中vim命令的输出?

mer*_*011 6 vim

这与此问题有关: 如何将ex命令输出重定向到当前缓冲区或文件?

但是,使用的问题:redir是它在输出前面会产生3或4个额外的换行符,并且使用替换函数似乎很难删除它们.

例如,如果我执行以下操作:

:redir @a  
:pwd  
:redir END 
Run Code Online (Sandbox Code Playgroud)

内容@a由三个空行组成,然后是正常的预期输出.

我尝试使用以下内容发布流程:

:let @b = substitute(@a, '\s*\(.\{-}\)\s*', '\1', '')
Run Code Online (Sandbox Code Playgroud)

但结果是@b内容与内容相同@a.

有没有人知道更有效(即工作)的后处理方式,或者替换:redir它没有那些额外的线?

Chr*_*sen 6

在值b寄存器是从价值不变的一个,因为你的正则表达式是无法匹配寄存器。

  1. 您需要使用反斜杠编写分组括号和开头的重复括号。
    :help /magic;实际上,对于正则表达式,魔术选项始终处于启用状态substitute()
  2. \s只匹配 SP 和 TAB(不是 LF);但\_s确实包括 LF(或者,您可以\n用来匹配 LF)。
  3. 您需要锚定表达式的结尾,以便在\{-}不匹配任何内容的情况下不会“放弃”(除了初始换行符之外的所有内容都不匹配,因此不会从输入字符串中替换)。

这是您替换的修改版本:

:let @b = substitute(@a,'\_s*\(.\{-}\)\_s*$','\1','')
Run Code Online (Sandbox Code Playgroud)

考虑删除前导和尾随空格而不是匹配两者之间的所有内容可能会更简单。这可以通过使用g替换修饰符(重复替换)和使用交替运算符的正则表达式在单个替换中完成,其中一个替换锚定到字符串的开头 ( %^),另一个锚定到字符串的末尾 ( %$)。

substitute(@a,'\v%^\_s+|\_s+%$','','g')
Run Code Online (Sandbox Code Playgroud)

这正则表达式使用\v,以避免增加反斜线为%^+|,和%$

如果您只想修剪前导/尾随换行符(而不是 SP、TAB 或 NL),请更改出现的两个\_sto \n