93

我有一个用于 Apache Hadoop 的 Bash 选项卡完成脚本。通常,我使用 zsh 作为我的日常 shell。当我需要它时,它往往非常类似于 bash,但它们之间的制表符补全系统看起来完全不同。有没有一种简单的方法可以“转换”现有的 bash-tab-completion 定义以在 zsh 中工作?我不想在这方面投入大量时间,但如果这很容易,我会节省一些精力。

4

6 回答 6

174
autoload bashcompinit
bashcompinit
source /path/to/your/bash_completion_file
于 2011-12-13T15:49:27.763 回答
46
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-functionsand/usr/share/zsh/5.0.5/functions和 both compinitandbashcompinit都可以在/usr/share/zsh/5.0.5/functions.

同样对于大多数人来说,可能只是autoload -U +X bashcompinit && bashcompinit需要,因为 git autocomplete 或他们自己的其他脚本~/.zshrc可能正在执行autoload -U +X compinit && compinit,但同时运行它们是安全的。

于 2015-01-09T04:44:21.597 回答
41

从此页面(日期为 2010/01/05):

Zsh 可以处理 bash 完成功能。zsh 的最新开发版本有一个函数 bashcompinit,运行时将允许 zsh 读取 bash 完成规范和函数。这记录在 zshcompsys 手册页中。要使用它,您只需在 compinit 之后的任何时间运行 bashcompinit。它将定义与 bash 内置函数相对应的完整函数和 compgen 函数。

于 2010-07-15T01:26:55.077 回答
5

使用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

于 2016-01-08T15:59:53.557 回答
5

我将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
于 2018-01-20T20:34:11.577 回答
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
于 2020-09-22T15:48:02.780 回答