如何在Vim中列出所有打开缓冲区的文件路径?

7
有没有一种方法可以在Vim中列出所有打开的缓冲区?我想查看每个打开的缓冲区的完整文件路径,并将列表保存到外部文件,或复制它以粘贴到另一个文本文档中。
解决方案
这是一个非常困难的问题!下面的三个建议都很好用。我选择了Luc Hermitte的建议,并将其添加到我的.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 文件中。

4个回答

10

我会使用 "simple":

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

使用以下步骤:

  • range(0,bufnr('$')) 得到所有可能的缓冲区编号的 |List|。
  • filter(possible_buffers, 'buflisted(v:val)') 将列表限制为实际上已列出的缓冲区 -- 您可能更喜欢使用 bufexist(),它还会显示帮助缓冲区等。
  • map(listed_buffer, 'nr_to_fullpath(v:val)') 将所有缓冲区编号转换为完整路径名。
  • bufname() 将单个缓冲区编号转换为(简化的)路径名。
  • fnamemodify(pathname, ':p') 从相对路径名中得到完全绝对路径名。

:echo变更为call writefile(pathname_list, 'filename')或者:put=即可完成。


3
要列出缓冲区的绝对路径,您可以使用以下命令:
:!echo %:p

如果你将这个放入录音中,你将得到所需的内容,例如:
qq
:!echo %:p >> my_buffers
:bnext
q

现在执行宏的次数应该和你有的缓冲区数量相同,例如:
10@q

你会在文件my_buffers中得到结果。

可能有更好的方法:-)


3
这应该有效:
: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

我喜欢Redir,发现它在许多情况下非常方便。 - dash-tom-bang

1

bufexplorer脚本显示了所有打开缓冲区的路径,然而它也显示其他信息,因此不适合将其复制并粘贴到另一个文档中。这里有一张截图


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接