Alih-alih terus berkomentar ...
complete -f -X '!*.@(zip|udp)' unzip
harus menambahkan penyelesaian untuk
-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
Dengan kata lain: Lengkapi file dan hapus semua yang tidak diakhiri dengan .zip
atau .udp
.
Ekstra
Jika Anda menambahkan -o default
penyelesaian akan menyelesaikan / mencocokkan semua file dan direktori jika tidak ada file yang berakhiran .zip
atau .udp
.
Jika Anda menambahkan -o plusdirs
penyelesaian akan menambah direktori apa pun selain kecocokan file yang berakhiran .zip
atau .udp
.
Arus
Ketika Anda menggunakan complete -p unzip
Anda mendapatkan pola saat ini.
Dari komentar Anda kedengarannya sebagian besar seperti Anda hilang baik +
atau @
dalam pola, seperti di:
# Err:
complete -f -X '!*.(zip|udp)' unzip
|
+---- Missing + or @
yang berarti cocok dengan file apa pun yang benar-benar berakhiran.(zip|udp)
. Misalnya
touch 'file_test.(zip|udp)'
Lihat juga bagian manual ini:
mungkin misalnya extglob
tidak diaktifkan. Aktifkan oleh:
shopt -s extglob
Periksa status saat ini dari semua shopt
pengaturan dengan memasukkan:
shopt
Fungsi
Jika -F something
itu artinya menggunakan fungsi bernama sesuatu untuk menghasilkan daftar penyelesaian.
The _filedir_xspec
biasanya fungsi Debian. Anda mungkin memiliki sesuatu seperti ini:
$ cat /etc/bash_completion
. /usr/share/bash-completion/bash_completion
Yang berarti /usr/share/bash-completion/bash_completion
bersumber. Di sini Anda akan menemukan fungsi yang dimaksud . Beberapa baris lebih jauh ke bawah Anda melihat bahwa fungsi / penyelesaian ini ditambahkan oleh fungsi yang dinamai _install_xspec
oleh misalnya:
_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
Entri manual:
Perbarui ke komentar 1:
- Tidak ada kecocokan karena arsip atau izin file tidak valid.
Ini seharusnya tidak mempengaruhi hasil. complete
hanya cocok dengan file yang diberikan oleh aturan dan tidak memproses file. Jika Anda dapat mendaftar mereka ls
, mereka harus cocok.
Sebagai catatan tambahan, seseorang dapat menambahkan fungsi seperti itu dengan menggunakan fungsi lengkap:
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
- Warna. Mengapa ls
dibedakan test.zip
dari test.upd
?
Ini tidak mempengaruhi complete
. Warna oleh ls
disediakan oleh $LS_COLORS
. Mencoba:
echo "$LS_COLORS" | tr : '\n' | sort
Anda harus melihat sesuatu *.zip=01;31
yang artinya:
*.zip=01;31
|____| | |
| | +--- Red
| +------ Bold
+---------- Files with .zip extension
*.udp
di sisi lain tidak ada entri yang terkait dengannya, jadi tidak ada pewarnaan.
Langkah selanjutnya (seharusnya lebih dulu)
- Buka terminal dan pergi ke direktori dengan file uji. Baik .zip dan .udp
- Memasukkan
bash --norc
- Memasukkan
complete -f -X '!*.@(zip|udp)' unzip
- Memasukkan
shopt -s extglob
- Memasukkan
unzip <tab><tab>
Hasil?
Juga, klik edit di bawah pertanyaan Anda dan tambahkan output:
bind -V
shopt
env
mungkin bermanfaat.
complete -p unzip
menghasilkancomplete -f -X '!*.@(zip|udp)' unzip
, danunzip <tab>
melengkapi file bernamatest.zip
. Namun, direktori tersebut berisi file bernamatest.upd
juga yang tidak ditemukan oleh tab penyelesaianunzip
. Apakah fakta izin file atau panjang nol file mungkin menjelaskan perilaku aneh ini?~/bin/testing
2.complete -f -X '!*.@(zip|udp)' testing
, 3.testing <tab><tab>
?shopt
...extglob
diaktifkan. Contoh dengan 'pengujian' memilihzip
file hanya lagi. Saya perhatikan yangtest.zip
ditampilkan dalam warna merah, sementaratest.upd
ditampilkan dalam warna putih denganls -l
, kedua file kosong dengan izin yang sama, pengalihan pemilik dan asosiasi grup. Mengapals
dibedakantest.zip
daritest.upd
? Mungkin ini adalah petunjuk terhadap masalah yang saya miliki?Dalam file
/etc/bash_completion
, yang mungkin Andabash
dapatkan dari sumber di suatu tempat, penyelesaian default, setidaknya untuk versi saya (v4.2.25) adalahCoba ubah seluruh ekspresi menjadi
Dan tambahkan ke
.bash_profile
sumber
unzip <tab>
tidak menemukan.zip
atau.upd
file atau file lainnya.gzip
dengan.gz
file?gunzip
dengan.gz
file pilih hanya file berakhiran.gz
, tapi definisi juga berbeda:complete -F _filedir_xspec gunzip
./etc/bash_completion
di Anda.bashrc
?shopt -s extglob
Coba tambahkan baris ini di .bashrc Anda:
sumber
.udp
file, tetapi hanya jika tidak ada.zip
file. Jika atest.zip
dantest.udp
file ada di direktori saat ini,unzip <tab>
hanya daftar.zip
file. Saya akan berharap untuk melihat kedua file (yaitu penyelesaian bash akan memberitest.
).udp
danzip
file. Apakah Anda sumber.bashrc
setelah menambahkan baris?unzip <tab>
daftar semua file, bahkan yang berakhir dengan frasa yang berbeda. Sekarang cukup apa yang saya butuhkan.complete -f -o default -X '!*.zip' unzip
dancomplete -f -o default -X '!*.udp' unzip
Lebih baik digunakan
_filedir
daripada "mentah"complete
.Pembenaran
grep _filedir -r $(pkg-config --variable=completionsdir bash-completion) | wc -l
~
jalur tilde ( ) sedang diperluas/home/tux/Do<TAB><TAB>
, daftar yang Anda dapatkan sebagai balasan menghapus '/ home / tux' dan karenanya jauh lebih kompakMWE
sumber