使用制表符补全忽略指定的绝对目录?

使用制表符补全忽略指定的绝对目录?

我在一个有很多用户的集群上工作。集群上有 50 个用户的首字母与我的用户名相同,还有一个用户的名称直到最后一个字母都相同。当我从 Tab 键完成时,/home/e我只想看到/home/elsherbini/,而不是必须键入更多字符,按 Tab 键,然后键入最后一个字符。

看来FIGNORE 不适用于绝对路径,仅适用于文件后缀。有没有办法忽略选项卡完成的目录列表?

GNU bash,版本 4.1.2(1)-发布 (x86_64-redhat-linux-gnu)

答案1

我建议的一种方法是,alias如果我们只关心home目录路径,则将以下内容添加到您的目录中profile会有所帮助,无论您创建什么独特的别名,都应该自动完成,即使是第一个字符。

alias myHome="cd /home/elsherbini"
. .profile
my\T
pwd
/home/elsherbini

编辑:

另一种方式可能是绑定一个键但即使这也需要一个快速的double clickright click,考虑到您在 中的用法PuTTY,如果这有帮助的话。

completeIt(){ echo "elsherbini"; }
bind -x '"\C-h": completeIt;'

使用Control-H会提示您自定义的字符串,例如您的用户名。用法:

$ cd
elsherbini

答案2

我正在使用zsh它可以非常彻底地定制完成。此选项会阻止某些模式完成:

autoload -Uz compinit; compinit
# ignore some common patterns that we usually don't want as completions
zstyle ':completion:*' ignored-patterns "/usr/share/iscan" "/usr/lib/iscan" \
        "iscan" "/usr/lib/ispell" "ispell" "/usr/lib64" "/usr/lib32" \
        "/usr/libx32" "/usr/libexec" "/srv/tftp" "chkwins" "dpkg-buildflags"

答案3

您可以覆盖内置函数compgen以完成简单的目录(如cdls)。例如,将此函数放在 ~/.bashrc 中

compgen(){
    local IFS=$'\n'
    local x tmp
    x=$( builtin compgen "$@" ) &&
    while read -r tmp; do
        [[ "$tmp" =~ ^/home/e && ! "$tmp" =~ ^/home/elsherbini$ ]] ||
        echo "$tmp"
    done <<< "$x"
}

它运行内置函数compgen并过滤输出,以便从可能的补全列表中删除任何以正则表达式开头^/home/e且不匹配的行。^/home/elsherbini$请注意,正则表达式在 内没有被引用[[]]

相关内容