代码之家  ›  专栏  ›  技术社区  ›  Coderer

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

  •  66
  • Coderer  · 技术社区  · 16 年前

    我有一个用于Apache Hadoop的bash选项卡完成脚本。通常,我使用zsh作为我的日常外壳。当我需要它的时候,它看起来很像bash,但是看起来标签完成系统在它们之间是完全不同的。有没有一种简单的方法可以将现有的bash选项卡完成定义“转换”到zsh中?我不想在这方面投入太多时间,但如果容易的话,我会节省一些精力。

    5 回复  |  直到 8 年前
        1
  •  27
  •   Dennis Williamson    16 年前

    this page (日期:2010/01/05)

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

        2
  •  127
  •   freestyler    14 年前
    autoload bashcompinit
    bashcompinit
    source /path/to/your/bash_completion_file
    
        3
  •  28
  •   Jatin Kumar    11 年前
    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壳中工作。

    感谢git-completion.bash脚本提供的提示:d


    请继续阅读以上3行的详细信息:

    bash有很棒的内置自动完成支持,但是bash自动完成脚本不能直接运行zsh,因为zsh环境没有必要的bash自动完成助手功能,比如 compgen , complete . 这样做是为了保持zsh会话的速度。

    现在,zsh附带了适当的完成脚本,比如 compinit bashcompinit 它具有支持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/functions 而且两者 康密特 巴西康尼 可在 /usr/share/zsh/5.0.5/功能 .

    对大多数人来说 autoload -U +X bashcompinit && bashcompinit 是必需的,因为其他一些脚本,如git autocomplete或它们自己的脚本 ~/.zshrc 可能正在做 autoload -U +X compinit && compinit ,但只运行这两个是安全的。

        4
  •  1
  •   Eduardo Cuomo Sajjad Ali Khan    9 年前

    为了 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

        5
  •  1
  •   Walter Wilfinger    8 年前

    我在跑步 Antigen 作为一个oh my zsh插件管理器。我有几个同事写的bash完成脚本,我想用一个简单的 source /path/to/completion .

    我遇到了一些麻烦,因为抗原或OMZ(很难说)似乎只关心从插件加载完成脚本。我终于通过自动加载解决了这个问题 bashcompinit compinit 之后 antigen apply . 只需自动加载 巴西康尼 还不够。

    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
    

    抗原产生了 .zcompdump 文件在 $ANTIGEN_COMPDUMP 对我来说 ~/.antigen/.zcompdump

    对compinit和bashcompinit的重新调用在处创建第二个.zcompdump $HOME/.zcompdump

    似乎 因为我可以使用 /path/to/bash_completion . 我已经删除了两个.zcompdump文件几次,以确保它们都重新生成并能正常工作。

    在机器重新启动后,我不得不对.zcompdump文件进行几次rm操作,因为在尝试选项卡完成时引发了错误,但我不确定这是否是由于此设置或其他原因造成的。 rm ~/.zcompdump && rm $ANTIGEN_COMPDUMP 一个新的外壳为我修复了它。

    编写时使用的版本:

    Antigen = v2.2.3 = d3d4ee0
    Oh-my-zsh = c3b072e
    Zsh = 5.3
    
    推荐文章