パターンをbash補完に追加する方法(解凍用)?


11

入力すると

unzip <tab>

で終わるすべてのファイルのリストを取得します.zip。これは、unzipコマンドのタブ補完の標準的な動作です。

ただし、unzipファイル.udpに加えて、末尾がであるリストファイルのbash補完も必要.zipです。地元でこの行動をどのように達成でき.bashrcますか?

回答:


22

コメントし続ける代わりに…


complete -f -X '!*.@(zip|udp)' unzip

補完を追加する必要があります

-f -X '!*.@(zip|udp)'
 |  |  | |||________|
 |  |  | ||     |
 |  |  | ||     +- filterpat: zip or udp
 |  |  | |+-------------  @ : Matches one of the given patterns
 |  |  | +-------------- *. : Anything+<dot>
 |  |  +----------------  ! : Negate
 |  +------------------- -X : Filter out matches in "filterpat"
 +---------------------- -f : files

つまり、ファイルを完成させ、末尾が.zipまたはでないすべてを削除します.udp


エクストラ

またはで終わるファイルがない場合、-o default補完を追加すると、すべてのファイルとディレクトリが補完/一致ます。.zip.udp

あなたが追加した場合-o plusdirs完了を任意のディレクトリを追加します加えて、で終わるファイルのいずれかが一致します.zip.udp

電流

使用するcomplete -p unzipと、現在のパターンが取得されます。

あなたのコメントから、それはあなたがどちらか+または@パターンで欠落しているように聞こえます:

# Err:
complete -f -X '!*.(zip|udp)' unzip
                   |
                   +---- Missing + or @

これは、文字どおり.(zip|udp)。で終わるすべてのファイルに一致することを意味ます。例えば

touch 'file_test.(zip|udp)'

マニュアルのこのセクションもご覧ください。

たとえばextglob、有効になっていない可能性があります。有効化:

shopt -s extglob

次のようにshopt入力して、すべての設定の現在のステータスを確認します。

shopt

関数

もしそうならそれは-F somethingそれが補完のリストを生成するために何かという名前の関数を使用することを意味します。

これ_filedir_xspecは通常、Debian関数です。あなたはこのようなものを持っているかもしれません:

$ cat /etc/bash_completion
. /usr/share/bash-completion/bash_completion

つまり/usr/share/bash-completion/bash_completion、ソースを取得します。ここに問題関数があります。さらに下の数行を見ると、この関数/補完は_install_xspec、たとえば、次の名前の関数によって追加されていることがわかります。

_install_xspec '!*.@(zip|[ejsw]ar|exe|pk3|wsz|zargo|xpi|s[tx][cdiw]|sx[gm]|o[dt][tspgfc]|od[bm]|oxt|epub|apk|do[ct][xm]|p[op]t[mx]|xl[st][xm])' unzip zipinfo

手動入力:


コメント1に更新:

–無効なアーカイブまたはファイル許可のため、一致はありません。

これは結果に影響しないはずです。completeルールで指定されたファイルにのみ一致し、ファイルの処理は行いません。でそれらをリストできる場合ls、それらは一致するはずです。

補足として、完全な関数を使用してそのような機能を追加できます。

function _unzip_validated() {
    # 1. Generate list of files ending in e.g. .zip and .udp
    # 2. Validate each file and remove invalid ones from file list.
}

complete -F _unzip_validated unzip

–色。なぜlsと区別test.zipするのtest.updですか?

これは影響しませんcomplete。による色はによってls提供され$LS_COLORSます。試してください:

echo "$LS_COLORS" | tr : '\n' | sort

次のようなものが表示さ*.zip=01;31れます。

*.zip=01;31
|____| |  |
   |   |  +--- Red
   |   +------ Bold
   +---------- Files with .zip extension

*.udp 一方、エントリは関連付けられていないため、カラーリングはありません。


次のステップ(最初のはずです)

  1. ターミナルを開き、テストファイルのあるディレクトリに移動します。.zipと.udpの両方
  2. 入る bash --norc
  3. 入る complete -f -X '!*.@(zip|udp)' unzip
  4. 入る shopt -s extglob
  5. 入る unzip <tab><tab>

結果?

また、質問の下にある[ 編集 ]をクリックして、次の出力を追加します。

bind -V
shopt
env

役に立つかもしれません。


