2016-10-06 6 views
0

使用例:source activate <env>に私のconda環境の名前(つまり、~/anaconda3/envs/のディレクトリのリスト)を自動完成させようとしています。2番目の引数にbash_autocompleteを使用するには?

私はこのコードを使用して、そこに「アクティブ化」を必要としなかった場合、それが仕事を得ることができた

_source() 
{ 
    local cur 

    COMPREPLY=() 
    cur=${COMP_WORDS[COMP_CWORD]} 

    COMPREPLY=($(ls ~/anaconda3/envs | xargs -I dirs bash -c "compgen -W dirs $cur")) 

    return 0 
} 

complete -F _source source 

私はsource\ activate'source activate'completeの最後の引数を設定しようとしましたそれは動作していません(ローカルファイルで自動完成します)。

source activateは機能ではないため、問題を起こしていないようです。

単純な解決策はもちろん、を含む1単語のbashスクリプトを作成することです。しかし、私はむしろそれを適切に行うだろう!

+1

ラッパー関数を定義すると、それを補完する*は適切な方法です。 '〜/ anaconda/envs'の内容に基づいて、' source'のすべての呼び出しが2番目の引数を完成させることは望ましくありません。 – chepner

+0

私は 'source activate'が他のものを取ることを望んでいたことは一度もありません。例はありますか? – Tunisia

+1

'source'は、別のプロセスではなく、現在のシェルで任意のシェルスクリプトを実行する組み込みのシェルコマンドです。 'source activate'は一つのコマンドではありません。これは 'activate'を最初の引数(スクリプトの名前)として' source'を呼び出すだけです。 – chepner

答えて

0

私の解決策は、this conda issueから適合させました。

最初の引数がactivateであることを確認し、入力した2番目の単語が何であれcompgenを使用します。

#!/bin/bash 
_complete_source_activate_conda(){ 
     if [ ${COMP_WORDS[COMP_CWORD-1]} != "activate" ] 
     then 
      return 0 
     fi 
     local cur=${COMP_WORDS[COMP_CWORD]} 
     COMPREPLY=($(ls ~/anaconda3/envs | xargs -I dirs bash -c "compgen -W dirs $cur")) 
     return 0 
} 

complete -F _complete_source_activate_conda source 

このスクリプトを/etc/bash_completion.d/に置きます。残念なことに、それは最初の単語のオートコンプリートを殺します。もう少し手を加えれば、おそらく両方を処理することができます。

+0

最初の単語の自動補完を取り戻すことは、ifステートメントを変更し、[this solution](http://stackoverflow.com/a/23999768/2700168)を使用する場合です。 – Tunisia

関連する問題