先找zsh
解决办法,再找bash
解决办法。
更新:事实证明,zsh
实现(基于 builtin compctl
)比bash
实现(基于 builtin complete
)简单得多。
将感兴趣的代码保存到文件(例如,frontend
)并获取它(例如,);以交互方式,或者最好从您的 bash/zsh 配置文件中。. ./frontend
一旦到位,子目录名称的自动完成~/Desktop/Work/Frontend
将按如下方式工作:
- 例如,键入,
frontend myProject
然后按 TAB。
myProject
然后与以下子目录的名称进行前缀匹配~/Desktop/Work/Frontend
:
- 如果只有 1 个匹配项,
myProject
将立即扩展到完整的子目录名称。
- 否则,会发出哔声,表示有多个匹配项:
zsh
:所有匹配的子目录的名称都会立即列出。
bash
:再次按 TAB列出所有匹配的子目录的名称
- 继续键入直到前缀匹配明确,然后再次按 TAB。
注意:在bash
中,也只需按 TAB一次即可列出多个匹配项,请将以下内容添加到您的 shell 配置文件bind "set show-all-if-ambiguous on"
中。
zsh解决方案:
# Define the shell function.
frontend(){
cd ~/Desktop/Work/Frontend/"${1:-}"
}
# Tell zsh to autocomplete directory names in the same directory as
# the function's when typing a command based on the shell function.
compctl -/ -W ~/Desktop/Work/Frontend frontend
重击解决方案:
注意:complete -o dirnames
不幸的是,它不带参数 - 它总是自动完成当前目录。因此,需要一个返回潜在匹配项的自定义 shell 函数,并结合-o filenames
, 。
# Define the main shell function.
frontend(){
local BASEDIR=~/Desktop/Work/Frontend
cd "$BASEDIR/${1:-}"
}
# Define the custom completion function.
_frontend_completions() {
local BASEDIR=~/Desktop/Work/Frontend
# Initialize the array variable through which
# completions must be passed out.
COMPREPLY=()
# Find all matching directories in the base folder that start
# with the name prefix typed so far and return them.
for f in "$BASEDIR/${COMP_WORDS[COMP_CWORD]}"*; do
[[ -d $f ]] && COMPREPLY+=( "$(basename "$f")" )
done
}
# Tell bash to autocomplete directory names as returned by the
# _frontend_completions() helper functoin when typing a command
# based on the main shell function.
complete -o filenames -F _frontend_completions frontend fe