Bash 完成:过滤掉备份(~)文件

Bash 完成:过滤掉备份(~)文件

我希望 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 ..命令返回预期值,并发回结果。我认为这种情况不太可能发生,在采取这种做法之前,值得进行这些快速检查。

相关内容