2013-05-18 53 views
1

我有這個vim腳本功能在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

這與'一個問題:即redir'真實正在討論[所述vim_dev郵件列表中(https://groups.google.com/d/ MSG/vim_dev/H3Z3ChSUh_4/beZs6KzYdBsJ)。總之,嵌套':redir'是不可能的。 – glts

+0

我編輯了我的問題---有沒有辦法修改'Env()'輸出到一個寄存器或全局變量,我可以在'env()'調用命令後訪問? – Ein

+0

請注意':redir @ A' *追加*以註冊「a。如果您想覆蓋它,請使用小寫:':redir @ a'。 –

回答

2

正如我在評論說,這就是會正在討論on vim_dev:redir問題。總之,與: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,當然。

+0

謝謝。在'@ s'中(如我編寫的問題所示) – Ein

0
:let @a+=Env() 

代替

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

更加簡練,但不打印Env()的輸出到屏幕上。

(提問者@恩波的改性溶液既不)

+0

(或':let @ A ='等同於':let @ a + ='。) –