Emacs имя текущей локальной таблицы ключей?
Я пишу функцию elisp, которая постоянно связывает данный ключ с данной командой в таблице ключей текущего основного режима. Например,
(define-key python-mode-map [C-f1] 'python-describe-symbol)
Команда и последовательность клавиш собираются интерактивно от пользователя. Однако у меня возникли проблемы с созданием имени KEYMAP (например, "python-mode-map"), которое соответствует текущему основному режиму.
Я пробовал функцию (current-local-map), но эта функция возвращает сам объект раскладки, а не его имя.
Я понимаю, что многие сопоставления основных режимов названы в соответствии с соглашением 'major-mode-name'-mode-map', однако это не всегда так (например, python-shell-map), поэтому я бы предпочел мой код не полагаться на это соглашение. (Я даже не уверен, как получить доступ к названию текущего основного режима).
(define-key ...)
должен быть добавлен в файл инициализации, поэтому, хотя
(define-key (current-local-map) key command)
кажется, работает, он не работает как код в файле инициализации.
3 ответа
Не существует прямого способа найти имя текущей локальной таблицы ключей - точнее, символа, к которому привязано его значение, - потому что таблица ключей даже не должна быть привязана к символу. Тем не менее, раскладки клавиш режима обычно связаны с глобальным символом, и можно найти, какой это символ, перебирая все символы и останавливаясь на том, значение которого равно eq
к объекту раскладки клавиатуры.
При этом необходимо учитывать все символы (хотя они работают минимально с каждым), но имеет то преимущество, что не полагается на какое-либо конкретное соглашение об именах.
(defun keymap-symbol (keymap)
"Return the symbol to which KEYMAP is bound, or nil if no such symbol exists."
(catch 'gotit
(mapatoms (lambda (sym)
(and (boundp sym)
(eq (symbol-value sym) keymap)
(not (eq sym 'keymap))
(throw 'gotit sym))))))
;; in *scratch*:
(keymap-symbol (current-local-map))
==> lisp-interaction-mode-map
Функция local-set-key
существует с целью связывания ключей в текущей локальной карте ключей.
Может быть, вы могли бы попробовать:
(define-key (concat (symbol-name major-mode) "-map") [C-f1] 'python-describe-symbol)
редактировать: хотя это даст правильную строку, он все равно должен быть преобразован обратно в символ.