Apache の Hadoop 用の Bash タブ補完スクリプトがあります。通常、私は日常のシェルとして zsh を使用します。必要な場合はかなりbashのようになる傾向がありますが、タブ補完システムはそれらの間で根本的に異なるようです. 既存の bash-tab-completion 定義を zsh で動作するように「変換」する簡単な方法はありますか? 私はこれに多くの時間を投資したくありませんが、それが簡単であれば、適度な労力を節約できます.
6 に答える
autoload bashcompinit
bashcompinit
source /path/to/your/bash_completion_file
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 行の詳細については、以下を参照してください。
compgen
Bash には素晴らしい自動補完サポートが組み込まれていますが、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/functions
compinit
bashcompinit
/usr/share/zsh/5.0.5/functions
autoload -U +X bashcompinit && bashcompinit
また、ほとんどの人にとっては、 git autocomplete などの他のスクリプトや独自のスクリプトが実行され~/.zshrc
ている可能性があるため、のみが必要になる場合がありますautoload -U +X compinit && compinit
が、両方を実行するだけで安全です。
このページから(2010 /01/05日付):
Zshはbash補完機能を処理できます。zshの最新の開発バージョンには関数bashcompinitがあり、実行時にzshがbashの完了仕様と関数を読み取ることができます。これは、zshcompsysのマニュアルページに記載されています。これを使用するには、compinitの後いつでもbashcompinitを実行するだけです。これは、bashビルトインに対応する完全なcompgen関数を定義します。
使用する場合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