Tự động hoàn thành Bash cho một biến môi trường chứa tên thư mục


10

Tôi đang sử dụng, trong số những thứ khác, bash 4.2.37 trên Linux Mint 14.

Khi tôi tự động hoàn thành tên của một biến môi trường bằng cách gõ Tab, nó sẽ mở rộng thành tên của biến theo sau là khoảng trắng.

Nếu giá trị của biến xảy ra là tên thư mục, tôi muốn nó mở rộng thành tên của biến theo sau /.

Ví dụ: nếu tôi gõ:

$ ls $HOM<tab>

nó mở rộng tới:

$ ls $HOME _

nơi _đánh dấu vị trí của con trỏ. Vấn đề là sau đó tôi thường muốn tiếp tục gõ tên của một số tệp hoặc thư mục trong thư mục chính của tôi, có nghĩa là tôi phải gõ backspacevà sau đó /.

Vì vậy, tôi muốn mở rộng ở trên để:

$ ls $HOME/_

Điều tương tự cũng xảy ra khi tôi gõ toàn bộ tên biến; sau đó ls $HOME, tabthêm một khoảng trắng và tôi muốn nó thêm vào một /.

(Và tất nhiên tôi không muốn nó thêm /nếu giá trị của biến không phải là tên thư mục.)

Có cách nào để tôi có thể bảo bash hành xử theo cách tôi muốn, thông qua các lệnh bash hoặc bằng cách cập nhật $HOME/.inputrckhông?

Lưu ý: Tôi đặc biệt tìm kiếm một cách để tabhành xử theo cách tôi muốn. Các cách để đạt được cùng một hành vi với các tổ hợp phím khác nhau sẽ rất thú vị, nhưng sẽ không trả lời câu hỏi của tôi.

(Tôi đã vô hiệu hóa /etc/profile.d/bash_completion.shtrên hệ thống của mình vì nó tương tác kém set -o nounset. Một thử nghiệm nhanh cho thấy rằng điều này có thể không liên quan đến câu hỏi của tôi.)

Ngẫu nhiên, tcsh thực hiện điều này: đưa ra một biến môi trường $FOOBAR, gõ $FOOBA<tab>sẽ mở rộng $FOOBAR/nếu tham chiếu đến một thư mục, $FOOBAR(có dấu cách) nếu không. Không, điều đó không đủ để thuyết phục tôi quay trở lại tcsh. zsh làm điều này là tốt.


+1 Trong trường hợp bạn cảm thấy phiêu lưu, đây là mã .
l0b0

@ l0b0: (a) Tôi đã có nó. (b) Tôi không cảm thấy khá mạo hiểm. (c) Giả sử hoàn thành lập trình .
Keith Thompson

Câu trả lời:


6

Tính năng này được triển khai trong bash 4.3, phát hành 2014 / 02-26.

Trích dẫn NEWStệp (bao gồm ở cấp cao nhất bash-4.3.tar.gz, xem thêm chữ ký GPG ):

Mã hoàn thành từ kiểm tra xem một tên tệp có chứa biến shell có mở rộng thành tên thư mục hay không và thêm /vào từ đó nếu thích hợp. Mã tương tự mở rộng các biến shell trong tên lệnh khi thực hiện hoàn thành lệnh.

Một thử nghiệm nhanh với một bản sao được tạo từ nguồn cho thấy rằng nếu tôi nhập

$ ls $HOM<tab>

bây giờ nó mở rộng đến

$ ls $HOME/

(Ngẫu nhiên, zsh cũng làm điều này.)


1
Phải cài đặt bash bằng tay cho việc này. 4.3 không có trong fedora 20 repos.
jozxyqk

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.