長くて長い説明をありがとうございましたが、それでもうまくいきません。complete -p unzipが生成されcomplete -f -X '!*.@(zip|udp)' unzipunzip <tab>という名前のファイルが完成しますtest.zip。ただし、ディレクトリにはのtest.updタブ補完では見つからないという名前のファイルも含まれていますunzip。ファイルのアクセス許可またはファイルの長さがゼロであることは、この奇妙な動作を説明しているのでしょうか?
Alex

@Alex:空のファイルと有効なファイルの両方、および権限のないファイルで完了を取得する必要があります。テストスクリプトに追加しても同じ動作ですか?例1.実行セットが設定されたテストスクリプト:~/bin/testing、2、3 complete -f -X '!*.@(zip|udp)' testingtesting <tab><tab>?
Runium 2014年

@Alex:Qをshopt…の出力で更新することもできます
Runium

extglobがアクティブになります。'testing'の例では、zipファイルのみを再度選択します。test.zip赤い色で表示されているのに気付きましたが、test.updで白い色で表示されていますがls -l、どちらのファイルも同じ権限、所有者シフト、グループの関連付けで空になっています。なぜlsと区別test.zipするのtest.updですか?多分これは私が抱えている問題へのヒントですか?
Alex

@アレックス:アップデートを追加しました。
Runium 2014年

3

/etc/bash_completionおそらくどこかで調達していると思われるファイルで、少なくとも私のバージョンbash(v4.2.25)のデフォルトの補完は

complete -f -X '!*.@(zip|[ejw]ar|exe|pk3|wsz|zargo|xpi|sxw|o[tx]t|od[fgpst]|epub|apk)' unzip zipinfo

式全体を次のように変更してみてください

complete -f -X '!*.@(zip|[ejw]ar|exe|pk3|wsz|zargo|xpi|sxw|o[tx]t|od[fgpst]|epub|apk|udp)' unzip zipinfo

そしてあなたに追加 .bash_profile


これは私の問題を解決しません。私がそうしてそれを調達した場合、ファイルも他のファイルunzip <tab>も見つかり.zipません.upd
Alex

タブを 2回たたいてみて、違いがないか確認してください。他の補完は期待どおりに機能しますか?たとえばgzip.gzファイルで?
bsd 2014年

タブを2回押しても何も変わりません。ファイルで使用するgunzipと、.gz末尾がのファイルのみが選択されます.gzが、定義も異なりますcomplete -F _filedir_xspec gunzip
Alex

でファイルを調達/etc/bash_completionします.bashrcか?
bsd 2014年

試してみるshopt -s extglob
エドワードフォーク

2

.bashrcに次の行を追加してみてください。

complete -f -o default -X '!*.+(zip|udp)' unzip

この提案では.udpファイルが見つかるようですが、.zipファイルが存在しない場合のみです。現在のディレクトリにtest.zipand test.udpファイルが存在する場合は、ファイルunzip <tab>のみがリストされ.zipます。私は両方のファイルが表示されることを期待します(つまり、bashの補完によりが得られますtest.)。
Alex

本気ですか?私はbashを確認しましたが、udpzipファイルの両方が見つかったようです。.bashrc行を追加した後にソースを取得しましたか?
mkc 14年

新しい端末で繰り返して、unzip <tab>すべてのファイルを一覧表示しました。別の語句で終わっているファイルも含まれています。今、私が必要なものはかなりあります。
Alex

奇妙なことです。GNUbashバージョン4.2.25を実行しており、期待どおりに動作します。どのバージョンのbashを使用していますか?
mkc 14年

あなたは、2つの別々の行を追加してみてくださいでした:complete -f -o default -X '!*.zip' unzipcomplete -f -o default -X '!*.udp' unzip
MKC

1

_filedir"raw"の代わりに使用することをお勧めしますcomplete

正当化

  • grep _filedir -r $(pkg-config --variable=completionsdir bash-completion) | wc -l
  • チルダ(~)パスが拡張されています
  • ディレクトリのプレフィックスは削除されます。つまり/home/tux/Do<TAB><TAB>、の場合、返信として取得したリストは '/ home / tux'を削除するため、はるかにコンパクトになります。
  • 実装が簡単でフェイルセーフ

MWE

_unzip_completor()
{
    # init bash-completion's stuff
    _init_completion || return

    # fill COMPREPLY using bash-completion's routine
    _filedir '@(zip|udp)'
}
complete -F _unzip_completor unzip
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.