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

在没有换行符的情况下,如何在寄存器中捕获vim命令的输出?,vim,Vim,这与这个问题有关: 但是,使用:redir的问题在于,它会导致输出前面出现3或4个额外的换行符,并且使用替换函数很难删除这些换行符 例如,如果我执行以下操作: :redir @a :pwd :redir END @a的内容由三个空行组成,然后是正常的预期输出 我试着用这样的方式发布流程: :let @b = substitute(@a, '\s*\(.\{-}\)\s*', '\1', '') 但结果是@b与@a具有相同的内容 是否有人知道一种更有效(即工作)的后处理方法,或者替

这与这个问题有关:

但是,使用
:redir
的问题在于,它会导致输出前面出现3或4个额外的换行符,并且使用替换函数很难删除这些换行符

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

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

我试着用这样的方式发布流程:

:let @b = substitute(@a, '\s*\(.\{-}\)\s*', '\1', '')
但结果是
@b
@a
具有相同的内容

是否有人知道一种更有效(即工作)的后处理方法,或者替换没有这些额外行的
:redir

  • 你需要写分组括号和带反斜杠的大括号。
    看见实际上,regexp的选项始终处于启用状态
  • (不是LF);但是(或者,您可以使用
    \n
    来匹配LF)
  • 您需要锚定表达式的结尾,以便
    \{-}
    不会在不匹配任何内容的情况下“放弃”(除了初始换行以外的所有内容都不匹配,因此无法从输入字符串中替换)
  • 以下是您的替换的修改版本:

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

    只考虑删除前导空格和尾随空格可能更简单,而不是匹配中间的所有内容。这可以通过使用带有regexp的
    g
    substitution修饰符(重复替换)在单个替换中完成,其中一个替换被锚定到字符串的开头(
    %^
    ),另一个被锚定到字符串的结尾(
    %$

    此regexp用于避免为
    %^
    +
    |
    %$
    添加反斜杠

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

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

    是否尝试过
    :让@b=substitute(@a,'\n',''g')
    ?我刚刚尝试过。这非常有效!现在我觉得自己很愚蠢=根据文档,
    substitute()。