我有一个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提供了相应的完成脚本,如compinit
和bashcompinit
,它们具有支持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/functions
和bashcompinit
都可以在/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