Tự động điền tên tệp trong thư mục


16

Câu hỏi này khá giống với câu hỏi này , nhưng tôi không thể hiểu được giải pháp. Tôi cũng biết hướng dẫn này , nhưng tôi vẫn không thể hiểu những gì tôi đang làm sai.

Tôi đang cố gắng tự động hoàn thành danh sách các thư mục được đặt trong /something/:

$ ls /something/

One    Other    Three

theo cách mà điều này sẽ xảy ra:

$ hi [TAB]

One Other Three
$ hi O[TAB]

One Other

Chỉ khi từ đầu tiên hivà không chỉ bên trong /something/.

Đây là những gì tôi đang làm .profile:

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

}
complete -F _codeComplete "hi "

Câu trả lời:


14

Thử:

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

complete -F _codeComplete hi

Bạn cần chỉ định -Wtùy chọn trong compgenvà cũng trích dẫn lệnh tạo ra danh sách từ.

Thông tin thêm về cách viết các hàm hoàn thành trên blog này: Viết Hàm hoàn thành Bash của riêng bạn


6
Điều này sẽ thất bại đối với tên tệp chứa khoảng trắng và các ký tự đặc biệt khác.
Gilles 'SO- ngừng trở nên xấu xa'

2
Thật khó tìm thấy tên của completelệnh nếu bạn chưa biết và đang tìm kiếm autocompletehoặc tab-completion... Đây là nơi đầu tiên tôi tìm thấy tên lệnh và tôi cần sửa nó để ejectnâng cấp lên Ubuntu 14.04 ( $ complete -p ls-> complete -F _longopt ls, vì vậy cách khắc phục là complete -F _longopt eject:) (Đây là hy vọng nhận xét này giúp người khác tìm thấy nó!)
Izkata

1

Hãy để tôi cố gắng cải thiện khi câu trả lời được chấp nhận.

Câu trả lời ban đầu sẽ thất bại với tên tệp chứa khoảng trắng. Sau một số điều tra, tôi nhận ra rằng bạn có thể thay đổi dấu tách đầu vào thành cuối dòng:

IFS=$'\n'

làm cho hàm xử lý không gian chính xác.

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

complete -F _codeComplete hi

1

Đây là một phiên bản không chỉ xử lý các không gian mà còn thoát khỏi chúng:

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

(Dựa trên dogbane 's và Eduardo Almeida dos Santos ' câu trả lời, nhưng với thoát theo quy định của antak trên SO: /programming//a/11536437/1536933 )


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

complete -o nospace -F _hi hi
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.