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

yftpprvb  于 2022-11-24  发布在  其他
关注(0)|答案(4)|浏览(200)

有没有办法列出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文件中的当前目录。

ckocjqey

ckocjqey1#

这应该可行:

: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命令
  • regex基本上匹配整个行并捕获引号之间的内容
  • :s/的替换部分中的\=将执行表达式
  • fnamemodify(submatch(1), ":p")将扩展捕获的数据,即submatch(1)
  • :g/^$/d删除所有空行

更多信息:

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

pxiryf3j2#

bufexplorer脚本显示了所有打开的缓冲区的路径,但是它也显示了其他信息,因此它不适合用于拖动和粘贴到其他文档中。

vxf3dgd4

vxf3dgd43#

我早就用了“简单”:

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')从相对路径名转换为完整的绝对路径名。

:echo更改为call writefile(pathname_list, 'filename'),如此而已,或者更改为:put=,等等。

ncgqoxb0

ncgqoxb04#

要列出缓冲区的绝对路径,可以用途:

:!echo %:p

如果您将其打包到录音中,您将获得所需的内容,例如:

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

现在执行宏的次数与您有缓冲区的次数相同,例如:

10@q

结果将保存在文件my_buffers
不过可能是更好的方法:-)

相关问题