如何列出Vim中打开的所有缓冲区的文件路径?
有没有办法列出Vim中所有打开的缓冲区?我想查看每个打开缓冲区的完整文件路径,并将列表保存到外部文件,或者将其拖动粘贴到另一个文本文档中 解决方案 这是一场非常艰苦的比赛!下面的三个建议都很有效。我选择了Luc Hermitte,并将其添加到我的如何列出Vim中打开的所有缓冲区的文件路径?,vim,Vim,有没有办法列出Vim中所有打开的缓冲区?我想查看每个打开缓冲区的完整文件路径,并将列表保存到外部文件,或者将其拖动粘贴到另一个文本文档中 解决方案 这是一场非常艰苦的比赛!下面的三个建议都很有效。我选择了Luc Hermitte,并将其添加到我的.vimrc文件中: noremap <silent> <leader>so :call writefile( map(filter(range(0,bufnr('$')), 'buflisted(v:val)'), 'fname
.vimrc
文件中:
noremap <silent> <leader>so :call writefile( map(filter(range(0,bufnr('$')), 'buflisted(v:val)'), 'fnamemodify(bufname(v:val), ":p")'), 'open_buffers.txt' )<CR>
noremap so:call writefile(映射(筛选器(范围(0,bufnr(“$”),'buflisted(v:val)”,'fnamemodify(bufname(v:val),“:p”),'open_buffers.txt'))
因此,现在键入
,So
将所有打开的缓冲区的完整路径保存到open_buffers.txt
文件中的当前目录。要列出可使用的缓冲区的绝对路径,请执行以下操作:
:!echo %:p
如果您将其包装到录音中,您将获得所需内容,例如:
qq
:!echo %:p >> my_buffers
:bnext
q
现在,在有缓冲区时执行宏的次数,例如:
10@q
您将在文件my\u buffers
不过,可能是更好的方法:-)脚本显示所有打开缓冲区的路径,但是它也显示其他信息,因此它不适合拖动并粘贴到另一个文档中。这里有一个应该可以:
:redi @"|ls|redi END
:new +pu
:%s/[^"]*"\([^"]*\)".*/\=fnamemodify(submatch(1), ":p")/e
:g/^$/d
说明:
将重定向消息:redi
将消息重定向到:redi@“
即未命名寄存器@”
停止重定向:redi END
将打印出所有非隐藏缓冲区:ls
在拆分中创建缓冲区:新建
该:new+{cmd}
将执行新缓冲区的命令+cmd
执行:new+pu
或在新缓冲区上放置命令:pu
- regex基本上匹配整行并捕获引号之间的内容
的替换部分中的\=
将执行一个表达式:s/
将扩展捕获的数据akafnamemodify(子匹配(1),“:p”)
submatch(1)
删除所有空行:g/^$/d
:h /\=
:h :g
:h :new
:h :pu
:h :redi
:h :ls
:h fnamemodify()
:h :d
我会使用“简单”:
与:
包含所有可能的缓冲区编号的列表范围(0,bufnr(“$”)
将列表限制为实际列出的缓冲区——您可能更喜欢filter(可能的缓冲区,'buflisted(v:val)
,它还将显示帮助缓冲区等bufexist()
将所有缓冲区编号转换为完整路径名map(列出的缓冲区,'nr\u到完整路径(v:val)
将单个缓冲区编号转换为(简化)路径名bufname()
从相对路径名获得完整的绝对路径名fnamemodify(路径名,':p')
将
:echo
更改为调用writefile(路径名列表,'filename')
,仅此而已,或者更改为:put=
,等等。我喜欢redir,并且发现它在很多情况下都非常方便。
echo map(filter(range(0,bufnr('$')), 'buflisted(v:val)'), 'fnamemodify(bufname(v:val), ":p")')