Ví dụ: Tôi muốn liên kết F12khóa với lệnh echo "foobar"
để mỗi khi tôi nhấn F12, thông báo "foobar" sẽ được in ra màn hình. Lý tưởng nhất là nó có thể là bất kỳ lệnh shell tùy ý nào, không chỉ là nội trang. Làm thế nào để một người đi về điều này?
Câu trả lời:
Bạn có thể xác định chuỗi ký tự được tạo ra bởi một phím bằng cách nhấn Ctrl- vtại dòng lệnh, sau đó nhấn phím bạn quan tâm. Trên hệ thống của tôi F12, tôi nhận được ^[[24~
. Các ^[
đại diện Esc. Các loại thiết bị đầu cuối hoặc trình giả lập đầu cuối khác nhau có thể phát ra các mã khác nhau cho cùng một khóa.
Tại dấu nhắc Bash, bạn có thể nhập một lệnh như thế này để bật macro khóa để bạn có thể dùng thử.
bind '"\e[24~":"foobar"'
Bây giờ, khi bạn nhấn F12, bạn sẽ nhận được "foobar" trên dòng lệnh sẵn sàng để chỉnh sửa thêm. Nếu bạn muốn gõ phím để nhập lệnh ngay lập tức, bạn có thể thêm một dòng mới:
bind '"\e[24~":"pwd\n"'
Bây giờ khi bạn nhấn F12, bạn sẽ thấy thư mục hiện tại được hiển thị mà không cần phải nhấn Enter. Điều gì sẽ xảy ra nếu bạn đã nhập một cái gì đó trên dòng và bạn sử dụng nó để tự động thực thi? Nó có thể trở nên lộn xộn. Tuy nhiên, bạn có thể xóa dòng như một phần của macro của mình:
bind '"\e[24~":"\C-k \C-upwd\n"'
Khoảng trống đảm bảo rằng dấu Ctrl- ucó thứ gì đó cần xóa để giữ cho chuông không kêu.
Khi bạn đã có macro hoạt động theo cách bạn muốn, bạn có thể làm cho nó hoạt động bền bỉ bằng cách thêm nó vào ~/.inputrc
tệp của bạn . Không cần bind
lệnh hoặc tập hợp các dấu ngoặc kép bên ngoài:
"\e[24~":"\C-k \C-upwd\n"
Biên tập:
Bạn cũng có thể tạo một ràng buộc khóa để thực thi một cái gì đó mà không làm ảnh hưởng đến dòng lệnh hiện tại.
bind -x '"\eW":"who"'
Sau đó, trong khi bạn đang nhập một lệnh yêu cầu tên người dùng, chẳng hạn và bạn cần biết tên của người dùng đã đăng nhập, bạn có thể nhấn Alt- Shift- Wvà kết quả củawho
sẽ được hiển thị và lời nhắc sẽ được cấp lại giữ nguyên lệnh một phần của bạn và con trỏ ở cùng vị trí trong dòng.
Thật không may, điều này không hoạt động đúng đối với các phím chẳng hạn như F12xuất ra nhiều hơn hai ký tự. Trong một số trường hợp, điều này có thể được giải quyết.
Lệnh ( who
trong trường hợp này) có thể là bất kỳ thực thi nào - một chương trình, tập lệnh hoặc hàm.
bind '"\C-q": menu-complete'
ví dụ (hoặc trong của bạn ~/.inputrc
: "\C-q": menu-complete
). Bạn cũng có thể cần stty -ixon
trong của bạn ~/.bashrc
để kiểm soát dòng chảy vô hiệu hóa và làm ^ S và ^ Q sẵn.
^[
đại diện esc
và sau đó bạn dường như thay thế nó \e
trong ví dụ của mình. Bạn có thể giải thích tại sao không?
^[
biểu diễn đầu ra. Đây \e
là một cách để nhập nó ( ^[
không hoạt động cho điều đó).
Bạn có thể xác định các ràng buộc khóa bash trong ~/.inputrc
(tệp cấu hình cho thư viện GNU Readline). Cú pháp là
<keyym hoặc key name>: macro
ví dụ:
Control-o: "> output"
sẽ tạo macro chèn "> output" khi bạn nhấn ControlO
"\e[11~": "echo foobar"
sẽ tạo một macro chèn "echo foobar" khi bạn nhấn F1... Tôi không biết từ viết tắt của nó là gìF11 tắt của nó là gì.
Biên tập:
.inputrc
hiểu \n
trình tự thoát cho dòng cấp dữ liệu, vì vậy bạn có thể sử dụng
"\e[11~": "echo foobar\n"
Điều này sẽ hiệu quả 'nhấn enter' sau khi lệnh được đưa ra.
Alt
, sử dụng \e
, ví dụ "\eo": "> output"
.
.inputrc
see hackaday.com/2018/01/19/linux-fu-custom-bash-command-completion
Giải pháp này dành riêng cho môi trường X11 và không liên quan gì đến bash, nhưng thêm phần sau vào .Xmodmaps của bạn
% loadkeys
keycode 88 = F12
string F12 = "foobar"
%
sẽ gửi chuỗi "foobar" đến thiết bị đầu cuối khi nhấn F12.
Tôi muốn liên kết Ctrl+B
với một lệnh. Lấy cảm hứng từ một câu trả lời ở trên, tôi đã cố gắng sử dụng bind
nhưng không thể tìm ra chuỗi câu trả lời khó hiểu ( \e[24~
?) Dịch sangCtrl+B
.
Trên máy Mac, đi tới Cài đặt của ứng dụng Terminal, Cấu hình -> Bàn phím -> +
sau đó nhấn phím tắt bạn đang theo dõi và nó sẽ xuất hiện. Đối với tôi, Ctrl+B
kết quả là \002
tôi đã liên kết thành công lệnh
bind '"\002":"echo command"'
Ngoài ra, nếu bạn muốn lệnh được thực thi ngay lập tức (không chỉ được chèn vào dấu nhắc), bạn có thể thêm Enter vào cuối lệnh của mình, như sau:
bind '"\002":"echo command\015"'