Вопрос

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

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

Это было полезно?

Решение

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

Часто привязки клавиш настраиваются как побочный эффект второстепенного режима или с помощью переключателей режимов.Привязка ключа для второстепенных режимов часто сохраняется в некоторой переменной, например comint-mode-map.Эта ключевая карта включается путем установки переменной mode (режим) 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)))))

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

Другие советы

Просто выполните M-x find-функцию

Из Emacs doc:

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top