Yanıtlar:
Yorum yapmaya devam etmek yerine…
complete -f -X '!*.@(zip|udp)' unzip
için tamamlama eklemeli
-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
Başka bir deyişle: Dosyaları tamamlayın .zipveya veya bitmeyen tüm dosyaları kaldırın .udp.
Eğer eklerseniz -o defaulttamamlama / tamamlamak maç olacak tüm dosyaları ve dizinleri varsa hiçbir uzantılı dosyalar .zipveya .udp.
Eğer -o plusdirstamamlama eklerseniz veya ile biten dosyaların eşleşmelerine ek olarak herhangi bir dizin ekler ..zip.udp
Kullandığınızda complete -p unzipmevcut deseni alırsınız.
Yorumlarınızdan, çoğunlukla şu şekilde olduğu gibi, çoğunlukla ya +da @kalıpta eksik olduğunuz gibi geliyor :
# Err:
complete -f -X '!*.(zip|udp)' unzip
|
+---- Missing + or @
bu, kelimenin tam anlamıyla biten herhangi bir dosyayla eşleşmek.(zip|udp) anlamına gelir . Örneğin
touch 'file_test.(zip|udp)'
Ayrıca kılavuzun bu bölümüne de göz atın:
örneğin extglobetkinleştirilmemiş olabilir. Etkinleştiren:
shopt -s extglob
shoptAşağıdakileri girerek tüm ayarların mevcut durumunu kontrol edin :
shopt
Bu , tamamlama listesini oluşturmak için bir şey-F something adında bir işlev kullandığı anlamına gelir .
Bu _filedir_xspecgenellikle bir Debian işlevidir. Bunun gibi bir şey olabilir:
$ cat /etc/bash_completion
. /usr/share/bash-completion/bash_completion
Bu da /usr/share/bash-completion/bash_completionkaynaklanmak demektir . Burada söz konusu işlevi bulacaksınız . Birkaç satır daha ileride bu işlevin / tamamlamanın _install_xspecörn.
_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
- Geçersiz arşivler veya dosya izinleri nedeniyle eşleşme yok.
Bu sonucu etkilememelidir. completeyalnızca kurallar tarafından verilen dosyalarla eşleşir ve dosyaların işlenmesini sağlamaz. Bunları listeleyebiliyorsanız ls, eşleşmelidir.
Bir yan not olarak tek olabilir tam işlevini kullanarak böyle bir işlevsellik ekleyin:
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
- Renkler. Neden gelmez lsayırt test.zipgelen test.upd?
Bu etkilenmez complete. Renkler tarafından lssağlanır $LS_COLORS. Deneyin:
echo "$LS_COLORS" | tr : '\n' | sort
Bunun gibi bir şey görmelisiniz *.zip=01;31:
*.zip=01;31
|____| | |
| | +--- Red
| +------ Bold
+---------- Files with .zip extension
*.udp Öte yandan onunla ilişkili bir giriş yok, bu yüzden renklendirme yok.
bash --norccomplete -f -X '!*.@(zip|udp)' unzipshopt -s extglobunzip <tab><tab>Sonuç?
Ayrıca, tıklayın düzenlemek sorunuzun altında ve çıktısını ekleyin:
bind -V
shopt
env
yardımcı olabilir.
~/bin/testing2. complete -f -X '!*.@(zip|udp)' testing, 3. testing <tab><tab>?
shopt...
extglobetkinleştirildi. 'Test' ile örnek zipdosyayı sadece tekrar seçer . test.zipKırmızı renkte, test.updbeyaz renkte gösterilirken ls -l, her iki dosya da aynı izinlerle boş, sahip değiştirme ve grup ilişkilendirmesi olduğunu fark ettim . Neden gelmez lsayırt test.zipgelen test.upd? Belki bu yaşadığım soruna bir ipucu?
/etc/bash_completionMuhtemelen bir yere kaynak oluşturduğunuz dosyada , en azından bash(v4.2.25) sürümüm için varsayılan tamamlama
complete -f -X '!*.@(zip|[ejw]ar|exe|pk3|wsz|zargo|xpi|sxw|o[tx]t|od[fgpst]|epub|apk)' unzip zipinfo
İfadenin tamamını şu şekilde değiştirmeyi deneyin:
complete -f -X '!*.@(zip|[ejw]ar|exe|pk3|wsz|zargo|xpi|sxw|o[tx]t|od[fgpst]|epub|apk|udp)' unzip zipinfo
Ve ekleyin .bash_profile
unzip <tab>ne dosyaları , .zipne .upddosyaları, diğer dosyaları bulur .
gzipolan .gzdosyalar?
gunzipile .gzdosyalarında biten dosyaları yalnızca seçeneğini .gzfakat tanım da farklıdır: complete -F _filedir_xspec gunzip.
/etc/bash_completionGözlerinde farklı .bashrc?
shopt -s extglob
Bu satırı .bashrc'nize eklemeyi deneyin:
complete -f -o default -X '!*.+(zip|udp)' unzip
.udpdosyaları bulacağım gibi görünüyor , ancak sadece .zipdosya yoksa . Geçerli dizinde bir test.zipve test.udpdosya varsa , unzip <tab>yalnızca .zipdosyayı listeler . Ben her iki dosyayı görmek beklenir (yani bash tamamlama verecek test.).
udpve zipdosyaları. .bashrcSatırı ekledikten sonra kaynak yaptınız mı ?
unzip <tab>tüm dosyaları, hatta farklı bir ifadeyle bitenleri listeledim. Şimdi ihtiyacım olan şey.
complete -f -o default -X '!*.zip' unzipvecomplete -f -o default -X '!*.udp' unzip
_filedir"Ham" yerine daha iyi kullanım complete.
Meşrulaştırma
grep _filedir -r $(pkg-config --variable=completionsdir bash-completion) | wc -l~) yolları genişletiliyor/home/tux/Do<TAB><TAB>yanıt olarak aldığınız liste '/ home / tux' öğesini kaldırır ve bu nedenle çok daha küçüktürMWE
_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 unzipverircomplete -f -X '!*.@(zip|udp)' unzipveunzip <tab>tamamlartest.zip. Ancak, dizindetest.updsekme tamamlandığında bulunmayan bir dosya da bulunurunzip. Dosya izinleri veya sıfır uzunluktaki bir dosya bu garip davranışı açıklayabilir mi?