我有一个用于 Apache Hadoop 的 Bash 选项卡完成脚本。通常,我使用 zsh 作为我的日常 shell。当我需要它时,它往往非常类似于 bash,但它们之间的制表符补全系统看起来完全不同。有没有一种简单的方法可以“转换”现有的 bash-tab-completion 定义以在 zsh 中工作?我不想在这方面投入大量时间,但如果这很容易,我会节省一些精力。
6 回答
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)
没有任何 ~/.zshrc的情况下运行 zsh ,并且上述序列在新生成的 zsh shell 中工作。
感谢 git-completion.bash 脚本的提示:D
阅读以上 3 行的更多详细信息:
Bash 在内置的自动完成支持方面非常棒,但是 bash 自动完成脚本不能直接在 zsh 中工作,因为 zsh 环境没有基本的 bash 自动完成帮助函数,如compgen
, complete
. 这样做是为了使 zsh 会话保持快速。
如今,zsh 附带了适当的完成脚本,例如compinit
并且bashcompinit
具有支持 bash 自动完成脚本所需的功能。
autoload <func_name>
:请注意,自动加载是在 zsh 而不是 bash 中定义的。autoload
查找在 command 返回的目录路径中命名的文件,fpath
并标记一个函数以在首次调用时加载该文件。
- -U:在加载 compinit 或 bashcompinit 等函数时忽略任何别名
- +X:现在只加载命名函数 fow 并且不执行它
例如,在我的系统上echo $fpath
返回/usr/share/zsh/site-functions
and/usr/share/zsh/5.0.5/functions
和 both compinit
andbashcompinit
都可以在/usr/share/zsh/5.0.5/functions
.
同样对于大多数人来说,可能只是autoload -U +X bashcompinit && bashcompinit
需要,因为 git autocomplete 或他们自己的其他脚本~/.zshrc
可能正在执行autoload -U +X compinit && compinit
,但同时运行它们是安全的。
从此页面(日期为 2010/01/05):
Zsh 可以处理 bash 完成功能。zsh 的最新开发版本有一个函数 bashcompinit,运行时将允许 zsh 读取 bash 完成规范和函数。这记录在 zshcompsys 手册页中。要使用它,您只需在 compinit 之后的任何时间运行 bashcompinit。它将定义与 bash 内置函数相对应的完整函数和 compgen 函数。
使用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
我将Antigen作为 Oh-My-Zsh 插件管理器运行。我有一些由同事编写的 bash 完成脚本,我想用一个简单的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
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
@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