不要为 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
命令后完成文件名时排除 foo
和 bar
扩展名,你可以尝试 following procedure.
- 创建文件
~/.bash_completion
在后者里面,写:
for bcfile in ~/.bash_completion.d/* ; do
[ -f "$bcfile" ] && . $bcfile
done
创建 ~/.bash_completion.d/
目录。
在此目录中,创建一个 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
中使用的模式,并添加了 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
的描述。
另见 An introduction to bash completion part 1 and An introduction to bash completion part 2。
我注意到 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
。
这些文件的位置
Note: I use a Mac, and on macOS the bash-completion file is stored (by default) in
/usr/local/etc/bash_completion
, and thebash_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
命令后完成文件名时排除 foo
和 bar
扩展名,你可以尝试 following procedure.
- 创建文件
~/.bash_completion
在后者里面,写:
for bcfile in ~/.bash_completion.d/* ; do
[ -f "$bcfile" ] && . $bcfile
done
创建
~/.bash_completion.d/
目录。在此目录中,创建一个
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
中使用的模式,并添加了 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
的描述。
另见 An introduction to bash completion part 1 and An introduction to bash completion part 2。