Bash tamamlanmasına nasıl desen eklenir (unzip için)?


12

Yazdığımda

unzip <tab>

Komut .zipiçin sekme tamamlamanın standart davranışı olan biten tüm dosyaların bir listesini alıyorum unzip.

Ancak, unzipdosyalara .udpek olarak biten liste dosyaları için de bash tamamlama istiyorum .zip. Yerelde bu davranışı nasıl başarabilirim .bashrc?

Yanıtlar:


23

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.


Ekstralar

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

şimdiki

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

fonksiyon

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

Manuel girişler:


Yorum 1'e güncelleyin:

- 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.


Sonraki adım (ilk olmalı)

  1. Terminali açın ve test dosyaları içeren bir dizine gidin. Hem .zip hem de .udp
  2. Giriş bash --norc
  3. Giriş complete -f -X '!*.@(zip|udp)' unzip
  4. Giriş shopt -s extglob
  5. Giriş 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.


Mükemmel ve uzun açıklamalarınız için çok teşekkür ederim, ama yine de çalışmıyor. adlı dosyayı complete -p unzipverir complete -f -X '!*.@(zip|udp)' unzipve unzip <tab>tamamlar test.zip. Ancak, dizinde test.updsekme tamamlandığında bulunmayan bir dosya da bulunur unzip. Dosya izinleri veya sıfır uzunluktaki bir dosya bu garip davranışı açıklayabilir mi?
Alex

@Alex: Hem boş hem de geçerli dosyalar ile izin verilmeyen dosyalar üzerinde tamamlama yapılmalıdır. Bir test komut dosyasına eklerseniz aynı davranış olur mu? Örn. 1. yürütme ayarlı bazı test komut dosyaları:, ~/bin/testing2. complete -f -X '!*.@(zip|udp)' testing, 3. testing <tab><tab>?
Runium

@Alex: Q'yu aşağıdakilerin çıktısıyla da güncelleyebilirsiniz shopt...
Runium

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?
Alex

@Alex: Bir güncelleme eklendi.
Runium

3

/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


Bu benim sorunumu çözmez. Bunu yapar ve kaynak yaparsam, unzip <tab>ne dosyaları , .zipne .upddosyaları, diğer dosyaları bulur .
Alex

Sekmeye iki kez vurmayı deneyin , bunun farklı olup olmadığını görün. Diğer tamamlamalar beklendiği gibi çalışıyor mu? Örneğin gzipolan .gzdosyalar?
bsd

Sekmeye iki kez vurmak hiçbir şeyi değiştirmez. Kullanımı gunzipile .gzdosyalarında biten dosyaları yalnızca seçeneğini .gzfakat tanım da farklıdır: complete -F _filedir_xspec gunzip.
Alex

Dosyayı kaynak musunuz /etc/bash_completionGözlerinde farklı .bashrc?
BSD

Deneshopt -s extglob
Edward Falk

2

Bu satırı .bashrc'nize eklemeyi deneyin:

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

Bu öneriyle .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.).
Alex

Emin misiniz? Benim bash kontrol ve ben de bulmak gibi udpve zipdosyaları. .bashrcSatırı ekledikten sonra kaynak yaptınız mı ?
mkc

Yeni bir terminalde tekrarladım ve şimdi unzip <tab>tüm dosyaları, hatta farklı bir ifadeyle bitenleri listeledim. Şimdi ihtiyacım olan şey.
Alex

Garip .. GNU bash sürüm 4.2.25 çalıştırıyorum ve beklendiği gibi çalışıyor. Hangi bash sürümünü kullanıyorsunuz?
mkc

İki ayrı satır eklemeyi deneyebilir misiniz: complete -f -o default -X '!*.zip' unzipvecomplete -f -o default -X '!*.udp' unzip
mkc

1

_filedir"Ham" yerine daha iyi kullanım complete.

Meşrulaştırma

  • grep _filedir -r $(pkg-config --variable=completionsdir bash-completion) | wc -l
  • tilde ( ~) yolları genişletiliyor
  • Ön ekler dizinler için kaldırılır, yani /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ür
  • Uygulaması daha kolay ve daha güvenli

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.