我有一个Apache的Hadoop的Bash选项卡完成脚本。通常,我使用zsh作为我的日常shell。当我需要它时,它往往很像bash,但看起来Tab-completion系统在它们之间根本不同。有没有一种简单的方法可以将现有的bash-tab-completion定义“转换”为在zsh中工作?我不想在这方面投入大量时间,但如果这很容易,我会节省大量的精力。
答案 0 :(得分:129)
autoload bashcompinit
bashcompinit
source /path/to/your/bash_completion_file
答案 1 :(得分:31)
来自this page(日期为2010/01/05):
Zsh可以处理bash完成功能。 zsh的最新开发版本有一个函数bashcompinit,运行时允许zsh读取bash完成规范和函数。这在zshcompsys手册页中有记录。要使用它,您需要做的就是在compinit之后的任何时候运行bashcompinit。它将定义与bash builtins相对应的完整函数和compgen函数。
答案 2 :(得分:30)
autoload -U +X compinit && compinit
autoload -U +X bashcompinit && bashcompinit
source /path/to/your/bash_completion_script
我正在运行zsh zsh 5.0.2 (x86_64-apple-darwin13.0)
,没有任何〜/ .zshrc ,上面的序列在新生成的zsh shell中运行。
感谢提示的git-completion.bash脚本:D
Bash在内置的自动完成支持方面非常棒,但是bash自动完成脚本不能直接使用zsh,因为zsh环境没有必要的bash自动完成帮助函数,如compgen
,complete
。它这样做是为了保持zsh会话的快速。
目前,zsh附带了适当的完成脚本,如compinit
和bashcompinit
,它们具有支持bash自动完成脚本所需的功能。
autoload <func_name>
:请注意,自动加载是在zsh中定义的,而不是bash。 autoload
查找fpath
命令返回的目录路径中指定的文件,并标记一个函数,以便在首次调用时加载该文件。
例如,在我的系统echo $fpath
上返回/usr/share/zsh/site-functions
和/usr/share/zsh/5.0.5/functions
,compinit
和bashcompinit
都可以在/usr/share/zsh/5.0.5/functions
获得。
同样对于大多数人来说,只有autoload -U +X bashcompinit && bashcompinit
可能是必需的,因为其他一些脚本(例如git autocomplete或他们自己的~/.zshrc
)可能正在执行autoload -U +X compinit && compinit
,但只运行这两个脚本是安全的
答案 3 :(得分:2)
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
答案 4 :(得分:2)
我正在运行Antigen作为Oh-My-Zsh插件管理器。我有一些由同事编写的bash完成脚本,我想用简单的source /path/to/completion
加载到Zsh。
我遇到了一些麻烦,因为看起来像Antigen或OMZ(很难说)只关心从他们的插件加载完成脚本。我终于在bashcompinit
之后通过自动加载compinit
和 antigen apply
来解决这个问题。简单地自动加载bashcompinit
还不够。
source ~/.antigen/antigen.zsh
antigen use oh-my-zsh
antigen apply
autoload -U +X compinit && compinit
autoload -U +X bashcompinit && bashcompinit
source /path/to/bash_completion
Antigen在.zcompdump
创建$ANTIGEN_COMPDUMP
文件,对我而言~/.antigen/.zcompdump
重新调用compinit和bashcompinit在$HOME/.zcompdump
似乎可以解决所有问题,因为我可以使用/path/to/bash_completion
设置的完成次数。我已经删除了两次.zcompdump文件,以确保它们重新生成并且似乎可以正常工作。
由于在尝试完成标签时出现错误,我在机器重新启动后不得不重复几次.zcompdump文件,但我不确定是否由于此设置而导致或者是其他东西。 rm ~/.zcompdump && rm $ANTIGEN_COMPDUMP
和一个新的shell修复了这个问题。
撰写本文时使用的版本:
Antigen = v2.2.3 = d3d4ee0
Oh-my-zsh = c3b072e
Zsh = 5.3
答案 5 :(得分:0)
@JatinKumar的答案使我步入正轨,但我不得不使用complete
而不是source
。所以在一起:
autoload -Uz compinit && compinit
autoload -U +X bashcompinit && bashcompinit
complete -C /usr/local/bin/terraform terraform
complete -C /usr/local/aws/bin/aws_completer aws
complete -C /usr/local/bin/az az