首页 > 解决方案 > 以与 :ls 相同的方式打印 arglist

问题描述

:ls
  1  h   "~/Documents/trash/practical-vim" line 1
  3  h   "LICENSE.txt"                  line 1
  4  h   "auto_complete/sea-shells.txt" line 1
  5  h   "files/a.txt"                  line 1
  6  h   "files/b.txt"                  line 1

ls 命令的输出,您可以使用:b3切换到缓冲区 3,我想要的是与:args命令相同的输出,但我得到的是:

:args
[auto_complete/webapp/public/index.html] ex_mode/practical-vim.html files/mvc/index.html global/episodes.html

即 arglist 参数打印在一行中,:argument3如果文件数量很大,这使得使用(切换到 arglist 中的第三个文件)基本上是不可能的。我希望将这些文件打印在带有数字的新行上,通过该数字我可以像在:ls命令中一样访问这些文件。

我尝试为这种情况编写一个简单的命令:

command! Args 
    \ :let var_args = argv()
    \ :let var_args_size = len(var_args)
    \ :if var_args_size > 0 | let var_args_size = var_args_size - 1 | endif
    \ :for i in range(0, var_args_size) | echo printf("%3d %s", i + 1, var_args[i]) | endfor

但:

E15: Invalid expression: argv() :let var_args_size = len(var_args) :if var_args_size > 0 | let var_args_size = var_args_size - 1 | endif
 :for i in range(0, var_args_size) | echo printf("%3d %s", i + 1, var_args[i]) | endfor

我恳请使用我的命令或其他方式打印 arglist 的帮助,如下所示:

:args
1 auto_complete/webapp/public/index.html
2 ex_mode/practical-vim.html
3 files/mvc/index.html
4 global/episodes.html

所以我可以在:argument3不计算的情况下执行并切换到 files/mvc/index.html。

标签: vim

解决方案


只有一行

command! -bar Args echo join(map(argv(), {_, v -> printf("%3d\t%s", bufnr(v), v)}), "\n")

它显示缓冲区编号而不是参数索引,以便:bX切换缓冲区。


推荐阅读