Есть ли способ напечатать определение существующей функции в Emacs?

10

Я хочу увидеть определение существующей функции в Emacs. Это возможно?

Я пытался C-h d function-name RET, но он возвращает только строку документации для функции, а не саму функцию.

Я думаю о чем-то похожем на typeкоманду bash , которая вернет полное определение функции.

(Смущающая предыстория: я случайно переписал рабочую функцию в своем .emacsфайле с нерабочей версией. Оригинальная функция все еще находится в памяти! И она работает! Но я не могу на всю жизнь вспомнить, как я это сделал.)

Мика Р Ледбеттер
источник
1
Если вы держите .emacsоткрытым в буфере, попробуйте отменить, как сумасшедший.
Жиль "ТАК - перестань быть злым"

Ответы:

10

Если вы введете текст C-h f function-name RET, вы получите документацию по функции, со ссылкой на источник функции, если он доступен.

Я не думаю, что есть простая функция Lisp, которую вы можете вызвать, чтобы получить местоположение источника функции; поиск довольно тесно связан с остальной частью справочной системы. find-lisp-object-file-nameявляется основной функцией, которая пытается выяснить, где находится источник функции.

Если function-nameэто не примитив (определенный в C-источнике Emacs), вы можете увидеть его код с помощью (symbol-function 'function-name)или, в более общем смысле (косвенная функция 'имя-функции). Однако, если функция была скомпилирована, все, что вы увидите, это ее байт-код.

Жиль "ТАК - перестань быть злым"
источник
1
Спасибо! (symbol-function 'function-name)это именно то, что я искал! Кроме того, похоже, что если вам действительно нужен источник функций C, вы можете получить его, используя информацию из ответа Олега.
Мика Р Ледбеттер
Спасибо! Кроме того, если функция загружается автоматически, вам нужно вызвать ее один раз, прежде чем вы сможете получить исходный код.
Герхард Бургер
3

M-x find-function возвращает определение функции рядом с точкой.

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

Находит в буфере исходный файл, содержащий определение функции вблизи точки (выбранной функцией function-named-at-point), и помещает точку перед определением. Установите метку перед перемещением, если буфер уже существует.

Если вы хотите включить также функции, реализованные в C, вы должны добавить следующее в ваш файл .emacs:

(setq find-function-C-source-directory (concat (getenv "emacs_home") "/path/to/source-dir"))
Олег Павлив
источник
Хм. Это полезно знать, но я думаю, что это работает только для встроенных функций, а это не то, что я искал.
Мика Р Ледбеттер
1
Он работает и для пользовательских функций
Олег Павлив