不要在shell中为vim自动完成文件名中的某些扩展

Max*_*lan 4 macos vim bash bash-completion

我注意到bash中bash完成的一个非常酷的功能.假设我有一个包含文件的目录

a.java
a.class
b.java
b.class
Run Code Online (Sandbox Code Playgroud)

如果我开始输入vim a Tab,bash将自动完成a.java.它知道我不想编辑a.class

我想知道它是如何实现这种行为的.在我的bash_completion.d目录中有一堆completion文件,但vim没有一个.如何vim实现此行为,以及如何修改它以包含要忽略的其他文件扩展名?

use*_*271 8

在Ubuntu上,如果我安装了包bash-completion,我可以看到它的内容:

$ dpkg -L bash-completion
Run Code Online (Sandbox Code Playgroud)

在输出中,/etc/bash_completion列出.
在里面,写入以下命令:

. /usr/share/bash-completion/bash_completion
Run Code Online (Sandbox Code Playgroud)

它来源文件/usr/share/bash-completion/bash_completion.

这些文件的位置操作系统而异:

注意:我使用的是Mac,在macOS上存储bash-completion文件(默认情况下)/usr/local/etc/bash_completion,bash_completion.d目录位于/usr/local/etc/bash_completion.d

在我的系统上,/usr/share/bash-completion/bash_completion包含以下行:

_install_xspec '*.@(o|so|so.!(conf|*/*)|a|[rs]pm|gif|jp?(e)g|mp3|mp?(e)g|avi|asf|ogg|class)' vi vim gvim rvim view rview rgvim rgview gview emacs xemacs sxemacs kate kwrite
Run Code Online (Sandbox Code Playgroud)

我认为这一行是你所观察到的行为的原因.

如果要调整它以使bash 在命令后完成文件名时排除foobar扩展名,则$ vim可以尝试以下过程.

  1. 创建文件 ~/.bash_completion

在后者内部,写道:

for bcfile in ~/.bash_completion.d/* ; do
  [ -f "$bcfile" ] && . $bcfile
done
Run Code Online (Sandbox Code Playgroud)
  1. 创建~/.bash_completion.d/目录.

  2. 在此目录中,创建一个vim文件.

在后者内部,写道:

complete -f -X '*.@(o|so|so.!(conf|*/*)|a|[rs]pm|gif|jp?(e)g|mp3|mp?(e)g|avi|asf|ogg|class|foo|bar)' vi vim gvim rvim view rview rgvim rgview gview
Run Code Online (Sandbox Code Playgroud)

complete是一个bash内置命令,它允许您指定如何完成命令名称的参数.
-f是一个简写-A file,它指定bash你只想在你的建议中看到文件名.
-X排除任何符合以下模式的内容.

请注意,我只是复制了使用的模式/usr/share/bash-completion/bash_completion,并添加了foobar扩展:

*.@(o|so|so.!(conf|*/*)|a|[rs]pm|gif|jp?(e)g|mp3|mp?(e)g|avi|asf|ogg|class|foo|bar)
                                                                           ^^^^^^^
Run Code Online (Sandbox Code Playgroud)

您可以修改模式以排除要避免的实际扩展.

模式后面的名称告诉bash哪些命令应该排除这些扩展.
在上一个命令中,它们是:

vi vim gvim rvim view rview rgvim rgview gview
Run Code Online (Sandbox Code Playgroud)

他们都调用了Vi或Vim的版本.您可以在最后添加其他编辑器名称.

有关更多信息,请参阅

$ man bash
Run Code Online (Sandbox Code Playgroud)

查找该READLINE部分和Programmable Completion子部分,以及completeSHELL BUILTIN COMMANDS部分中内置的描述.

还参见于bash补部分1介绍介绍抨击完成部分2.

  • 很好的第一个答案,正确的格式和大量的参考; 非常感谢你! (2认同)