我正在尝试为teamocil定义 bash 自动完成,这样当我键入teamocil <tab>
它时,它应该以文件夹中的文件名完成,~/.teamocil/
而没有文件扩展名。网站上有一个例子zsh
:
compctl -g '~/.teamocil/*(:t:r)' teamocil
我怎么能用这个bash
?
编辑:受 michael_n 回答的影响,我想出了一个单行:
complete -W "$(teamocil --list)" teamocil
我正在尝试为teamocil定义 bash 自动完成,这样当我键入teamocil <tab>
它时,它应该以文件夹中的文件名完成,~/.teamocil/
而没有文件扩展名。网站上有一个例子zsh
:
compctl -g '~/.teamocil/*(:t:r)' teamocil
我怎么能用这个bash
?
编辑:受 michael_n 回答的影响,我想出了一个单行:
complete -W "$(teamocil --list)" teamocil
这是我拥有的另一个完成脚本的通用版本,它执行类似的操作。它假定一个通用的假设命令“flist”,使用由 FLIST_DIR 定义的某些文件目录来完成命令(省略选项)。
为您的程序修改以下内容(teamocil
),将默认目录从更改$HOME/flist
为$HOME/.teamocil
),定义您自己的过滤器/转换等;然后只需获取它(例如,. ~/bin/completion/bash_completion_flist
),可选择将其添加到您现有的 bash 完成列表中。
# bash_completion_flist:
# for some hypothetical command called "flist",
# generate completions using a directory of files
FLIST_DIR=${FLIST_DIR=:-"$HOME/flist"}
_flist_list_files() {
ls $FLIST_DIR | sed 's/\..*//'
}
_flist() {
local cur="${COMP_WORDS[COMP_CWORD]}"
COMPREPLY=()
[[ ${cur} != -* ]] \
&& COMPREPLY=($(compgen -W "$(_flist_list_files)" -- ${cur}))
}
complete -o bashdefault -o default -o nospace -F _flist flist 2>/dev/null \
|| complete -o default -o nospace -F _flist flist
笔记:
complete -o ...
) 在不同版本的 bash 中工作有点难。base=${filename%.*}
),但最简单的方法可以说是简单的 sed,它对文件名格式有一些假设。Bash 以另一种方式实现了类似的想法,因此 zsh 的命令和文件在 bash 中不起作用。但是您可以编写自己的自动完成规则。更多信息: