vim 命令是否会执行 :buff 或 :e(如果文件尚未在缓冲区中)?

vim 命令是否会执行 :buff 或 :e(如果文件尚未在缓冲区中)?

基本上我的工作流程如下我在常规 vim 的终端中使用拆分打开了一堆窗口。有时我会打开一个文件,有时我不会打开,我通常在和之间切换:buf:tag获取文件。理想情况下,我希望可以像:buf但是如果文件当前不在缓冲区中,那么它将执行:e

因此为了简化:

我输入:buf并输入文件名的一部分,然后点击<tab>它,它会为我提供文件匹配项,并尽可能多地匹配文件,如果我想要的文件不在缓冲区中,我希望仍然能够输入该文件名并让它加载文件。通常现在我必须返回并将命令从 a 更改为:buf [file]a :e [file]

有没有办法创建一个命令,它的工作方式类似于,:buf但如果文件不存在,则打开它?我:buf首先使用的原因是它将范围限制在某些目录中的文件,并在按下 tab 时匹配它们。我希望我解释得正确 :)。

例子:

:buf FooX[tab]

显示 4 个文件,并且有

:buf [very long path]/FooX

现在,如果没有显示带有前缀 FooX 的精确文件,我仍然希望能够键入FooXFileNotShown.cpp并像往常一样加载它:e

在此先感谢您的帮助。

答案1

:b[uffer]仅用于访问已打开的缓冲区。其补全的“范围”不限于“某些目录”,而是仅限于缓冲区列表/参数列表中的缓冲区。您不能使用该命令打开尚未打开的文件。

:e[dit]用于编辑文件,其补全范围是 Vim 工作目录下的文件和目录。您可以使用选项wildignore( :help 'wildignore') 或使用 awesome**通配符 ( :help starstar) 来限制补全列表。

当您使用:e编辑已在缓冲区列表/参数列表中的文件时,Vim 不会创建新的缓冲区,而是直接切换到现有缓冲区,实际上就像 一样:b

所以……看起来您对 的行为有点困惑:b,而您只是在寻找:e file<Tab>

答案2

因此,您需要一个完成现有缓冲区的命令,然后打开缓冲区(如果存在),或者编辑传递的文件而不是给您错误E94: No matching buffer

这个怎么样:

:command! -nargs=1 -complete=buffer Buf try | execute 'buffer' <q-args> | catch /^Vim\%((\a\+)\)\=:E94/ | execute 'edit' <q-args> | endtry

自定义命令必须以大写字母开头,但您可以使用cmdalias.vim - 为 Vim 命令创建别名插件来重载现有的:buf命令。

相关内容