可以在zsh中使用Bash选项卡完成脚本吗?

时间:2010-07-14 18:52:42

标签: bash zsh tab-completion

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

6 个答案:

答案 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


有关以上3行的更多详细信息,请阅读

Bash在内置的自动完成支持方面非常棒,但是bash自动完成脚本不能直接使用zsh,因为zsh环境没有必要的bash自动完成帮助函数,如compgencomplete。它这样做是为了保持zsh会话的快速。

目前,zsh附带了适当的完成脚本,如compinitbashcompinit,它们具有支持bash自动完成脚本所需的功能。

autoload <func_name>:请注意,自动加载是在zsh中定义的,而不是bash。 autoload查找fpath命令返回的目录路径中指定的文件,并标记一个函数,以便在首次调用时加载该文件。

  • -U:加载compinit或bashcompinit等函数时忽略任何别名
  • + X:现在只需加载指定的函数fow并且不执行它

例如,在我的系统echo $fpath上返回/usr/share/zsh/site-functions/usr/share/zsh/5.0.5/functionscompinitbashcompinit都可以在/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

来源:我的代码https://github.com/reduardo7/bashx

答案 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

创建第二个.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