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)

редактировать: хотя это даст правильную строку, он все равно должен быть преобразован обратно в символ.

Другие вопросы по тегам