vim:如何在 'args' 命令输出中显示缓冲区编号

vim: how to show buffer numbers in the 'args' command output

当在 vim 中键入 args 命令时,会显示当前编辑文件(缓冲区)的列表。但是,如果文件列表很长(例如超过 20 个),如果不手动计数,很难判断给定文件名对应的缓冲区编号。目标是能够快速检查给定文件对应的缓冲区编号,并使用 b(+bufferNumber) 命令跳转到它。

有没有办法在显示的(使用 args 命令)文件名中附加或添加缓冲区编号?

一些预期输出示例:

1 fileName1
2 fileName2

fileName1 1
fileName2 2

非常感谢您的帮助!

TL;DR:您想导航缓冲区,因此您应该使用列出缓冲区的命令,而不是列出参数的命令。

one is shown a list of currently edited files (buffers).

没有。其中显示了一个参数列表,可能有也可能没有相应的缓冲区。

it is very hard to tell what buffer number a given file name corresponds to without manually counting them.

参数列表中参数的位置不能保证与其对应的缓冲区在缓冲区列表中的位置相匹配,即使它有一个。

The goal is to be able to check quickly buffer number a given file corresponds to and jump to it using the b(+bufferNumber) command.

已经有一个命令::help :buffers

基本上,“文件”、“参数”和“缓冲区”之间没有保证的关系,因此应该使用适合要操作的对象的命令。为了浏览缓冲区而列出参数是完全没有意义的。

你混淆了一堆概念,在这里:“文件”、“参数”和“缓冲区”。老实说,Vim 自己的命令名称和文档可能会令人困惑,所以这里有一个高级解释。

  • “文件”是磁盘上的文件。当您在该粒度级别执行某些操作时,您可能会用“文件”术语来思考(“我想编辑此项目的 README.md。”或“我想将此缓冲区的内容写入文件 foo.rb") 但是,在该用例之外,还有更合适的心智模型。

    如果您考虑“文件”,请使用处理文件系统的命令 I/O,例如 :help :w:help :r

  • 从概念上讲,“参数”是启动时提供给 Vim 的文件名:

    $ vim foo.rb bar.spec.rb
    

    但是,当然,可以在运行时更改参数列表,因此它有点失去其原始含义,将“参数”视为“文件名”可能更有用:您有一个列表初始值为启动时作为参数传递给 Vim 的文件名的文件名,您可以向其中添加条目,也可以从中删除条目。

    如果您想操纵参数,请使用面向参数的命令,例如 :help :argdo:help :next

    注意:文档在参数列表的上下文中大量使用了“文件”一词,应该使用更合适的“参数”。

  • “缓冲区”正是您在其他更熟悉的程序中所说的“文档”。它们 可以 是否与“文件”或“参数”相关联。

    如果要操作缓冲区,请使用面向缓冲区的命令,如 :help :buffers:help :bufdo

    注意:如果您查看 :buffers 的文档,您会发现它有两个同义词,:files:ls,这让事情变得非常混乱。您获得的列表可能映射到磁盘上的实际“文件”或不,因此“文件”、“参数”和“缓冲区”很重要。

@romainl 很好地回答了这个问题,但是因为我有一些东西几乎就像在身边

command! -nargs=* -bang -bar -complete=file Args
      \ if empty(<q-args>) |
      \   if <bang>0 |
      \     execute "argdelete *" |
      \     Args |
      \   else |
      \     for i in range(argc()) |
      \       if argidx() == i |
      \         echohl Directory | echo printf("%3d %s", bufnr(argv(i)), argv(i)) | echohl None |
      \       else |
      \         echo printf("%3d %s", bufnr(argv(i)), argv(i)) |
      \       endif |
      \     endfor |
      \     echohl Title |
      \     echo '(' . min([argidx() + 1, argc()]) . ' of ' . argc() . ') ' . argv(argidx()) |
      \     echohl None |
      \   endif |
      \ else |
      \   args<bang> <args> |
      \ endif

这将创建一个新命令 :Args,它具有以下属性:

  • :Args! - 清除参数列表
  • :Args - 使用 bufnr
  • 在单独的行上显示每个文件的参数
  • :Args - 突出显示当前参数
  • 可以像:args ...一样使用