Чи є функція вставити правильний `(kbd“… ”)` натисканням клавіші?


20

Мені нудно шукати ключові імена для kbdфункції, чи є спосіб автоматично вставити правильне ім'я клавіші лише натисканням клавіші?

Так, наприклад, я хочу щось зробити: я набираю текст

(local-set-key |

Я біжу magical-insert-kbd-command, натискаю f6 і я отримую

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

Відповіді:


20

Не впевнений, що саме ви просите. Але C-h kслідом за натисканням клавіші ви точно показуєте, в яку строку потрібно перейти kbd. Наприклад, C-h k f6показує <f6>.

Ось команда, яка виконує те, що ви хочете, я думаю, і прив'язує результат до C-c c:

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

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

Потім введіть:

(local-set-key C-c c

Це спонукає вас використовувати ключ. Якщо ви натиснете F6клавішу, ви отримаєте це:

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

[Оновлено за пропозицією @HaraldHancheOlsen: Змінено "(kbd \"%s\")"на".](kbd %S)"


Ідеально, дякую !. Головне, що мені бракувало, - це відсутність key-descriptionфункції.
dshepherd

Але ОП правильно, що було б корисно мати функцію, яка автоматично розміщувала в'язання клавіш у кільці вбивства.
лампа розжарювання

1
@incandescentman: А? Де ОП говорить щось про кільце вбивства ? І тільки що ви маєте на увазі під "сполученням клавіш" у цьому реченні? Ключова прив'язка - це не рядок, який містить те, що kill-ringмістить. Ви маєте на увазі key-descriptionрядок? або повернене значення вищевказаного formatsexp? У будь-якому випадку, повинно бути зрозуміло, як змінити команду, яку я дав, додати будь-яку з них до kill-ring(просто використовувати kill-new).
Дрю

"автоматично вставити." Якщо я правильно розумію, рішення вище відображає лише палітурку клавіш (наприклад kbd <M-return>), але не вставляє її у файл init. (Вам доведеться зробити додатковий крок копіювання / вставки.) Можливо, я зрозумів неправильно. Для мого власного особистого користування випадку, мені були б корисно мати можливість запитувати синтаксис для поєднання клавіша (наприклад , синтаксис M-RETабо M-<return>або що?) І автоматично помістити цей рядок в удалениях / картоні, так що я міг тоді вставити палітурку клавіш у мій файл init під час написання рядка типу (define-key map (kbd "<M-return>") 'org-return).
лампа розжарювання

1
Так, ви неправильно зрозуміли. (Але також була помилка друку в сексі, що зв'язує ключі: я забув використати kbdв global-set-keyсексопі - виправлено зараз.) Команда foo(до якої global-set-keysexp пов'язує C-c c) зчитує послідовність клавіш і потім вставляє в точку буфера потоку належний kbdsexp для цього. Якщо ви користуєтесь C-c cу своєму файлі init, після (local-set-key цього він вставляє kbdпотрібну вам сексом для ключа, який він зчитує.
Дрю

7

Якщо ви використовуєте M-x local-set-keyпалітурку в Інтерактивному режимі, ви можете використовувати C-x ESC ESC( repeat-complex-command), щоб отримати вираз Lisp, який можна вставити у ваш конфігурацію. Це, мабуть, не буде використовувати дружні (kbd ...)стилі опису, хоча.


Акуратний. Я схильний використовувати, define-keyхоча насправді, здається, що просто визначити ключ прямо, ніж встановити гачок, щоб викликати функцію для визначення ключа.
дшеферд
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.