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

标签 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?

最佳答案

正如我在评论中所说,这是正在讨论的 :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一起放置。

关于redirect - 在 vim 中,如何重定向 vimscript 函数的输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16626155/

相关文章:

javascript - 如何正确处理javascript重定向?

php - 如果一个查询包含 Null 结果,如何从多个查询打印?

php + sql语句总是返回成功?

vim - 在 Vim 中插入时间戳的最佳方法?

javascript - 由于 iOS 12.4 iframe 无法更改顶部 url

redirect - 更新指向已重定向 URL 的链接

php - 该页面未使用 isset 正确重定向

bash - 使用 JSON 文件的名称及其在 bash 中的内容创建一个 JSON 对象

vim - 如何在 vim 中为自定义命令标记视觉选择?

git - 找不到在 MSysGit 中为提交消息 vi/vim 禁用换行的方法(默认情况下大约 74 个字符)