2011-06-24 14 views
2

誰でもこれを行うことができますか?私は、このフォルダ構造を持っていると言う:ディレクトリを自動的に自動完成してディレクトリへの移動を試みるように "cd"という別名を入力してください。

Folder A 
    Folder Apple 
    Folder Orange 

私はフォルダAで現在午前なら、私は「CDのAp」と入力し、Enterキーを押した場合、それは自動的に「アップルで私を出してあげるように、私はそれが欲しいです"サブフォルダ。基本的には、部分入力に基づいてフォルダの自動完成と開こうとします。

私が現在フォルダAに入っていて、「cd ap」と入力してEnterキー(小文字の「a」)を入力すると、実際のサブフォルダ名に自動完成できなかったため、エラーが発生します。これは可能ですか?私はKornで働いています。

+0

思えます。義和TABを打つと間違っているのですか? Kornはタブの完成をサポートしていませんか? – Cfreak

+0

「アプリコット」ディレクトリもあれば、何をしたいですか? –

+0

@Cfreak良い質問;それは本当に小さな便利なものです。私は間違いなく行うことができますが、ディレクトリをオートコンプリートして入力するたびに、ESC ESCやその他のキーを押す必要があるのは遅いです。基本的には、手動でオートコンプリートして、手動でCDに書き込もうとした場合と同じように機能します。私はこれがその価値よりも重要かどうかを理解しています。 :P – carlinyuen

答えて

0

質問にはお答えできませんが、私は近いです。それは私にはタブキーを押すことがあなたのハードルではないように思えます、それは大文字です。私は感情を知っている、それはラクダのケースと不便なタイピングの間の選択のようなものだ。

私はこれをbashでやったことがあります。私が思い出すと、bashとkshはかなり近いので、それがあなたのために働くことを望んでいます。

set completion-ignore-case onは、bashで大文字と小文字を区別しない補完を有効にします。当然、これはあなたが望むかもしれない起動スクリプトに入ります。

幸運にも、kshで動作するかどうか教えてください!

+0

ああ残念ながら、それは動作していないようですが、とにかく返信いただきありがとうございます!私はbashに切り替えることを検討するかもしれません。とにかくそれが良いと聞きました。 :P – carlinyuen

+0

@Carlin:それはkshではうまくいきません。それはシステムに定着するときに私がやる最初のことの一つです。 –

0

はここ(未テスト)kshの機能のkshで

cd() { 
    typeset prefix=$1 
    typeset destination="" 
    for f in *; do 
    [[ -d "$f" ]] || continue 
    case "$f" in 
     "$prefix"*) destination="$f"; break ;; 
    esac 
    done 
    if [[ -z "$destination" ]]; then 
    print -u2 "error: can't find directory with prefix '$prefix'" 
    else 
    command cd "$destination" 
    fi 
} 

Escキー \は、bashのタブ補完のと同等であるのです。

+1

ありがとうグレン;残念ながら、それは私に "制限された:cdはシェル組み込みです"と述べています。私はコードを感謝します! – carlinyuen

0

Bashの場合は、~/.bashrcに以下を追加できます。デフォルトでは、大文字と小文字を区別しないマッチングが行われます。少し長めですが、シンボリックリンクのディレクトリからcd ../my_direcをオートコンプリートしようとした場合を除き(hereを参照してください)

このスクリプトを使用して大文字と小文字を区別しないでください。 insensitve、あなたにもまた、そのためTAB-完成はまた、大文字と小文字を区別しないで、あなたの~/.bashrcbind 'set completion-ignore-case on'が追加される場合があります。

cd() { 
    # Attempts to autocomplete the directory name 
    # 
    # If it fails to find a match, it'll still execute the input, in case the argument was 
    # something like "-". 
    case_insens=1 # set to one if you want it to try case-insensitive matching 

    # for exact matches, cd immediately 
    if [ -d "$1" ]; then 
     builtin cd "$1" 
     return 
    fi 
    # deal with no arguments passed 
    if [ $# -eq 0 ]; then 
     builtin cd 
     return 
    fi 

    # first loop for case-sensitive (since we prefer a case-sensitive match) 
    # for more on this globbing, see: bit.ly/1CZ9qym 
    for element in "$(dirname "$1")"/{*,.[!.]*,..?*}; do 
     # skip if this result is not a directory 
     [ -d "$element" ] || continue 

     if [[ "$(basename "$element")" == "$(basename "$1")"* ]]; then 
      # if there's no ambiguity, switch to that folder 
      if [ $(find -L "$(dirname "$1")" -maxdepth 1 -name "$(basename "$1")*" -type d 2>/dev/null | wc -l) -gt 1 ]; then 
       echo "'$1' matches multiple results: " 
       echo "$(find -L "$(dirname "$1")" -maxdepth 1 -name "$(basename "$1")*" -type d 2>/dev/null)" 
       # try to cd anyway 
       builtin cd "$1" &> /dev/null 
       unset case_insens element 
       return 
      else 
       builtin cd "$element" 
       unset case_insens element 
       return    
      fi 
     fi 
    done 

    if [ $case_insens -eq 1 ]; then 
     #case-insensitive argument 
     ci_arg="${1,,}" 
    else 
     builtin cd "$1" 
     unset case_insens element 
     return 
    fi 

    #Case-insensitive loop 
    for element in "$(dirname "$1")"/{*,.[!.]*,..?*}; do 
     # skip if this result is not a directory 
     [ -d "$element" ] || continue 

     ci_element_name="$(basename "${element,,}")" 
     if [[ "$ci_element_name" == "$(basename "$ci_arg")"* ]]; then 
      # if there's no ambiguity, switch to that folder 
      if [ $(find -L "$(dirname "$element")" -maxdepth 1 -iname "${ci_element_name}*" -type d 2>/dev/null | wc -l) -gt 1 ]; then 
       echo "'$ci_arg' matches multiple results: " 
       echo "$(find -L "$(dirname "$element")" -maxdepth 1 -iname "${ci_element_name}*" -type d 2>/dev/null)" 
       # try to cd anyway 
       builtin cd "$1" &> /dev/null 
       unset ci_arg case_insens ci_element element 
       return 
      else 
       builtin cd "$element" 
       unset ci_arg case_insens ci_element element 
       return 
      fi 
     fi 
    done 
    # we still haven't found a match, so pass the (faulty) argument to the cd command 
    builtin cd "$1" 
    unset ci_arg case_insens ci_element element 
} 

それは多くの予期しない結果をもたらすだろうと同様に使用例

cd ~ 
cd deskt 
+0

私はOPのkshについて尋ねましたが、私はこの質問に出くわすBashユーザーのためにこれを投稿しています。 – Garrett

関連する問題