2010-02-26 12 views
9

Tôi đang cố gắng tạo tập lệnh hoàn thành Bash cho một chương trình Java. Một thỉnh nguyện tiêu biểu của chương trình đó có thể trông như thế này:Thêm dấu cách vào cuối một số tùy chọn tự động hoàn thành của Bash, nhưng không cho những người khác?

$ javaProgram -Dproperty=foo option1 option2 

Phần kịch bản của tôi sẽ gợi ý các thuộc tính Java khác nhau mà có sẵn cho chương trình này (ví dụ, khi người dùng nhập -D, kịch bản sẽ đề nghị, giả sử, property=, cho phép người dùng sau đó nhập giá trị).

Tôi muốn hoàn thành không chèn dấu cách sau dấu bằng. Tuy nhiên, khi người dùng nhập các tùy chọn khác nhau cho chương trình (option1option2 trong ví dụ trên), tôi muốn tập lệnh hoàn tất và chèn khoảng trắng khi hoàn thành.

Tôi mới sử dụng tập lệnh hoàn thành Bash, nhưng tôi biết tùy chọn nospace cho nội trang hệ vỏ complete. Nó không có vẻ làm việc cho các builder compgen, mặc dù, mà có vẻ như những gì tôi muốn. Tôi đã thử sử dụng nospace và sau đó bao gồm rõ ràng khoảng trắng ở cuối các tùy chọn thích hợp, nhưng dường như chúng không vượt qua được.

Có ai biết cách lấy khoảng trống ở cuối một số tùy chọn không, nhưng không có khoảng trắng ở cuối các tùy chọn khác?

Trả lời

1

Sẽ rất hữu ích khi xem mã bạn có cho đến thời điểm này.

Tuy nhiên, hãy xem mã hoàn thành cho scp trong /etc/bash_completion.d/ssh nếu bạn có. Nó đặt dấu cách sau tên tệp cục bộ nhưng không đặt sau tên máy chủ.

1

Dennis là ngay trên tiền bạc, trong hàm bạn tham khảo với complete -F _your_func, bạn muốn một cái gì đó như thế này (lấy từ/etc/bash_completion):

# escape spaces; remove executables, aliases, pipes and sockets; 
    # add space at end of file names 
    COMPREPLY=($(ssh -o 'Batchmode yes' $userhost \ 
       command ls -aF1d "$path*" 2>/dev/null | \ 
       sed -e "s/[][(){}<>\",:;^&!$&=?\`|\\ ']/\\\\\\\\\\\\&/g" \ 
       -e 's/[*@|=]$//g' -e 's/[^\/]$/& /g')) 
    return 0 

ví dụ cụ thể này sử dụng các tùy chọn -o nospace nhưng thêm không gian bằng tay. Đó là -e ('s/[^\/]$/& /g') mới nhất cho biết thêm không gian. Trong trường hợp này, nó chỉ thêm vào nếu tham số cuối cùng không kết thúc bằng dấu gạch chéo (đó sẽ là một thư mục và có các tệp để tự động hoàn thành).

Sự khác biệt chính có vẻ là thêm ký hiệu trước dấu cách. Hãy thử và xem nếu nó hoạt động.

5

Tính năng trong hoàn thành băm của scp được đề cập bởi C4H5As giữ lại không gian được thêm không phải là ký hiệu và, đó chỉ là cú pháp sed cho "thay thế bằng kết hợp".

Bạn phải thay đổi IFS để compgen không chia đầu vào không gian nhưng trên dòng mới hoặc tab:

local IFS=$'\t\n' 
COMPREPLY=($(compgen -W "$options" -- $cur)) 
0

Bạn có thể làm điều đó bằng cách loại bỏ các không gian với các tùy chọn tương ứng, sau đó thêm chúng trở lại bằng tay cho các tùy chọn mà bạn muốn họ, tất cả bằng cách sử dụng đơn giản -W ("wordlist") hoàn thành:

complete -o nospace -W 'Dproperty= "option1 " "option2 "' javaProgram 

Autocompletion bây giờ sẽ chèn một khoảng trắng sau option1option2, nhưng không ai sau Dproperty=.