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

2264
Micah R Ledbetter

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

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

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

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

6
Если вы сохранили `.emacs` в буфере, попробуйте отменить, как сумасшедший. Gilles 12 лет назад 1

2 ответа на вопрос

6
Gilles

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

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

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

Спасибо! `(символ-функция 'имя-функции)` это именно то, что я искал! Кроме того, похоже, что если вам действительно нужен источник функций C, вы можете получить его, используя информацию из ответа Олега. Micah R Ledbetter 12 лет назад 0
Спасибо! Кроме того, если функция загружается автоматически, вам нужно вызвать ее один раз, прежде чем вы сможете получить исходный код. Gerhard Burger 10 лет назад 0
3
Oleg Pavliv

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

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

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

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

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

Похожие вопросы