2

我有这个 vimscript 功能

 function! Env()
     redir => s
     sil! exe "norm!:ec$\<c-a>'\<c-b>\<right>\<right>\<del>'\<cr>"
     redir END
     return split(s)
 endfunction

这个函数是从这个问题中获得的:
How to list all the environment variables in Vim?

当我这样做时,:call Env()我看不到任何输出,但:echo Env()将所有环境变量的名称显示为输出。

我宁愿以某种方式复制并粘贴此输出。我知道:redir。然而这不起作用:

:redir @A
:echo Env()
:redir END
"ap

而是粘贴一个空白行。

我已经尝试了许多:redir命令组合(到寄存器和/或文件)和变体call Env()但没有成功。这是因为生成的输出来自调用函数吗?我认为这可能是因为该函数返回一个列表,但两者:echo string(Env())都没有捕获:redir

编辑:这是我从下面的答案中使用的修改后的解决方案。

function! Env()
    redir => s
    sil! exe "norm!:ec$\<c-a>'\<c-b>\<right>\<right>\<del>'\<cr>"
    redir END
    let @s = string(split(s))
endfunction

然后可以执行:call Env()然后"sp粘贴。

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

4

2 回答 2

2

正如我在评论中所说,这是在 vim_dev:redir上讨论的问题。简而言之,嵌套重定向 with是不可能的。:redir

但当然,您可以简单地修改您的Env()函数以将输出重定向到寄存器或全局变量。

只需更改redir => sredir => g:s(global variable g:s) 或redir @s(register s),然后删除 return 语句。让我们使用寄存器:

function! Env()
    redir @s
    sil! exe "norm!:ec$\<c-a>'\<c-b>\<right>\<right>\<del>'\<cr>"
    redir END
endfunction

调用函数后,输出存储在寄存器中,当然s可以用"sp.

于 2013-05-18T16:33:05.297 回答
0
:let @a+=Env()

代替

:redir @A
:echo Env()
:redir END

更简洁,但不会将 printEnv()的输出输出到屏幕上。

(提问者@Ein 修改后的解决方案也没有。)

于 2016-12-05T15:39:14.443 回答