どうすればbashのオートコンプリートワイルドカードを使用できますか?


10

ファイルを含むディレクトリがある場合

foo.bar.a.cat
foo.bar.a.hat

ls f+ TABbashシェルをオートコンプリートして+ と入力しls foo.bar.a.ます。私が入力した場合ls *bar*+ TAB私はそれがオートコンプリートしたいと思います*bar*.a.。これは可能ですか?

これは質問に似ています

bashでワイルドカードのタブ補完を有効にする方法は?

しかし、「私にとっては箱から出してすぐに機能します」という提案された答えは機能しません。私も試しましたがTAB TAB、効果はありません。コマンド `` bash --version givesGNU bash、version 4.2.37(1)-release(x86_64-pc-linux-gnu) `。

回答:


14

あなたはどちらかが欲しい:

挿入完了

ALT* 「すべての補完を挿入する」

これにより、「AA AB交流広告」ファイル名を含むディレクトリ
ls a*が続くがalt + *に完了しますls aa ab ac ad

バインディングに関するmanページのエントリ:

挿入完了(M- *)

可能な補完によって生成されるはずだったポイントの前に、テキストのすべての補完を挿入します。

glob-expand-word

一部のシステムでは、上記はワイルドチャーで機能しません。以下のようなシステムでは機能します。

ctrlx*(2ストロークコンボ)

例:dirに以下を入力しました:

touch {a,b,c,d,e,f}{1,2,3,4,5,6,7,8,9,0}00{a,b,c,d,f,e}

次にがls *100*続きctrl + x, *、readlineが次のようになります。

ls a100a a100b a100c a100d a100e a100f b100a b100b b100c b100d b100e b100f c100a c100b c100c c100d c100e c100f d100a d100b d100c d100d d100e d100f e100a e100b e100c e100d e100e e100f f100a f100b f100c f100d f100e f100f

バインディングのマニュアルページエントリ:

glob-expand-word(Cx *)

ポイントの前の単語はパス名展開のパターンとして扱われ、一致するファイル名のリストが挿入され、単語が置き換えられます。数値引数が指定されている場合、パス名展開の前に「*」が追加されます。

マンページ


これは機能しません(少なくとも私にとって)。ファイルtouch aa ab ac adを作成して入力してからls a続けて入力するとalt+*リストが表示されますが、それを使用するとリストは表示されls a*ません。ワイルドカードは問題のポイントです。
2013年

上の私のためにこの作品を@Hooked GNU bash, version 4.1.2(1)-release (x86_64-redhat-linux-gnu)してGNU bash, version 4.2.0(1)-release (x86_64--netbsd)ではなくGNU bash, version 4.2.45(2)-release (i386-apple-darwin12.2.0)。そして働いたことによって、私はそれが本文に提出されたことを意味します。confファイルをチェックして、何か追加のものがあるかどうかを確認します。
おとなしそうな

奇妙なことですが、なぜこのような単純なことがバージョン間で変わるのでしょうか。それを有効にする方法に関するアイデア、またはコンパイル時に組み込まれていますか?
2013年

私は少しも困惑してる@Hooked ...それはまた、私のラズベリーパイに失敗したGNU bash, version 4.2.37(1)-release (arm-unknown-linux-gnueabihf)(raspbian)
おとなしそうな

@Hooked私にとっては、最初のものではなかったシステムで動作する反復バインディングが見つかりました。
おとなしそうな

8

これを〜/ .inputrcに追加してみてください:

set show-all-if-ambiguous on

show-all-if-ambiguousは、タブを2回ではなく1回押すと、すべての補完がリストされます。また、最初のタブプレスでグロブ式の共有プレフィックスが挿入されます。

$ touch 1.0.{1,2}
$ echo *0* # I pressed tab once here
1.0.1  1.0.2
$ echo 1.0.

glob-complete-word(\ eg)も*0*最後になしで)完了し1.0.ます。また、たとえば/System/Library/Launch*/*Findeに完了し/System/Library/LaunchAgents/com.apple.Finder.plistます。

あなたが変換したい場合*には1.0.1 1.0.2、上記の例では、いずれかのインサート・補完(\ E *)またはグロブ拡張ワード(\ Cxの*)を使用します。


4

この問題は、「bash-completion」パッケージのバグが原因で発生します。

パッケージがインストールされていない場合、bashはデフォルトの補完ですが、これはかなり一般的なファイル名補完エンジンです。

「bash-completion」パッケージは、残りの行を調べて、生成するリストについて「賢く」なるはずです。ただし、「glob」展開を正常に複製することはできません。

個人的には、このパッケージはあまりにも頑張っており、「最も一般的なユーザー」だけが使用できるようになっていると思います。

ただし、削除する前に、ファイル「/ usr / share / bash-completion / bash_completion」の先頭をチェックして、組み込みのbash補完の「全体的なチューニング」を行うための.bashrcへの便利な追加がないか確認してください。

ところで、100を超えるバグが記録されています... https://bugs.debian.org/cgi-bin/pkgreport.cgi?package=bash-completion


$ sudo yum erase bash-completion#私の問題を
修正
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.