ワイルドカードを使用した Bash オートコンプリート

ワイルドカードを使用した Bash オートコンプリート

emacs と同じようにターミナルに入力したいと思います:

emacs 2019-*subject*

ヒットするとTab最初の一致が表示されます:

2019-08-03-subject.markdown 

私が望んでいるのは、次のようなオプションが表示されることです。

2019-08-03-subject.markdown 2019-bla-bla-subject-predicate.markdown etc...

オンラインであらゆる場所を調べましたが、これが機能ではないとは信じられません。

がある多くの 似ている質問が寄せられました。答えは私が望むようには機能しません(上記参照)私が試した他の解決策:ここ

PS 私は Ubuntu 16 を使用しています。これは、ファイルを開くときに emacs で見つかる典型的な機能です。非常に便利です。

答え1

その後何が起こるかはTab完了スクリプトによって異なります。この答え2013 年には少なくとも 1 人のユーザーにとって望ましい動作があったと信じていますが、2019 年の Debian 9 での動作はあなたが説明したとおりです。スクリプトや動作がそれ以降変更されている可能性があります。

さらに、Bash は入力されたコマンド (現在の行の最初の単語) に応じてスクリプトを選択します。 1 つの変更がすべての補完に影響し、必要な結果が得られるかどうかはすぐにはわかりません (この_filedir関数は良いスタートだと思います)。


幸いなことに、必要に応じて拡張が可能です。以下からman 1 bashREADLINEヘッダーの下):

glob-complete-word( M-g)
ポイントの前の単語は、暗黙的にアスタリスクが付加されたパス名拡張のパターンとして扱われます。このパターンは、補完候補として一致するファイル名のリストを生成するために使用されます。

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

glob-list-expansions( C-x g)
によって生成された展開のリストglob-expand-wordが表示され、行が再描画されます。数値引数が指定された場合は、パス名展開の前にアスタリスクが追加されます。

M-gC-x *およびC-x gデフォルトのキーバインディングについて説明します。よりわかりやすい形式では、次のようになります。

  • Meta+ g( Alt+ g) はglob-complete-word
  • Ctrl+ x、(リリースCtrl) (*glob-expand-word:私のキーボードでは*実際にはShift+です)、8
  • Ctrl+ x、 (リリースCtrl)gglob-list-expansions

次のコードは、これらのバインディングを設定します (何らかの理由でバインディングが欠落している場合)。

  • 現在のシェルのみ:

    # commands to run in Bash
    bind '"\eg":   glob-complete-word'
    bind '"\C-x*": glob-expand-word'
    bind '"\C-xg": glob-list-expansions'
    
  • または永続的な設定(/etc/inputrcまたは~/.inputrc)で:

    # lines to add
    "\eg":   glob-complete-word
    "\C-x*": glob-expand-word
    "\C-xg": glob-list-expansions
    

    (注意:これは新しいシェルにのみ影響します。リロード)。


glob-complete-wordまたはに興味があるでしょうglob-list-expansions。主な違い:

  • glob-complete-wordは常にアスタリスクを追加しますが、 はglob-list-expansions条件付きでこれを行います (引用されているマニュアルを参照)。
  • 一致が多数ある場合は、glob-complete-word何かを印刷する前に2回トリガーする必要がある(つまり、キーの組み合わせを2回押す)場合があります。これはshow-all-if-ambiguousすでに述べた答え
  • 一致するものが 1 つだけの場合は、glob-complete-word実際の行補完が実行されますが、glob-list-expansions一致するものだけが表示されます。

あなたの特定のケースでは、次のように入力します:

emacs 2019-*subject*

次にCtrl+ xg

関連情報