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

Do not autocomplete certain extensions from file names in shell for vim

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

a.java
a.class
b.java
b.class

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

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

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

$ dpkg -L bash-completion

在输出中,列出了 /etc/bash_completion
在里面,写了下面的命令:

. /usr/share/bash-completion/bash_completion

它获取文件 /usr/share/bash-completion/bash_completion

这些文件的位置 从一个 OS 到另一个:

Note: I use a Mac, and on macOS the bash-completion file is stored (by default) in /usr/local/etc/bash_completion, and the bash_completion.d directory is in /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

我认为这条线是造成您观察到的行为的原因。

如果你想调整它使 bash 在 $ vim 命令后完成文件名时排除 foobar 扩展名,你可以尝试 following procedure.

  1. 创建文件~/.bash_completion

在后者里面,写:

for bcfile in ~/.bash_completion.d/* ; do
  [ -f "$bcfile" ] && . $bcfile
done
  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

complete 是一个 bash 内置命令,它允许您指定如何完成命令名称的参数。
-f-A file 的 shorthand,它指定 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)
                                                                           ^^^^^^^

您可以自行修改模式以排除您想要避免的真实扩展名。

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

vi vim gvim rvim view rview rgvim rgview gview

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

有关详细信息,请参阅:

$ man bash

查找 READLINE 部分和 Programmable Completion 子部分,以及 SHELL BUILTIN COMMANDS 部分中内置的 complete 的描述。

另见 An introduction to bash completion part 1 and An introduction to bash completion part 2