2013-03-18 30 views
2

在我的Vimscript中,我想遍歷所有/只包含磁盤上文件的緩衝區。目前,我這樣做是爲了得到緩衝一組ID:獲取包含真實文件的緩衝區列表的最佳方式是什麼?

filter(range(1, bufnr('$')), 'buflisted(v:val)')

再後來我測試每個緩衝區ID有:

filereadable(fnamemodify(bufname(buffer_id), ':p'))

我讀過關於buflisted,bufloaded和朋友的文檔,但我仍不清楚它們之間的區別。因此我不確定上面的代碼片段是否是最優的。

此外這似乎是一個常見的任務,將有一個內置函數,但我找不到一個。

這是最好的方式還是有更好的方法?

回答

1

我猜「常用的方式」只是使用:bufdo,並且它在:write上失敗的未命名的,未被執行的文件,但在插件中,這是很好的做更多的檢查。

你的方法對我來說看起來很好。 :help 'buflisted'說:

如果是復位不用於「:bnext編輯」,「LS」,Buffers菜單等 此選項是Vim爲只用來記住 一個緩衝器復位文件名或標記。 Vim在開始編輯緩衝區時進行設置。

因此,假設您的插件做類似:bufdo,使用buflisted()是正確的。

+0

OK,但' buflisted()'我相信我仍然需要我寫的第二個測試,每個緩衝區調用三個函數。這不是有效的。 – 2013-03-19 11:14:59

+1

第二個測試(可以放入第一個'filter()')檢查_existing files_。是的,如果這是你的標準的一部分,你需要。 – 2013-03-19 11:28:48

+0

總體性能受文件名擴展和文件系統檢查影響最大,而不是調用三個函數;儘管你需要知道確切的情況。除非你真的遇到問題,否則不要擔心。只有解決真正的瓶頸,而不是你認爲的緩慢。 – 2013-03-19 11:33:10

0

我覺得buffer_id - >文件名轉換可以做的更好:

expand('#' . buffer_id . ':p') 

這可能與緩衝區列表合併成這一個班輪:

filter(range(1, bufnr('$')), 'buflisted(v:val) && filereadable(expand("#" . v:val . ":p"))') 
相關問題