我希望 bash 在自动完成文件名时过滤掉名称以 ~(波浪号)结尾的备份文件。
我已经编写了一个脚本来在使用 vim 时进行此项设置(我对 shell 脚本编写经验很少):
#!/bin/bash
no_backups_complete()
{
local cur=$2
COMPREPLY=( $( compgen -o plusdirs -f -X '*\~' -- "$cur" ) )
return 0
}
complete -o filenames -F no_backups_complete vim
但是运行脚本没有明显的效果,vim[Tab]仍然显示每个文件。
我尝试过转义/不转义~,并将$2和$cur放在引号中/而不是引号中,但没有任何区别。
答案1
该语法运行完美,因此很可能由于某种原因它不会被添加到您的 bash 环境中。
查看它是否已加载到你的环境中:
打开一个新的 bash 终端窗口并运行:
declare -F | grep no_backups_complete
要查看函数声明(如果可用):
type no_backups_complete
如果您得到结果,对于第一个命令,例如:
declare -f no_backups_complete
表示它已加载到环境中;如果没有结果,则表示没有加载。如果不可用,则类型响应应为“...未找到”,如果可用,则列出函数定义。
继续假设不是在你的 bash 环境中加载:
你把文件放哪儿了?
常规位置是目录 /etc/bash_completion.d/。它不需要标记为可执行文件才能放在该目录中,也不需要具有任何特定名称。您的格式正确。
作为测试,只需键入
source /path/to/your/completion.file
,然后查看 vim 是否“忽略”以波浪号结尾的文件。应该会 - 在我的 bash shell 中确实会这样。确保:
1. 将内容从脚本复制到 .bashrc 文件中,或者
2. 将其复制到 /etc/bash_completion.d/或者
3. 通过 .bashrc 获取补全文件
无论你使用哪种方法,如果你不获取文件,你需要重新启动终端才能启动它。如果它在 /etc/bash_completion.d 目录中,重新加载 bash 不会加载它;我不得不关闭终端窗口并重新打开它 - 这可能是终端程序特有的,但获取 .bashrc 对于这种情况(选项 2)来说是不够的。一旦获取 .bashrc,其他两个选项就会开始工作。
如果这是在您的环境中加载;即declare -F | grep ..
和type ..
命令返回预期值,并发回结果。我认为这种情况不太可能发生,在采取这种做法之前,值得进行这些快速检查。