回答:
コメントし続ける代わりに…
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
–無効なアーカイブまたはファイル許可のため、一致はありません。
これは結果に影響しないはずです。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
一方、エントリは関連付けられていないため、カラーリングはありません。
bash --norc
complete -f -X '!*.@(zip|udp)' unzip
shopt -s extglob
unzip <tab><tab>
結果?
また、質問の下にある[ 編集 ]をクリックして、次の出力を追加します。
bind -V
shopt
env
役に立つかもしれません。
~/bin/testing
、2、3 complete -f -X '!*.@(zip|udp)' testing
、testing <tab><tab>
?
shopt
…の出力で更新することもできます
extglob
がアクティブになります。'testing'の例では、zip
ファイルのみを再度選択します。test.zip
赤い色で表示されているのに気付きましたが、test.upd
で白い色で表示されていますがls -l
、どちらのファイルも同じ権限、所有者シフト、グループの関連付けで空になっています。なぜls
と区別test.zip
するのtest.upd
ですか?多分これは私が抱えている問題へのヒントですか?
/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
。
gzip
、.gz
ファイルで?
gunzip
と、.gz
末尾がのファイルのみが選択されます.gz
が、定義も異なりますcomplete -F _filedir_xspec gunzip
。
/etc/bash_completion
します.bashrc
か?
shopt -s extglob
.bashrcに次の行を追加してみてください。
complete -f -o default -X '!*.+(zip|udp)' unzip
.udp
ファイルが見つかるようですが、.zip
ファイルが存在しない場合のみです。現在のディレクトリにtest.zip
and test.udp
ファイルが存在する場合は、ファイルunzip <tab>
のみがリストされ.zip
ます。私は両方のファイルが表示されることを期待します(つまり、bashの補完によりが得られますtest.
)。
udp
とzip
ファイルの両方が見つかったようです。.bashrc
行を追加した後にソースを取得しましたか?
unzip <tab>
すべてのファイルを一覧表示しました。別の語句で終わっているファイルも含まれています。今、私が必要なものはかなりあります。
complete -f -o default -X '!*.zip' unzip
とcomplete -f -o default -X '!*.udp' unzip
_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
complete -p unzip
が生成されcomplete -f -X '!*.@(zip|udp)' unzip
、unzip <tab>
という名前のファイルが完成しますtest.zip
。ただし、ディレクトリにはのtest.upd
タブ補完では見つからないという名前のファイルも含まれていますunzip
。ファイルのアクセス許可またはファイルの長さがゼロであることは、この奇妙な動作を説明しているのでしょうか?