Eşittir işaretinden sonra yolları otomatik tamamlamak için bash tamamlama komut dosyası oluşturulsun mu?


11

Form --argve bağımsız değişkenlerini tanıyan bir bash tamamlama komut dosyası oluşturmak istiyorum --some-arg=file.

Bu öğreticiyi ve bazı örnekleri okuduktan sonra /usr/share/bash_completion/completions/, aşağıdaki komut dosyasını yazdım (Chromium ile bazı bayraklar yazarken zaman kazanmak için):

_chromium() 
{
    local cur prev opts
    COMPREPLY=()
    cur="${COMP_WORDS[COMP_CWORD]}"
    prev="${COMP_WORDS[COMP_CWORD-1]}"

    # Some interesting options
    opts="
--disable-web-security
--easy-off-store-extension-install
--incognito
--load-extension=
--pack-extension=
--pack-extension-key=
--user-data-dir=
"
    # Handle --xxxxxx=file
    if [[ ${cur} == "--"*"=" ]] ; then
        # Removed failures (is my logic OK?)
        return 0
    fi

    # Handle other options
    if [[ ${cur} == -* ]] ; then
        COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
        return 0
    fi
}
complete -F _chromium chromium

Bunu kaydettim ~/bash_completions/chromiumve kullanarak bir sembolik bağlantı oluşturdum sudo ln -s ~/bash_completions/chromium /usr/share/bash_completion/completions/chromium.
Sonra kullanarak yükledim . /usr/share/bash_completions/completions/chromium.

Şimdi iki sorun yaşıyorum:

  • chromium --u<TAB>genişler chromium --user-data-dir=<SPACE>(alanı istemiyorum).
  • Yollar (dizinler ve dosyalar) artık tamamlanmadı.

Bu sorunları nasıl çözebilirim?


Zsh'ye geçiş bir seçenek midir?
Gilles 'SO- kötü olmayı bırak'

Yanıtlar:


11

Her iki sorunun da çözümünü buldum!

  1. Boşluk eklememek için nospaceseçeneği kullanın. Bu iki şekilde yapılabilir:

    • Şuraya iletin complete:
      complete -o nospace -F _chromium chromium
    • Yerleşik compoptolanı kullanın :
      compopt -o nospace(seçeneği etkinleştirmek için)
      compopt +o nospace(seçeneği devre dışı bırakmak için)

    Bunu gnu.org, 8.7 Programlanabilir Tamamlama Yapıları'ndaki Bash belgelerinde buldum .

  2. Dosyaların tamamlanması.
    • peterph-f ile bayrağı kullanmanızı önerdicompgen . Bu tavsiyeye uydum ve uyguladım COMPREPLY=( $(compgen -f "$cur") ). Boşluk içeren bir yolu tamamlamaya çalışana kadar bu işe yaradı.
      Stack Overflow'da, tamamlama listesinin (kullanılmadan ) manuel olarak oluşturulmasını öneren bu cevabı buldum compgen. Bu yaklaşım işe yaradı.
    • filenamesReadline'a compspec'in dosya adları oluşturduğunu söyleme seçeneğini kullanın , böylece:
      • dosya adına özgü işlemleri gerçekleştirme (dizin adlarına eğik çizgi ekleme, özel karakterleri tırnak içine alma veya sondaki boşlukları gizleme gibi)
      • dosya türünü belirtmek için farklı renkler kullanın ( colored-statsetkinken)

Bash'in dize manipülasyonunun yardımıyla ( ~boşlukları genişletmek ve bunlarla başa çıkmak için), soruda belirtilen tüm kriterleri karşılayan bir bash tamamlama komut dosyaları oluşturdum.

_chromium() 
{
    local cur prev opts
    COMPREPLY=()
    cur="${COMP_WORDS[COMP_CWORD]}"
    prev="${COMP_WORDS[COMP_CWORD-1]}"

    # Some interesting options
    opts="
--disable-web-security
--easy-off-store-extension-install
--incognito
--load-extension=
--pack-extension=
--pack-extension-key=
--user-data-dir=
"
    # Handle --xxxxxx=
    if [[ ${prev} == "--"* && ${cur} == "=" ]] ; then
        compopt -o filenames
        COMPREPLY=(*)
        return 0
    fi
    # Handle --xxxxx=path
    if [[ ${prev} == '=' ]] ; then
        # Unescape space
        cur=${cur//\\ / }
        # Expand tilder to $HOME
        [[ ${cur} == "~/"* ]] && cur=${cur/\~/$HOME}
        # Show completion if path exist (and escape spaces)
        compopt -o filenames
        local files=("${cur}"*)
        [[ -e ${files[0]} ]] && COMPREPLY=( "${files[@]// /\ }" )
        return 0
    fi

    # Handle other options
    COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") )
    if [[ ${#COMPREPLY[@]} == 1 && ${COMPREPLY[0]} != "--"*"=" ]] ; then
        # If there's only one option, without =, then allow a space
        compopt +o nospace
    fi
    return 0
}
complete -o nospace -F _chromium chromium

Müthiş cevap, çok teşekkürler. Zamanımın çoğunu kurtardın. -fDosya yolunu tamamlamak için anahtar kullandım , ancak bir /dizinse char'ı tamamlamıyor ... olsa da küçük bir şey.
Jiri Kremser

1

Dosya adlarını tamamlamak -fiçin adresine geçmeyi deneyin compgen.

Korkarım seçeneklerden sonra boşluklardan kurtulamayacaksınız, çünkü tamamlama böyle çalışır - benzersiz bir eşleşme bulduktan sonra, tamamen tamamlar.


Önerisi için teşekkürler -f. Denedim, ancak boşluklarla doğru bir şekilde ilgilenmiyor: Yol /tmp/foo bariki tamamlama girişiyle sonuçlanır /tmp/foove bar. İstenmeyen hakkında --arg=<SPACE>: Bunun çözümünü buldum ve aşağıdaki cevaba gönderdim .
Rob W
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.