在vim中,如何重定向vimscript函数的输出?

时间:2013-05-18 15:54:11

标签: redirect echo vim

我有这个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来粘贴。

相关问题:
How to redirect ex command output into current buffer or file?

1 个答案:

答案 0 :(得分:2)

正如我在评论中所说,这是:redir正在讨论on vim_dev的问题。简而言之,无法使用:redir进行嵌套重定向。

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

只需将redir => s更改为redir => g:s(全局变量g:s)或redir @s(注册s),然后删除return语句。我们使用寄存器:

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

调用该函数后,输出存储在寄存器s中,当然可以将其与"sp放在一起。