我在一个有很多用户的集群上工作。集群上有 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 click
和right 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
以完成简单的目录(如cd
和ls
)。例如,将此函数放在 ~/.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$
请注意,正则表达式在 内没有被引用[[]]
。