2010-11-17 32 views

Trả lời

116

Bạn có thể xác định chuỗi ký tự được phát ra bởi một chìa khóa bằng cách nhấn tổ hợp phím Ctrl -. v tại cửa sổ dòng lệnh, sau đó nhấn phím bạn quan tâm đến hệ thống của tôi cho F12, tôi nhận được ^[[24~. ^[ đại diện cho Esc. Các loại thiết bị đầu cuối hoặc trình mô phỏng đầ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 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 có một tổ hợp 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ẽ nhận được thư mục hiện hành hiển thị mà không cần phải nhấn Nhập. Điều gì nếu bạn đã gõ một cái gì đó trên đường dây và bạn sử dụng này mà tự động thực hiện? Nó có thể 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 bạn:

bind '"\e[24~":"\C-k \C-upwd\n"' 

Không gian làm cho chắc chắn rằng Ctrl - u có cái gì đó để xóa để giữ chuông từ đổ chuông.

Khi bạn đã nhận được macro hoạt động theo cách bạn muốn, bạn có thể làm cho nó liên tục bằng cách thêm macro vào tệp ~/.inputrc của bạn.Không cần cho bind lệnh hoặc các thiết lập bên ngoài của dấu nháy đơn:

"\e[24~":"\C-k \C-upwd\n" 

Edit:

Bạn cũng có thể tạo ra một chìa khóa gắn kết rằng sẽ thực hiện một cái gì đó mà không làm phiền các dòng lệnh hiện hành.

bind -x '"\eW":"who"' 

Sau đó, trong khi bạn đang gõ một lệnh yêu cầu username, ví dụ, và bạn cần phải biết tên của người dùng đã đăng nhập, bạn có thể nhấn Alt - phím Shift - W và đầu ra của who sẽ được hiển thị và lời nhắc sẽ được cấp lại với lệnh còn lại một phần của bạn và con trỏ ở cùng vị trí trong dòng.

Rất tiếc, tính năng này không hoạt động bình thường đối với các phím như F12 có thể xuất nhiều hơn hai ký tự. Trong một số trường hợp, điều này có thể được thực hiện xung quanh.

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.

+2

Nếu tôi muốn thêm một ràng buộc vào "ctrl + q" thì sao? – kubudi

+5

@kubudi: 'bind '" \ C-q ": menu-complete'' chẳng hạn (hoặc trong' ~/.inputrc': '" \ C-q ": menu-complete'). Bạn cũng có thể cần 'stty -ixon' trong' ~/.bashrc' để tắt điều khiển luồng và tạo^S và^Q. –

+0

Bạn nói rằng '^ [' đại diện cho 'esc' và sau đó bạn dường như thay thế nó cho' \ e' trong ví dụ của bạn. Bạn có thể giải thích tại sao không? – Remover

6

Giải pháp này là cụ thể cho các môi trường X11 và không có gì để làm với bash, nhưng thêm dòng sau vào .Xmodmaps bạn

% loadkeys 
keycode 88 = F12 
string F12 = "foobar" 
% 

sẽ gửi chuỗi "foobar" đến nhà ga sau khi nảy F12.

+0

Hãy nhớ rằng điều này không giống như trình bao chạy lệnh. Nếu bạn thực sự muốn chạy một lệnh, bạn sẽ phải nhấn enter (hoặc có chuỗi được gửi làm điều đó cho bạn). Có lẽ cũng muốn được an toàn và rõ ràng dòng đầu tiên. – Cascabel

+0

Điều này sẽ tuyệt vời, nhưng nó dường như không hoạt động như Fedora 20. Tôi thậm chí đã cố gắng sử dụng xev để tìm mã khóa thích hợp cho F12 đầu tiên (trong trường hợp của tôi, 96) và sử dụng nó thay vì 88. Không ai làm việc. – BobDoolittle

11

Bạn có thể xác định các ràng buộc khóa bash trong tệp .inputrc (tệp cấu hình cho thư viện GNU Readline). Cú pháp là

< keysym hoặc phím tên >: vĩ mô

ví dụ:

Control-o: "> output" 

sẽ tạo một macro mà chèn "> đầu ra" khi bạn nhấn

"\e[11~": "echo foobar" 

sẽ tạo ra một macro mà chèn "echo foobar" khi bạn nhấn F1 ... Tôi không biết những gì keysym cho F11 là tắt tay.

+0

Đẹp, nhưng điều này chỉ "chèn", đúng không? –

+3

bạn có thể sử dụng "\ n" trong macro, để thêm ký tự dòng mới: –

+0

Điều này phù hợp hơn với tôi vì nó xác định ánh xạ khóa khi mở một thiết bị đầu cuối. – Heldraug

Các vấn đề liên quan