Есть ли функция для вставки правильного `(kbd“… ”)` нажатием клавиши?

20

Мне надоело искать названия клавиш для kbdфункции, есть ли способ автоматически вставить правильное имя клавиши простым нажатием клавиши?

Так, например, я хочу что-то сделать это: я печатаю

(local-set-key |

Я бегу magical-insert-kbd-command, жму f6 и получаю

(local-set-key (kbd "<f6>") |
dshepherd
источник

Ответы:

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
Но OP прав, что было бы полезно иметь функцию, которая автоматически помещала бы привязку клавиш в список уничтожений.
Лампа накаливания
1
@incandescentman: А? Где ОП говорит что-нибудь об убийственном кольце ? И что вы подразумеваете под «связыванием клавиш» в этом предложении? Связывание ключей - это не строка, а то, что kill-ringсодержится. Вы имеете в виду key-descriptionстроку? или возвращаемое значение вышеуказанного formatsexp? В любом случае, должно быть ясно, как изменить команду, которую я дал, чтобы добавить любую из них в kill-ring(просто используйте kill-new).
Дрю
"автоматически вставить." Если я правильно понимаю, решение выше отображает только привязку клавиш (например kbd <M-return>), но не вставляет его в файл инициализации. (Вам придется выполнить дополнительный шаг копирования / вставки.) Возможно, я неправильно понял. Для моего собственного личного пользования случае, мне были бы полезно иметь возможность запрашивать синтаксис для сочетания клавиша (например , синтаксис M-RETили M-<return>или что?) И автоматически поместить эту строку в удалениях / картоне, так что я мог тогда вставьте связывание клавиш в мой файл инициализации при написании строки, как (define-key map (kbd "<M-return>") 'org-return).
Лампа накаливания
1
Да, вы неправильно поняли. (Но была также опечатка в связующем ключе sexp: я забыл использовать kbdв global-set-keysexp - исправлено сейчас.) Команда foo(с которой global-set-keyсвязывается sexp C-c c) читает последовательность клавиш и затем вставляет, в точке текущего буфера, правильный kbdсекс для этого. Если вы используете C-c cв своем файле инициализации после (local-set-key , то он вставляет kbdнужный вам пол для ключа, который он читает.
Дрю
7

Если вы используете M-x local-set-keyинтерактивное связывание клавиш, вы можете использовать C-x ESC ESC( repeat-complex-command), чтобы получить выражение Lisp, которое вы можете вставить в свою конфигурацию. Однако, вероятно, он не будет использовать (kbd ...)описания в дружественном стиле.

Саша Чуа
источник
Ухоженная. Я обычно использую, define-keyхотя на самом деле кажется, что проще просто определить ключ напрямую, чем установить ловушку для вызова функции для определения ключа.
dshepherd