93

Apache の Hadoop 用の Bash タブ補完スクリプトがあります。通常、私は日常のシェルとして zsh を使用します。必要な場合はかなり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 シェルで機能しました。

ヒントの git-completion.bash スクリプトに感謝します:D


上記の 3 行の詳細については、以下を参照してください。

compgenBash には素晴らしい自動補完サポートが組み込まれていますが、zsh 環境にはcomplete. これは、zsh セッションを高速に保つために行われます。

最近の zshには、bash オートコンプリート スクリプトをサポートするために必要な機能を備えたcompinitや などの適切な完了スクリプトが付属しています。bashcompinit

autoload <func_name>: autoload は bash ではなく zsh で定義されていることに注意してください。autoloadコマンドによって返されたディレクトリ パスで指定されたファイルを検索しfpath、関数が最初に呼び出されたときに同じファイルをロードするようにマークします。

  • -U: compinit や bashcompinit などの関数をロードするときにエイリアスを無視します
  • +X:名前付き関数 f をロードするだけで、実行しない

たとえば、私のシステムでは、 and とandの両方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が、両方を実行するだけで安全です。

于 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 に答える