2011-08-29 104 views
6

有沒有辦法在vim中列出所有打開的緩衝區?我想查看完整的文件路徑到每個打開的緩衝區,並將列表保存到外部文件,或者將其粘貼到另一個文本文件中。如何查看所有vim的打開緩衝區的文件路徑?

解決方案

這是一個非常艱苦的比賽!以下所有建議都有效。我去Luc Hermitte's並添加到了我的vimrc:

noremap <silent> <leader>so :call writefile(map(filter(range(0,bufnr('$')), 'buflisted(v:val)'), 'fnamemodify(bufname(v:val), ":p")'), 'open_buffers.txt')<CR>

所以現在打字,so將所有打開的緩衝區的所有的完整路徑保存到當前目錄中的文件open_buffers.txt

回答

7

我不得不使用 「簡單」:

echo map(filter(range(0,bufnr('$')), 'buflisted(v:val)'), 'fnamemodify(bufname(v:val), ":p")') 

有了:

  • range(0,bufnr('$'))有一個|名單|所有可能的緩衝區數
  • filter(possible_buffers, 'buflisted(v:val)')限制列表中被實際列出的緩衝 - 你可能喜歡bufexist()也將顯示幫助緩衝區等
  • map(listed_buffer, 'nr_to_fullpath(v:val)')所有緩衝區號改造成完整路徑
  • bufname()變換單個緩衝器號爲(簡化的)路徑名
  • fnamemodify(pathname, ':p')具有從相對路徑名的完整絕對路徑名。

變化:echocall writefile(pathname_list, 'filename'),而這一切,還是要:put=

2

中列出的絕對一個緩衝路徑可以使用:

:!echo %:p 

如果你換行到一個記錄,你會得到你所需要的東西,如:

qq 
:!echo %:p >> my_buffers 
:bnext 
q 

現在執行的時間宏號你有緩衝區,如:

[email protected] 

,你將有結果文件my_buffers

大概在雖然:-)

一個更好的辦法
0

bufexplorer腳本顯示所有打開的緩衝區的路徑,但它也顯示其他信息,因此它不適用於拖放和粘貼到另一個文檔。這裏有一個screenshot

2

這應該工作:

:redi @"|ls|redi END 
:new +pu 
:%s/[^"]*"\([^"]*\)".*/\=fnamemodify(submatch(1), ":p")/e 
:g/^$/d 

說明:

  • :redi將重定向消息
  • :redi @"將消息重定向到@"又名無名寄存器
  • :redi END停止重定向
  • :ls將打印出所有非隱藏緩衝區
  • :new在拆分
  • :new +{cmd}+cmd創建一個緩衝區將用於新的緩衝區執行命令。
  • :new +pu執行:pu或put命令上的新緩衝器
  • 正則表達式基本上相匹配的整行和捕獲的:s/替換部件
  • \=引號之間的內容將執行表達式
  • fnamemodify(submatch(1), ":p")將擴大又名submatch(1)
  • :g/^$/d捕獲的數據全部刪除空行

更多信息:

:h /\= 
:h :g 
:h :new 
:h :pu 
:h :redi 
:h :ls 
:h fnamemodify() 
:h :d 
+0

我愛REDIR,並發現它在很多情況下,超級方便。 –

相關問題