Có một chức năng để chèn `(kbd trong khi ăn) đúng bằng cách nhấn phím không?


20

Tôi chán việc tìm kiếm tên khóa cho kbdchức năng, có cách nào để tự động chèn tên khóa chính xác chỉ bằng cách bấm phím không?

Vì vậy, ví dụ tôi muốn một cái gì đó để làm điều này: Tôi đang gõ

(local-set-key |

Tôi chạy magical-insert-kbd-command, nhấn f6 và tôi nhận được

(local-set-key (kbd "<f6>") |

Câu trả lời:


20

Không chắc chắn chính xác những gì bạn đang yêu cầu. Nhưng C-h ktiếp theo bằng cách nhấn phím cho bạn thấy chính xác chuỗi bạn cần chuyển đến kbd. Ví dụ, C-h k f6cho bạn thấy <f6>.

Đây là một lệnh thực hiện những gì bạn muốn, tôi đoán và liên kết kết quả với C-c c:

(defun foo (key)
  (interactive "kKey: ")
  (insert (format "(kbd %S)" (key-description key))))

(global-set-key (kbd "C-c c") 'foo)

Sau đó gõ:

(local-set-key C-c c

Điều đó nhắc bạn sử dụng một phím. Nếu bạn nhấn F6phím thì bạn sẽ nhận được điều này:

(local-set-key (kbd "<f6>") 

[Được cập nhật theo đề xuất của @HaraldHancheOlsen: Thay đổi "(kbd \"%s\")"thành".](kbd %S)"


Hoàn hảo, cảm ơn!. Điều chính tôi đã thiếu là thiếu key-descriptionchức năng.
dshepherd

Nhưng OP nói đúng rằng sẽ rất hữu ích khi có một chức năng tự động đặt phím bấm trong vòng khử.
sợi đốt

1
@incandescentman: Hả? OP nói bất cứ điều gì về vòng giết ? Và ý của bạn là "keybinding" trong câu đó là gì? Một ràng buộc chính không phải là một chuỗi, đó là những gì kill-ringchứa. Bạn có nghĩa là key-descriptionchuỗi? hoặc giá trị trả lại của formatsexp trên ? Dù sao, cần phải rõ ràng làm thế nào để sửa đổi lệnh tôi đã đưa ra, để thêm một trong hai lệnh đó vào kill-ring(chỉ sử dụng kill-new).
vẽ

"tự động chèn." Nếu tôi hiểu chính xác, giải pháp ở trên chỉ hiển thị liên kết phím (ví dụ kbd <M-return>) nhưng không chèn nó vào tệp init. (Bạn sẽ phải thực hiện thêm bước sao chép / dán.) Có thể tôi đã hiểu nhầm. Đối với trường hợp sử dụng cá nhân của riêng tôi, tôi sẽ tìm thấy nó hữu ích để có một cách để truy vấn các cú pháp cho một keybinding (ví dụ như là cú pháp M-REThoặc M-<return>hoặc những gì?) Và tự động đặt chuỗi mà trong vòng kill / tông, vì vậy mà tôi có thể sau đó dán keybinding vào tập tin init của tôi khi viết một dòng như thế nào (define-key map (kbd "<M-return>") 'org-return).
sợi đốt

1
Vâng, bạn đã hiểu lầm. (Nhưng cũng có một lỗi đánh máy trong sexp key-binding: Tôi quên để sử dụng kbdtrong global-set-key. Sexp - chỉnh bây giờ) lệnh foo(mà global-set-keyvới phím tắt sexp C-c c) đọc một dãy phím và sau đó chèn, vào thời điểm của bộ đệm hiện nay, thích hợp kbdcho nó. Nếu bạn sử dụng C-c ctrong tệp init của mình, sau (local-set-key đó, nó sẽ chèn kbdsexp bạn cần cho khóa mà nó đọc.
vẽ

7

Nếu bạn sử dụng M-x local-set-keyđể thực hiện thao tác bấm phím của mình một cách tương tác, bạn có thể sử dụng C-x ESC ESC( repeat-complex-command) để nhận biểu thức Lisp mà bạn có thể dán vào cấu hình của mình. Nó có lẽ sẽ không sử dụng (kbd ...)mô tả kiểu thân thiện , mặc dù.


Khéo léo. Tôi có xu hướng sử dụng define-keymặc dù thực tế, có vẻ đơn giản hơn là chỉ xác định khóa hoàn toàn hơn là thiết lập một hook để gọi một hàm để xác định khóa.
dshepherd
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.