2011-12-14 17 views
4

を追加しますCDWのYYY/AA <カーソルを>カスタムディレクトリの完成は、私は次のディレクトリ構造を持っている空白

CDWのYYY/<TAB>を追加して得ることができます私がこれまで持って
CDW yを<TAB> => CDWのYYY <SPACE> <CURSOR>

次のコード:

_cdw() { 
    local cur prev dirs 
    COMPREPLY=() 
    cur="${COMP_WORDS[COMP_CWORD]}" 
    prev="${COMP_WORDS[COMP_CWORD-1]}" 
    COMPREPLY=($(compgen -d -- /home/tichy/xxx/${cur}|perl -pe 's{^/home/tichy/xxx/}{}')) 
    # no difference, a bit more logical: 
    dirs=$(compgen -o nospace -d /home/tichy/xxx/${cur}|perl -pe 's/{^/home/tichy/xxx/}{}') 
    COMPREPLY=($(compgen -d -W ${dir} ${cur}|perl -pe 's{^/home/tichy/xxx/}{}')) 
    return 0 
} 
complete -F _cdw cdw 
cdw() { 
    cd /home/tichy/xxx/[email protected] 
} 
私が思いついた

ソリューションは私に次のようになります

何か問題がありますか?完了プロセスは終了したように見え、それ以上の入力を期待していないようです。このようなものについてはどのように

+0

あなたは '<' and '>' のように見えるように '' '<の平均と' >ましたか?がんばろう。 – shellter

+0

はい、申し訳ありませんが、私のプレビューに表示されませんでした – tichy

答えて

2

COMPREPLY=($(cdw; compgen -W "$(for d in ${cur}* ${cur}*/*; do [[ -d "$d" ]] && echo $d/; done)" -- ${cur})) 

(。私はあなたがここたりないから、あなたのシェル関数を呼び出すことができるかどうかわからないんだけど、そうでない場合は、あなたがそれを少しを複製する必要があります)

+0

それは動作しません:それは基本的に_compgen -d -o dirnames $ {cur} _何をしますか。それは私には必要のない完全なパスを与えてくれます(例えば_/home/tichy /..._(普通のperlコマンドで除外することもできます)。私はそれを理解する限り、ディレクトリを/と後置したい:これは何dirs = $(compgen -o nospace -o dirnames/home /.../$ { – tichy

+0

@tichy:それはうまくいきます:私はそれを今使っています。パーツは、私は別の方法として、cdwを使用していない、別のシェルスクリプトを使用しているということです。compgen -d -o dirnamesは、私のサブディレクトリも探して、最後にスラッシュを追加します。サブディレクトリを追加することで、スペースが追加されないようにすることができます(それ以上のサブディレクトリがない限り)ので、-o nospaceは必要ありません。 – Tanktalus

+0

私は謝罪します:スクリプトに貼り付ける際にエラーが発生しているに違いありません。私の意図どおりの仕事。 – tichy

4

私が正しく理解していれば、ディレクトリ名をbash-autocompleteして余分なスペースを使いたくないのですか? (これは私がこのページに行ったときに探していたものです)。

もしそうなら、補完機能を登録するときは、 "-o nospace"を使用します。

complete -o nospace -F _cdw cdw 

NOSPACEがcompgen上で動作するかどうかはわかりません。

5

私がこれまでに見つけた最も簡単な解決策は、次のようになり補完生成することです:

COMPREPLY=$(compgen -W "file1 file2 file3 dir1/ dir2/ dir3/") 

をし、ちょうどこれがNOSPACEオプションを設定します

[[ $COMPREPLY = */ ]] && compopt -o nospace 

を返す前に、この行を追加するたびに完了するとスラッシュまで入力され、ユーザーは次のようになります。

cmd dir1/<cursorhere> 

inst EAD:

cmd dir1/ <cursorhere> 

、ユーザーがで終わるように、完成は完全なファイル名まで記入する時はいつでも、それはNOSPACEオプションを設定しません:

cmd file1 <cursorhere> 

の代わり:

cmd file1<cursorhere> 
0

補完は、回避策なしで、/ etc/bash_completionに定義されたfunciton _filedirを提供します。

626 # This function performs file and directory completion. It's better than 
627 # simply using 'compgen -f', because it honours spaces in filenames. 
628 # @param $1 If `-d', complete only on directories. Otherwise filter/pick only 
629 #   completions with `.$1' and the uppercase version of it as file 
630 #   extension. 
631 # 
632 _filedir() 

その後、次の指定は十分です:

_cdw() { 
    local cur prev dirs 
    cur="${COMP_WORDS[COMP_CWORD]}" 
    prev="${COMP_WORDS[COMP_CWORD-1]}" 
    _filedir # add -d at the end to complete only dirs, no files 
    return 0 
} 
関連する問題