Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/vim/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何列出Vim中打开的所有缓冲区的文件路径?_Vim - Fatal编程技术网

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

如何列出Vim中打开的所有缓冲区的文件路径?,vim,Vim,有没有办法列出Vim中所有打开的缓冲区?我想查看每个打开缓冲区的完整文件路径,并将列表保存到外部文件,或者将其拖动粘贴到另一个文本文档中 解决方案 这是一场非常艰苦的比赛!下面的三个建议都很有效。我选择了Luc Hermitte,并将其添加到我的.vimrc文件中: noremap <silent> <leader>so :call writefile( map(filter(range(0,bufnr('$')), 'buflisted(v:val)'), 'fname

有没有办法列出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>
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/
    将执行一个表达式
  • fnamemodify(子匹配(1),“:p”)
    将扩展捕获的数据aka
    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")')