bash - 大文字と小文字を無視しますが、あいまいな場合はオートコンプリートを許可しません。

bash - 大文字と小文字を無視しますが、あいまいな場合はオートコンプリートを許可しません。

最近、bashオートコンプリートを使用して大文字と小文字を無視するのに問題が発生しました。

次のディレクトリがあるとしましょう。

[xiaobai@xiaobai test]$ l
total 20K
3407873 drwx------. 60 xiaobai xiaobai 4.0K May 25 17:17 ../
3409017 drwxrwxr-x.  2 xiaobai xiaobai 4.0K May 25 17:35 hello/
3681826 drwxrwxr-x.  2 xiaobai xiaobai 4.0K May 25 17:55 Hello_STACKOVERFLOW/
3681837 drwxrwxr-x.  2 xiaobai xiaobai 4.0K May 25 17:55 Hello_StackOverflow/
3412549 drwxrwxr-x.  5 xiaobai xiaobai 4.0K May 25 17:56 ./
[xiaobai@xiaobai test]$

次に cd h[Tab]:

[xiaobai@xiaobai test]$ cd h #and press [Tab]
hello/               Hello_StackOverflow/ Hello_STACKOVERFLOW/ 
[xiaobai@xiaobai test]$ cd hello #auto generate

新しいコマンドプロンプトにはオートコンプリート"hello"があり、代替"hello"が存在することがわかります。しかし、ここでは/を入力するか、[Enter]キーを押してhello /を入力することができ、問題はありません。または、アンダースコア_を挿入して[Tab]を押してHello_*:

[xiaobai@xiaobai test]$ cd hello_ #and press [Tab]
Hello_StackOverflow/ Hello_STACKOVERFLOW/ 
[xiaobai@xiaobai test]$ cd Hello_StackOverflow #auto generate

今問題は明らかになった。私の目標が「Hello_STACKOVERFLOW /」ならどうなりますか?「tackOverflow」を削除するには、バックスペースキーを押す必要があります。次に、T+[Tab]を挿入して目標を達成します。

私が望むもの:

[xiaobai@xiaobai test]$ cd hello_ #and press [Tab]
Hello_StackOverflow/ Hello_STACKOVERFLOW/ 
[xiaobai@xiaobai test]$ cd Hello_S #without 'tackOverflow', so i just have to type T+[Tab] without redundant erase step.

もちろん、そのような問題はないでしょう。完了 - 無視 - ケースオフ私のRC入力文書。しかし、私は大文字と小文字を無視し、あいまいさが発生したときにオートコンプリートを避けるのが好きです。これは可能ですか?

答え1

問題に対する解決策があります。

努力する:

bind 'set completion-ignore-case on'
bind 'TAB:menu-complete'
bind 'set menu-complete-display-prefix on'
bind 'set show-all-if-ambiguous on'

タイプcd hTab。行はまで拡張されますcd hello

次に、を入力します_Tab行は次に展開されます。cd Hello_StackOverflow

によるとTabTab。行は次に展開されます。cd Hello_STACKOVERFLOW/

説明する:

menu-complete完了に似ていますが、完了する単語を可能な完了リストに一度表示される単語に置き換えます。可能な補完リストを使用してメニュー補完ステップを繰り返し、各一致を順番に挿入します。リストの終わりが完了すると、着信音が鳴り(着信音スタイルの設定に従って)、元のテキストが復元されます。このコマンドはTABにバインドすることを意図していますが、デフォルトではバインドされません。

で利用可能bash-2.02-alpha1

menu-complete-display-prefixonに設定されている場合、メニュー補完はリストを繰り返す前に可能な補完リスト(空にすることができます)の共通プレフィックスを表示します。

で利用可能bash-4.2-アルファ

show-all-if-ambiguousこれは、完成関数のデフォルトの動作を変更します。 「オン」に設定すると、完了可能な単語が複数ある場合、ベルを鳴らすのではなく、一致するものがすぐに一覧表示されます。

menu-complete-display-prefix一緒に働いた後bash-4.3-アルファ

答え2

私にとって最良のオプションは単に追加することです。

bind 'set menu-complete-display-prefix on'

到着する.inputrc

最初のタブは明示的なプレフィックスを完成させます。 2番目のタブには、残りのあいまいなオプションがすべて一覧表示されます。文字を入力すると、3番目のタブでコマンドが完了します。

関連情報