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

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)

  • 这是更好的答案,因为它告诉你*如何*使用bashcompinit.不错的工作. (9认同)
  • 这不适合我.我还在完成:13:命令未找到:compdef`错误. (5认同)
  • 谢谢,很好的答案,不幸的是,如果脚本使用_init_completion bash命令,这不起作用. (4认同)

Pau*_*ce. 36

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

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


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


有关上述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无一不compinitbashcompinit可在/usr/share/zsh/5.0.5/functions.

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

  • 这仍然没有意义; manpage描述了`+ X foo`的重点是做同样的自动加载只是调用`foo`,但没有立即执行它......所以`autoload + X foo && foo`似乎完全是多余的.你能解释一下为什么选择这种模式吗? (6认同)
  • 手册页在这一点上仍然有些不清楚,在我看来:“autoload +X”加载函数而不执行它——这比没有“+X”的“autoload”更多。如果没有`+X`,自动加载**甚至**不会加载该函数;它只是将名称标记为引用稍后要加载的函数。在首次调用该函数之前不会尝试实际加载。如果要确定指定函数是否_成功_加载,则需要使用`+X`立即执行加载步骤。 (3认同)
  • @ELLIOTTCABLE 执行 `autoload -U +X bashcompinit &amp;&amp; bashcompinit` 的要点是(由于 `&amp;&amp;`)它将在实际找到模块时执行 `bashcompinit`。正常的 `autoload foo` 总是返回 true。稍后,当您尝试运行 `foo` 时,_then_ zsh 最终告诉您“找不到函数定义文件”。使用“autoload +X”,您会立即收到错误消息。 (2认同)

Edu*_*omo 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
Run Code Online (Sandbox Code Playgroud)

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


Wal*_*ger 5

我将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)


jsc*_*ter 5

@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)