В каком файле была определена привязка клавиш? - PullRequest
6 голосов
/ 04 мая 2009

Учитывая нажатие клавиш в Emacs, например C-x C-s . Я могу выяснить, какую функцию он вызывает, набрав C-h c нажатие клавиши , но как я могу найти, где была определена эта привязка клавиш?

(Возможно, правильный ответ заключается в том, что это не может быть решено, потому что таблицы ключей не хранят такую ​​информацию.)

Ответы [ 2 ]

5 голосов
/ 04 мая 2009

Информация о том, где сочетания клавиш связаны с функциями, не хранится в Emacs. На самом деле ответ обычно не определен.

Часто привязки клавиш устанавливаются как побочный эффект второстепенного режима или через перехват мод. Привязка клавиш для второстепенных режимов часто хранится в некоторой переменной, например comint-mode-map. Эта раскладка клавиатуры включается установкой переменной режима comint-mode. Однако эта карта режимов является глобальной переменной, и любой, где угодно, может добавить к ней привязки клавиш. Таким образом, выполнение того, что вы хотите, по существу отслеживает, кто устанавливает переменную с определенным значением. Аналогично для привязок клавиш, которые устанавливаются локально с помощью ловушек режима (используя local-set-key). Кроме того, вы даже можете установить привязки клавиш через файловые переменные . Все это просто говорит о том, что привязки клавиш в Emacs эфемерны.

Самое лучшее, что вы можете сделать, - это найти функцию, связанную с клавишей, и посмотреть в этом файле (или любых связанных файлах, если режим разделен на несколько файлов).

Поиск связывания ключей в emacs довольно сложен из-за множества способов, которыми вы можете устанавливать / связывать нажатия клавиш (глобально, основной режим, второстепенные режимы, переопределение второстепенных режимов, локальный для буферов, свойства текста и т. Д.). Для быстрого обзора, ознакомьтесь с этой документацией .

Вы можете написать такую ​​функцию, чтобы просматривать второстепенные режимы, чтобы увидеть, где может быть установлена ​​привязка клавиш, но, конечно, мой первый тест показал, что привязка клавиш там не была определена. Но, возможно, код будет поучительным.

(defun guess-where-keybinding-is-defined (key)
  "try to guess where a key binding might be defined"
  (interactive (list (read-key-sequence "Describe key: ")))
  (let ((bindings (minor-mode-key-binding key))
        found)
    (while (and bindings (not found))
      (if (setq found (caar bindings))
          (find-function (cdar bindings)))
      (setq bindings (cdr bindings)))))

Есть ли конкретная проблема, которую вы пытаетесь решить (кроме этого вопроса)?

1 голос
/ 04 мая 2009

Просто сделай M-x find-function

Из документа Emacs:

(функция поиска функции)

Найти определение функции ближняя точка.

Находит исходный файл, содержащий определение функции вблизи точки (выбран "функция называется в точке") в буфер и места указывают перед определение. Установите марку перед движением, если буфер уже существует.

...