不要在shell中为vim的文件名自动补全特定的扩展名

5

我注意到了bash中一个非常棒的功能:bash自动补全。假设我有一个包含文件的目录。

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

如果我输入vim a Tab,bash会自动补全a.java。它知道我不想编辑a.class
我想知道它是如何实现这种行为的。在我的bash_completion.d目录中有许多completion文件,但vim没有一个。 vim如何实现这种行为,我该如何修改它以包含其他要忽略的文件扩展名?
1个回答

10

在Ubuntu上,如果我安装了bash-completion软件包,我可以使用以下命令查看其内容:

$ dpkg -L bash-completion

输出中列出了/etc/bash_completion
里面写有以下命令:

. /usr/share/bash-completion/bash_completion

它会获取文件/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

我认为这行代码负责你观察到的行为。

如果您想要调整它以使得在$ vim命令后自动补全文件名时,bash排除foobar扩展名,您可以尝试以下步骤

  1. 创建文件~/.bash_completion

在该文件中写入:

for bcfile in ~/.bash_completion.d/* ; do
  [ -f "$bcfile" ] && . $bcfile
done
  1. 创建目录~/.bash_completion.d/

  2. 在该目录中创建一个名为vim的文件。

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 的缩写形式,它告诉 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内置命令的描述。

另请参阅bash自动补全入门(第1部分)bash自动补全入门(第2部分)


2
非常棒的第一篇回答,格式正确,参考资料丰富。非常感谢! - Ingo Karkat
非常棒的回答。格式很好!感谢您提供如此出色的答案和所有参考资料,我一定会查阅它们! - Max Coplan
1
注意:我使用的是Mac,在macOS中,bash-completion文件默认存储在/usr/local/etc/bash_completion中,而bash_completion.d目录位于/usr/local/etc/bash_completion.d中。 - Max Coplan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接