1

我正在尝试为teamocil定义 bash 自动完成,这样当我键入teamocil <tab>它时,它应该以文件夹中的文件名完成,~/.teamocil/而没有文件扩展名。网站上有一个例子zsh

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

我怎么能用这个bash

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

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

2 回答 2

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,它对文件名格式有一些假设。
于 2012-09-19T03:45:41.713 回答
0

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

于 2012-09-17T20:38:16.103 回答