我有一个bash-tab-completion脚本。 有没有一个简单的方法来使用它从zsh?

我有一个用于Apache Hadoop的bash-tab-completion脚本。 通常情况下,我使用zsh作为我的日常shell。 当我需要它的时候,它往往是非常棒的,但是它们看起来像tab-completion系统是完全不同的。 有没有简单的方法来“转换”现有的bash-tab-completion定义在zsh中工作? 我不想在这里投入大量的时间,但如果这很容易,我会省下一定的努力。

从此页 (2010/01/05):

Zsh可以处理bash完成function。 zsh的最新开发版本有一个函数bashcompinit,运行时将允许zsh读取bash完成规范和函数。 这在zshcompsys手册页中有logging。 要使用它,你需要做的就是在compinit之后随时运行bashcompinit。 它将定义对应于bash buildins的完整和compgen函数。

 autoload bashcompinit bashcompinit source /path/to/your/bash_completion_file 
 autoload -U +X compinit && compinit autoload -U +X bashcompinit && bashcompinit source /path/to/your/bash_completion_script 

我正在运行没有任何〜/ zsh 5.0.2 (x86_64-apple-darwin13.0) zsh zsh 5.0.2 (x86_64-apple-darwin13.0) ,上面的顺序在一个新产生的zsh shell中工作。

感谢git-completion.bash脚本的提示:D


阅读以上3行的更多细节:

Bash在构build自动完成支持方面很棒,但是bash自动完成脚本不能直接使用zsh,因为zsh环境没有像compgen这样的基本bash自动完成辅助函数。 它这样做是为了尽快保持zsh会话。

现在,zsh提供了相应的完成脚本,如compinitbashcompinit ,它们具有支持bash自动完成脚本所需的function。

autoload <func_name> :请注意,autoload在zsh中定义而不是bash。 autoload查找由fpath命令返回的目录path中指定的文件,并标记一个函数以便在第一次调用时加载该文件。

  • -U:加载像compinit或bashcompinit这样的函数时,忽略任何别名
  • + X:现在加载已命名的函数,不要执行它

例如在我的系统echo $fpath返回/usr/share/zsh/site-functions/usr/share/zsh/5.0.5/functionsbashcompinit都可以在/usr/share/zsh/5.0.5/functions

对于大多数人也可能只是autoload -U +X bashcompinit && bashcompinit是必需的,因为像git自动完成或其自己~/.zshrc autoload -U +X bashcompinit && bashcompinit其他脚本可能会autoload -U +X compinit && compinit ,但是可以安全地运行他们。

对于zsh使用:

  • compdef
  • compadd

我的例子:

 # bash completion for bxrun (/home/ecuomo/projects/bashx/bxrun) _bxrun_methods() { grep "^\s*\(function\s\+\)\?__.\+()\s*{.*$" "${1}" | while read line ; do echo "$line" | sed "s/()\s*{.*//g" | sed "s/\s*\(function\s\+\)\?__//g" done } _bxrun_lst() { if [ -d "/home/ecuomo/projects/bashx/src/actions" ]; then for f in /home/ecuomo/projects/bashx/src/actions/* ; do if [ -f "${f}" ]; then basename "${f}" | sed 's/\..*$//g' fi done fi _bxrun_methods "/home/ecuomo/projects/bashx/bxrun" _bxrun_methods "/home/ecuomo/projects/bashx/src/bashx.sh" } _bxrun() { local cur COMPREPLY=() cur=${COMP_WORDS[COMP_CWORD]} COMPREPLY=( $( compgen -W '$( _bxrun_lst )' -- $cur ) ) } _bxrun_zsh() { compadd `_bxrun_lst` } if type complete >/dev/null 2>/dev/null; then # bash complete -F _bxrun bxrun else if type compdef >/dev/null 2>/dev/null; then # zsh compdef _bxrun_zsh bxrun fi; fi 

来源:我的代码https://github.com/reduardo7/bashx