Dizindeki dosya adının otomatik tamamlanması


16

Bu soru oldukça benzer bu bir , ama çözüm anlayamıyorum. Bu öğreticiyi de biliyorum , ama yine de yanlış yaptığımı anlayamıyorum.

Yerleştirilen dizinlerin listesini otomatik olarak tamamlamaya çalışıyorum /something/:

$ ls /something/

One    Other    Three

bunun olacak şekilde:

$ hi [TAB]

One Other Three
$ hi O[TAB]

One Other

Sadece ilk kelime hisadece içerideyken değil /something/.

Ben de bunu yapıyorum .profile:

_codeComplete()
{
    local cur=${COMP_WORDS[COMP_CWORD]}
    COMPREPLY=( $(compgen `ls /something/` -- $cur) )

}
complete -F _codeComplete "hi "

Yanıtlar:


15

Deneyin:

_codeComplete()
{
    local cur=${COMP_WORDS[COMP_CWORD]}
    COMPREPLY=( $(compgen -W "$(ls /something/)" -- $cur) )
}

complete -F _codeComplete hi

Bu -Wseçeneği belirtmeniz compgenve ayrıca sözcük listesini üreten komutu da alıntılamanız gerekir.

Bu blogda tamamlama işlevlerinin nasıl yazılacağı hakkında daha fazla bilgi: Kendi Bash Tamamlama İşlevinizi Yazma


6
Boşluk ve diğer özel karakterleri içeren dosya adlarında bu başarısız olur.
Gilles 'SO- kötü olmayı bırak'

2
İsmini bulmak tekinsizce zordur completeZaten bilmiyorum ve aramalarında bu komutu autocompleteya tab-completion... Bu komut adını bulduğumuz ilk yerdi ve ben bunu düzeltmek için gerekli ejectUbuntu için yükseltme 14.04 ( $ complete -p ls-> complete -F _longopt ls, yani düzeltme complete -F _longopt eject
:)

1

Kabul edilen cevabı geliştirmeye çalışayım.

Orijinal cevap boşluk içeren dosya adlarında başarısız olur. Bazı araştırmalardan sonra giriş ayırıcıyı satır sonu olarak değiştirebileceğinizi anlıyorum:

IFS=$'\n'

fonksiyonun boşlukları doğru bir şekilde yapabilmesi.

_codeComplete()
{
    local cur=${COMP_WORDS[COMP_CWORD]}
    IFS=$'\n' tmp=( $(compgen -W "$(ls ~/something/ )" -- $cur))
    COMPREPLY=( "${tmp[@]// /\ }" )
}

complete -F _codeComplete hi

1

İşte yalnızca boşlukları işlemekle kalmayan, aynı zamanda bunlardan da kaçan bir sürüm:

_codeComplete()
{
    local cur=${COMP_WORDS[COMP_CWORD]}
    local AUTO_COMPLETE_DIRS=$(ls /something/)

    IFS=$'\n' COMPREPLY1=( $(compgen -W "$AUTO_COMPLETE_DIRS" -- $cur))
    COMPREPLY2=( "${COMPREPLY1[@]// /\ }" )
    COMPREPLY=($(printf "%q\n" "${COMPREPLY2[@]}"))

}
complete -F _codeComplete "hi "

(Dayanarak dogbane 'in ve Eduardo Almeida dos Santos yanıtları ancak tarafından sağlanan kaçan ile antak böylece: /programming//a/11536437/1536933 )


0
_hi() {
    COMPREPLY=(cd /something/ && compgen -A directory -S / -- $2)
}

complete -o nospace -F _hi hi
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.