Cod*_*rer 80 bash zsh tab-completion
我有一个Apache的Hadoop的Bash选项卡完成脚本.通常,我使用zsh作为我的日常shell.当我需要它时,它往往很像bash,但看起来Tab-completion系统在它们之间根本不同.有没有一种简单的方法可以将现有的bash-tab-completion定义"转换"为在zsh中工作?我不想在这方面投入大量时间,但如果这很容易,我会节省适量的努力.
fre*_*ler 146
autoload bashcompinit
bashcompinit
source /path/to/your/bash_completion_file
Run Code Online (Sandbox Code Playgroud)
Jat*_*mar 36
autoload -U +X compinit && compinit
autoload -U +X bashcompinit && bashcompinit
source /path/to/your/bash_completion_script
Run Code Online (Sandbox Code Playgroud)
我正在运行zsh 5.0.2 (x86_64-apple-darwin13.0) 没有任何〜/ .zshrc的 zsh ,上面的序列在新生成的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,但是只运行它们是安全的.
用来zsh:
compdefcompadd我的例子:
# 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
Run Code Online (Sandbox Code Playgroud)
来源:我的代码https://github.com/reduardo7/bashx
我将Antigen作为 Oh-My-Zsh 插件管理器运行。我有一些同事编写的 bash 完成脚本,我想用一个简单的 .bash 文件加载到 Zsh 中source /path/to/completion。
我遇到了一些麻烦,因为似乎 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
Run Code Online (Sandbox Code Playgroud)
Antigen 创建它的.zcompdump文件$ANTIGEN_COMPDUMP,对我来说是~/.antigen/.zcompdump
重新调用 compinit 和 bashcompinit 会在以下位置创建第二个 .zcompdump $HOME/.zcompdump
这似乎都解决了,因为我能够使用/path/to/bash_completion. 我已经多次删除了 .zcompdump 文件以确保它们重新生成并且似乎可以工作。
由于尝试完成选项卡时抛出错误,我不得不在机器重新启动后多次 rm .zcompdump 文件,但我不确定这是由于此设置还是其他原因。rm ~/.zcompdump && rm $ANTIGEN_COMPDUMP一个新的外壳为我解决了这个问题。
撰写本文时使用的版本:
Antigen = v2.2.3 = d3d4ee0
Oh-my-zsh = c3b072e
Zsh = 5.3
Run Code Online (Sandbox Code Playgroud)
@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
Run Code Online (Sandbox Code Playgroud)