2010-10-17 3 views
5

Trong tập lệnh hoàn thành bash, giả sử COMPREPLY=(aa/ba/ aa/bb/). Khi tập lệnh được gọi, các tùy chọn hoàn thành trông giống như thế này cho người dùng:Chỉ hiển thị các phần tử của tùy chọn hoàn thành bash COMPREPLY cho người dùng

$ foo aa/b<TAB> 
aa/ba/ 
aa/bb/ 

Tuy nhiên, tôi muốn kiểm soát nhiều hơn cách các tùy chọn này được hiển thị. Đặc biệt, tôi muốn chỉ hiển thị một chuỗi con của mỗi tùy chọn COMPREPLY cho người sử dụng, tương tự như cách hoàn thư mục làm việc trong bash bây giờ:

$ foo aa/b<TAB> 
ba/ 
bb/ 

Có cách nào để làm điều này trong bash?

Trả lời

5

Tôi đã có cùng một vấn đề và tôi cố định nó bằng cách điều chỉnh thế nào tôi bị ràng buộc chức năng hoàn thành vào lệnh. Tôi biết điều này hoạt động khi bạn đang đối phó với các tập tin thực tế trong hệ thống tập tin, tôi nghĩ rằng nó sẽ làm việc với bất kỳ loại đường dẫn tập tin như các tùy chọn, nhưng tôi không chắc chắn.

Trước:

complete -F _fubar fubar 

Sau:

complete -o filenames -F _fubar fubar 

Để biết thêm chi tiết: Programmable Completion Builtins

+0

Tuyệt vời! Bây giờ tôi chỉ cần tìm ra cách bật/tắt các tùy chọn có chọn lọc cho các trường hợp 'COMPREPLY' khác nhau trong chức năng của tôi, * mà không * sử dụng 'compopt' –

2

Đoạn mã này lấy từ debian sid/etc/bash_completion sẽ giúp:

# Remove colon-word prefix from COMPREPLY items 
local colon_word=${1%${1##*:}} 
local i=${#COMPREPLY[*]} 
while [ $((--i)) -ge 0 ]; do 
    COMPREPLY[$i]=${COMPREPLY[$i]#"$colon_word"} 
done 
+0

Cảm ơn enzotib. Thật không may, kỹ thuật này không hoạt động, bởi vì sau đó chuỗi con thay thế toàn bộ quá trình hoàn thành. Nghĩa là, 'foo aa/b ' trở thành 'foo ba /' :-( –