基本上我的工作流程如下我在常规 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
命令。