Bí quyết để làm điều này là gọi các chức năng giúp khôi phục khóa của bạn. Trong ví dụ của tôi, tôi sẽ sử dụng C-b để chèn văn bản và gọi để hoàn thành menu, thay vì C-x. Bạn sẽ phải hy sinh một khóa, trong ví dụ của tôi C-t
In.bashrc, hoặc một file bash được nguồn gốc
set_Cb_to_insert_text() {
bind '"\C-m": accept-line'
bind '"\C-b":"ls \C-t1"'
bind -x '"\C-t1":set_Cb_to_complete'
}
set_Cb_to_complete() {
bind '"\C-m":"\C-t2\C-t3"'
bind '"\C-b": menu-complete'
bind '"\C-t2": accept-line'
bind -x '"\C-t3":set_Cb_to_insert_text'
}
set_Cb_to_insert_text
Cách hoạt động:
Với bind
, bạn có thể gắn chìa khóa để làm một trong ba điều, nhưng không có sự kết hợp của chúng:
- Thực hiện một lệnh readline:
bind '"key": command'
- Thực hiện một loạt các tổ hợp phím:
bind '"key":"keystrokes"'
- Thực thi lệnh shell:
bind -x '"key": shell-command'
Vì vậy, nếu bạn muốn kết hợp ba điều này, bạn sẽ cần để ràng buộc họ từng đến một sự kết hợp riêng biệt của tổ hợp phím (trong ví dụ của tôi Ct {, , }) và ràng buộc một phím để thực hiện tất cả các tổ hợp phím này.
Trong ví dụ:
C-b chèn đầu tiên ls
và 'ép' C-t , mà thực hiện set_Cb_to_complete
, mà lần lượt rebinds C-b để menu-complete
. Nó cũng rebinds Cm, vận chuyển trở lại, hoặc Nhập, bởi vì nó bây giờ cần làm hai việc: Chấp nhận dòng, và đặt lại Cb để chèn ls
, bằng cách gọi set_Cb_to_insert_text
chức năng, mà cũng reset Nhập để đó là sử dụng bình thường.
Lý do tôi nói rằng Ct phải được "hy sinh", là nếu bạn bấm Ct, readline sẽ chờ đợi để xem nếu bạn đang đi để bấm phím 1, hoặc 2, hoặc bất kỳ phím ràng buộc trình tự, trước khi thực hiện bất kỳ hành động nào. Nhưng khi bạn lần đầu tiên đặt C-t vào mục đích sử dụng này, bạn có thể sử dụng nó làm khóa ban đầu cho một số lượng lớn các tổ hợp phím để trang trải tất cả các thủ thuật đọc của bạn.
Lời khuyên: Khi bạn đang viết và kiểm tra, hãy liên kết khóa thay thế đến accept-line
, vì đột nhiên có thứ gì đó phá vỡ chuỗi ở sai địa điểm và bạn bị mắc kẹt trong thiết bị đầu cuối mà không có cách thực hiện lệnh :)
cảm ơn bạn rất nhiều vì ý tưởng, ví dụ và câu trả lời chi tiết (phức tạp, vâng, nhưng bạn đã làm việc trong khuôn khổ bash + readline và những hạn chế của chúng). Hơn một năm sau khi đăng bài, tôi chỉ có thể nhớ một cách mơ hồ những gì tôi đang cố gắng làm trong bức tranh lớn ... vì vậy tôi chỉ xác minh rằng ví dụ của bạn hoạt động nhưng sẽ đầu tư thêm thời gian để tái tạo những gì tôi đã cố gắng thực hiện trước đó - Cảm ơn! – nhed