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 .zip
veya veya bitmeyen tüm dosyaları kaldırın .udp
.
Eğer eklerseniz -o default
tamamlama / tamamlamak maç olacak tüm dosyaları ve dizinleri varsa hiçbir uzantılı dosyalar .zip
veya .udp
.
Eğer -o plusdirs
tamamlama eklerseniz veya ile biten dosyaların eşleşmelerine ek olarak herhangi bir dizin ekler ..zip
.udp
Kullandığınızda complete -p unzip
mevcut 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 extglob
etkinleştirilmemiş olabilir. Etkinleştiren:
shopt -s extglob
shopt
Aş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_xspec
genellikle 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_completion
kaynaklanmak 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. complete
yalnı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 ls
ayırt test.zip
gelen test.upd
?
Bu etkilenmez complete
. Renkler tarafından ls
sağ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 --norc
complete -f -X '!*.@(zip|udp)' unzip
shopt -s extglob
unzip <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/testing
2. complete -f -X '!*.@(zip|udp)' testing
, 3. testing <tab><tab>
?
shopt
...
extglob
etkinleştirildi. 'Test' ile örnek zip
dosyayı sadece tekrar seçer . test.zip
Kırmızı renkte, test.upd
beyaz 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 ls
ayırt test.zip
gelen test.upd
? Belki bu yaşadığım soruna bir ipucu?
/etc/bash_completion
Muhtemelen 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ı , .zip
ne .upd
dosyaları, diğer dosyaları bulur .
gzip
olan .gz
dosyalar?
gunzip
ile .gz
dosyalarında biten dosyaları yalnızca seçeneğini .gz
fakat tanım da farklıdır: complete -F _filedir_xspec gunzip
.
/etc/bash_completion
Gözlerinde farklı .bashrc
?
shopt -s extglob
Bu satırı .bashrc'nize eklemeyi deneyin:
complete -f -o default -X '!*.+(zip|udp)' unzip
.udp
dosyaları bulacağım gibi görünüyor , ancak sadece .zip
dosya yoksa . Geçerli dizinde bir test.zip
ve test.udp
dosya varsa , unzip <tab>
yalnızca .zip
dosyayı listeler . Ben her iki dosyayı görmek beklenir (yani bash tamamlama verecek test.
).
udp
ve zip
dosyaları. .bashrc
Satı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' unzip
vecomplete -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 unzip
verircomplete -f -X '!*.@(zip|udp)' unzip
veunzip <tab>
tamamlartest.zip
. Ancak, dizindetest.upd
sekme tamamlandığında bulunmayan bir dosya da bulunurunzip
. Dosya izinleri veya sıfır uzunluktaki bir dosya bu garip davranışı açıklayabilir mi?