Tôi đang cố gắng để có được một kịch bản hoàn thành bash được thiết lập và gặp một số rắc rối.
Tôi muốn thiết lập nó để các phần hoàn thành được liệt kê là các tệp khớp với một phần mở rộng hoặc thư mục cụ thể (có thể chứa hoặc không chứa các tệp của phần mở rộng đó).
Vấn đề tôi gặp phải là cách duy nhất tôi có thể có được các phần hoàn thành để chứa các tệp và thư mục là bằng cách sử dụng một cái gì đó như -o plusdirs -f -X '!*.txt'
, nhưng khi tôi để bash hoàn thành một trong các thư mục, nó chỉ thêm một khoảng trắng vào cuối, chứ không phải là một gạch chéo.
_xyz()
{
local cur=${COMP_WORDS[COMP_CWORD]}
local prev=${COMP_WORDS[COMP_CWORD-1]}
#COMPREPLY=( $( compgen -f -X '!*.txt' -- $cur ) )
#COMPREPLY=( $( compgen -f -G '*.txt' -- $cur ) )
#COMPREPLY=( $( compgen -o filenames -f -X '!*.txt' -- $cur ) )
#COMPREPLY=( $( compgen -o dirnames -f -X '!*.txt' -- $cur ) )
COMPREPLY=( $( compgen -o plusdirs -f -X '!*.txt' -- $cur ) )
return 0
}
complete -F _xyz xyz
Tôi cũng đã thử tất cả các dòng nhận xét, nhưng chúng thậm chí không mở rộng các thư mục.
Để thử nghiệm, tôi đã chạy cái này trong một thư mục có một tệp .txt và một thư mục "dir" (với tệp .txt bên trong nó, mặc dù điều đó chưa thành vấn đề). Nhập xyz <TAB>
với chức năng này liệt kê thư mục và tệp .txt, nhưng gõ xyz d<TAB>
mở rộng thành xyz dir
(tốt, với một khoảng trắng sau "dir").