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

标签 bash macos vim bash-completion

我注意到 bash 中 bash-completion 的一个非常酷的特性。假设我有一个包含文件的目录

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

这些文件的位置 vary从一个操作系统到另一个:

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 的简写,它指定 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 中内置的 complete 的描述内置命令部分。

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

关于bash - 不要在 vim 的 shell 中自动完成文件名的某些扩展名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52730453/

相关文章:

security - 如何将变量的值传递给命令的标准输入?

bash - 检测 bash 中是否存在 Bash 补全

c - 如何将 bash 脚本放入 C 程序中

macos - bash 错误 : Cannot find/Library/. ..../setclasspath.sh,但它在那里

bash - 使用 vim 外部命令调用 bash 函数

Vim:病原体中 vimball 插件的建议

linux - 从 AWK 命令获取输出并根据空格逐行显示

html - 有什么方法可以使用 wkhtmltopdf 减小文件大小?

macos - Mac OS X 上 Rust 的递归深度太浅

vim - 我可以在vimrc中添加以下哪行代码以使<leader> ig命令在vim启动时运行?