2016-03-04 48 views
1

讓我跳進去吧。Vim在標準輸出上打印緩衝區名稱:q

我想要做的只是在退出vim時打印出任何打開的緩衝區的文件路徑。這很有用,因爲我經常在vim腳本中打開其他文件,並使用我編寫的可以通過我的代碼庫搜索特定函數調用的vim腳本。

我想我可以設置一個自動命令,無論是當我打開一個文件或當我離開vim,並使用:ls的輸出來列出當前打開的所有緩衝區。我遇到的問題是我無法獲得任何輸出以顯示在終端中。我在我的功能嘗試了各種組合:!echo,但無濟於事。我一直在試圖像下面這樣在我的.vimrc

function! PrintFileName() 
    :!echo "hello" 
    :exec "!echo world" 
    "... etc 
endfunction 
au BufRead * call PrintFileName() 

兩個:!echo foobar和我:call PrintFileName()工作,如果我在命令行中做到這一點。我也想我可能不得不使用某種形式的沉默/重繪!所以我不必打進去繼續。

真的,這裏的主要問題是,我看不到從我的函數內部獲取輸出到標準輸出的方式,並且被自動命令調用。

感謝您的任何幫助。

+4

我不能真的想到一個很好的方法來做到這一點,除了用包裝腳本等相當醜陋的黑客...除了Vim處理標準輸出,你也有Vim的終端繪圖代碼干擾。你想要的是在代碼完成清理之後'echo' * – Carpetsmoker

+1

最簡單的方法是將該緩衝區列表保存到一個文件中,然後在你的vim會話終止後'cat'該文件。但我必須承認,我沒有看到任何有用的應用程序。爲什麼要讓vim在緩衝區列表上做些什麼? –

+0

@LucHermitte我經常需要在我剛剛編輯的文件上運行實用程序,並且在終端中有一個列表將非常好。當然,我可以在vim中做到這一點,但是我真的在編輯這些文件,並且在那裏運行並不有用。 – mrfred

回答

0

好的,所以我找到了這個解決方案,只要我從終端的最後一行輸入vim就可以工作。否則,這會在當前行下面打印出一行,並在您按Enter鍵時被覆蓋。如果有人知道如何解決,讓我知道,否則我會用這個。

function! PrintBuffers() 
    redir => files 
    :ls 
    redir END 
    " Regex to strip out everything from :ls but the buffer filenames 
    let files = substitute(files, '^[^"]*"', '', 'g') 
    let files = substitute(files, '"[^"]*\n[^"]*"', '\n', 'g') 
    let files = substitute(files, '"[^"]*$','','g') 
    " This is the magic line 
    exe '!echo; echo ' . shellescape(&t_te . files) 
endfunction 
au VimLeave * call PrintBuffers() 

*注 - 我寫這篇文章,我意識到,如果你在某些時候做了:cd這不會顯示在正確的道路。所以我認爲它非常脆弱,但是它完成了這項工作。