インテリジェント補完が失敗した場合は、Bash の通常のタブ補完を強制する

インテリジェント補完が失敗した場合は、Bash の通常のタブ補完を強制する

タブ補完がシェルの標準機能になって以来、私はその機能をとても気に入っています。Bash のインテリジェント補完 (evince foo<TAB> と入力すると PDF ファイルのみを検索する) も気に入っています (正しく推測される限り)。

Bash がインテリジェント補完機能を使用して補完を拒否すると、本来は楽しいはずの一日が台無しになります。

今日私がしたかったこと:

tar xvf centos5.8_x86_1.ova

そこで私は入力しました:

tar xvf cent<TAB>

.ova-files は tar で通常使用されるものではないため、Bash はパスの補完を拒否します。

bash-completion パッケージをアンインストールしてインテリジェント補完を削除できることはわかっています。しかし、両方の利点を享受できるのでしょうか?

最初にインテリジェント補完を使用するように bash に指示し、それが失敗した場合は非インテリジェント補完を使用するようにすることはできますか?

答え1

次のコマンドは、tar、vim、emacs の各プログラムのすべての「インテリジェント」補完が失敗した後に、通常の bash 補完をオンにします。

compopt -o bashdefault tar vim emacs

以下も参照関連ページオンライン bash マニュアルで。

注意: 手元のコマンドのインテリジェント補完によって定義された補完の種類 (コマンド/ファイル名/ユーザー名など) の通常の動作が得られます。たとえば、 をservice呼び出しても、 の補完ではファイル名は補完されませんcomplete -o bashdefault service

このような場合や、インテリジェントな自動補完が失敗するその他の場合には、Alt-/(またはM-/bashマニュアルの表記では)を押して補完することができます。ファイル名M-/インテリジェント補完が無効になっている場合のTABの動作とほぼ同じです(のようなパターンを補完しないという意味でほぼ同じです*.txt)。ここコマンドやユーザー名など、他の種類の補完のためのキーシーケンス。

答え2

こんにちは :-)、

ケーキも食べて、ケーキも残す:

<tab>bash の推定による完了結果が表示されます。ご存知のとおり、間違っている場合もあります。

ただし、M-/( ALT++ SHIFT(デンマーク語のキーボードでは右ではなく左です7) ) は、bash の補完が完璧でない場合にファイルとして補完を強制します。そのため、ファイルとして補完を強制したいときに使用します。ALTAltGrM-/

私にとって、それは両方の長所を兼ね備えたものです。

答え3

bash 補完は bash の標準補完の拡張であり、それ自体が bash プログラムです。したがって、プログラムの動作を変更したい場合は、変更するだけです。これはフリーソフトウェアなので、自由に変更できます。コマンドの特定のケースではtar、ファイルは です/usr/share/bash-completion/completions/tartar拡張子 のファイルを自動補完するにはova、次の行にそれを追加するだけです。

local tars='@(@(tar|gem|spkg)?(.@(Z|[gx]z|bz?(2)|lzma))|t@([glx]z|bz?(2)))'

だからこう言う

local tars='@(@(tar|gem|spkg|ova)?(.@(Z|[gx]z|bz?(2)|lzma))|t@([glx]z|bz?(2)))'

これは Debian Wheezy (現在の安定バージョン) 用に存在するパスとコードであることに注意してください。別のディストリビューションやバージョンではコードが異なる場合がありますが、考え方は同じです。コードを開いて、必要な操作を行うように調整してください。

編集: 質問は、一致するものが見つからない場合すべてに関するものであり、ovaに追加する特定のケースだけに関するものではないことに気付きましたtar。ソースをどこで探すことができるかを知ることは、誰かにとってまだ役に立つかもしれません。

関連情報