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

时间:2011-12-10 00:01:30

标签: vim

这与此问题有关: How to redirect ex command output into current buffer or file?

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

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

:redir @a  
:pwd  
:redir END 

@a的内容包含三个空行,然后是正常的预期输出。

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

:let @b = substitute(@a, '\s*\(.\{-}\)\s*', '\1', '')

但结果是@b@a具有相同的内容。

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

1 个答案:

答案 0 :(得分:4)

b 寄存器中的值与 a 寄存器中的值相同,因为正则表达式无法匹配。

  1. 您需要使用反斜杠编写分组括号和开头重复括号 见:help /magic;实际上,magic regexps的substitute()选项始终处于启用状态。
  2. \s only matches SP and TAB(不是LF);但是\_s does include LF(或者,您可以使用\n来匹配LF)。
  3. 您需要锚定表达式的结尾,以便\{-}不会“放弃”而不匹配任何内容(除了初始换行符之外的所有内容都不匹配,因此无法从输入字符串中放置)。
  4. 以下是替换的修改版本:

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

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

    substitute(@a,'\v%^\_s+|\_s+%$','','g')
    

    此正则表达式使用\v来避免为%^+|%$添加反斜杠。

    如果您只想修剪前导/尾随换行符(而不是SP,TAB或NL),请将\_s的出现次数更改为\n