teamocil的bash完成

时间:2012-09-17 19:38:01

标签: bash bash-completion

我正在尝试为teamocil定义bash自动完成功能,这样当我输入teamocil <tab>时,它应该使用文件夹~/.teamocil/中的文件名而不是文件扩展名。网站上有zsh的示例:

compctl -g '~/.teamocil/*(:t:r)' teamocil

我如何在bash中使用它?

编辑:受michael_n的回答影响,我想出了一个单行:

complete -W "$(teamocil --list)" teamocil

2 个答案:

答案 0 :(得分:1)

这是我所做的另一个完成脚本的通用版本。它假设一个通用的假设命令“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工作有点麻烦。
  • 如果有“。”,则后缀剥离过度简化。在文件名中,留下作为读者的练习:-)有多种方法可以做到这一点(sed,awk等);最好的是通过bash-isms(base=${filename%.*}),但最简单的可以说是简单的sed,对文件名格式有一些假设。

答案 1 :(得分:0)

Bash实现了类似的想法,但另一种方式,因此zsh的命令和文件在bash中不起作用。但是你可以为自动完成编写自己的规则。更多信息: