Isi nama file dalam direktori secara otomatis

16

Pertanyaan ini sangat mirip dengan yang ini , tetapi saya tidak dapat memahami solusinya. Saya juga tahu tutorial ini , tetapi saya masih tidak dapat memahami apa yang saya lakukan salah.

Saya mencoba untuk melengkapi secara otomatis daftar direktori yang ditempatkan di /something/:

$ ls /something/

One    Other    Three

dengan cara ini akan terjadi:

$ hi [TAB]

One Other Three
$ hi O[TAB]

One Other

Hanya ketika kata pertama hidan tidak hanya di dalam /something/.

Inilah yang sedang saya lakukan .profile:

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

}
complete -F _codeComplete "hi "
Donovan
sumber

Jawaban:

15

Mencoba:

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

complete -F _codeComplete hi

Anda perlu menentukan -Wopsi compgendan juga mengutip perintah yang menghasilkan daftar kata.

Informasi lebih lanjut tentang cara menulis fungsi penyelesaian di blog ini: Menulis Fungsi Penyelesaian Bash Anda sendiri

dogbane
sumber
6
Ini akan gagal pada nama file yang mengandung spasi dan karakter khusus lainnya.
Gilles 'SANGAT berhenti menjadi jahat'
2
Anehnya sulit untuk menemukan nama completeperintah jika Anda belum mengetahuinya dan sedang mencari autocompleteatau tab-completion... Ini adalah tempat pertama saya menemukan nama perintah, dan apa yang saya butuhkan untuk memperbaikinya saat ejectupgrade ke Ubuntu 14,04 ( $ complete -p ls-> complete -F _longopt ls, jadi perbaikannya adalah complete -F _longopt eject
:)
1

Biarkan saya mencoba memperbaiki jawaban yang diterima.

Jawaban asli akan gagal dengan nama file yang mengandung spasi. Setelah beberapa penyelidikan saya menyadari Anda dapat mengubah pemisah input ke end-of-line:

IFS=$'\n'

membuat fungsi menangani spasi dengan benar.

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

complete -F _codeComplete hi
Eduardo Almeida dos Santos
sumber
1

Berikut ini adalah versi yang tidak hanya menangani spasi, tetapi juga melewatinya:

_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 "

(Berdasarkan jawaban dogbane dan Eduardo Almeida dos Santos , tetapi dengan melarikan diri sebagaimana diberikan oleh antak pada SO: /programming//a/11536437/1536933 )

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

complete -o nospace -F _hi hi
xdch47
sumber