我注意到了bash中一个非常棒的功能:bash自动补全。假设我有一个包含文件的目录。
a.java
a.class
b.java
b.class
如果我输入
vim a
Tab,bash会自动补全a.java
。它知道我不想编辑a.class
。我想知道它是如何实现这种行为的。在我的
bash_completion.d
目录中有许多completion
文件,但vim
没有一个。
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
。
这些文件的位置因操作系统而异,有所不同:
注意:我使用的是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排除foo
和bar
扩展名,您可以尝试以下步骤。
~/.bash_completion
在该文件中写入:
for bcfile in ~/.bash_completion.d/* ; do
[ -f "$bcfile" ] && . $bcfile
done
创建目录~/.bash_completion.d/
。
在该目录中创建一个名为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
中使用的模式,并添加了 foo
和 bar
扩展名:
*.@(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
内置命令的描述。
/usr/local/etc/bash_completion
中,而bash_completion.d目录位于/usr/local/etc/bash_completion.d
中。 - Max Coplan