Перейдите к исходному коду встроенных функций и переменных

9

В течение дня я постоянно использую C-h fили C-h v( describe-functionи describe-variable) для поиска документации по функциям и переменным. Чаще всего, если я не получаю всю необходимую информацию, я нажимаю на ссылку файла в конце:

some-random-command is an interactive compiled Lisp function in `some-mode.el'.

и перейдите к исходному коду. Это работает для установленных пакетов, но, похоже, не работает для встроенных. Например, в верхней части страницы справки для команды describe-functionвсе, что я получаю, это:

describe-function is an interactive compiled Lisp function.

без ссылки на исходный код. Есть ли способ быстро перейти к исходному коду встроенного пакета?

Я знаю, что могу найти исходный код, например, /usr/share/emacs/24.5/lispи найти множество способов быстрого доступа к этому каталогу, но мне любопытно, есть ли быстрый и простой способ перехода к встроенной функции / определению переменной в исходный код. Спасибо!

elethan
источник
5
M-x find-function; M-x find-variable; M-x find-face; M-x find-library, Я всегда использую полную установку Emacs, чтобы у меня был доступ ко всему, и сразу после сборки своего собственного Emacs я копирую исходный код C и устанавливаю его местоположение, чтобы я мог также найти определения кода C-Source. Смотрите переменную, find-function-C-source-directoryчтобы установить местоположение исходного кода на C после того, как вы скопируете его.
юрист
1
Используя основную ветку Emacs, я получаю следующее M-x describe-function: description-function - это интерактивная автоматически загружаемая скомпилированная функция Lisp в 'help-fns.el'. И оттуда я могу нажать (или нажать Enter) help-fns.elи затем перенести в соответствующий раздел кода. Возможно, у вас есть несколько версий Emacs, а в той, которую вы используете в данный момент, не установлен весь исходный код?
юрист
Если вы получаете такое поведение при запуске Emacs с использованием emacs -Q(без файла инициализации) или если вы можете воспроизвести его с помощью рецепта, начинающегося с emacs -Q(например, с указанием, какие библиотеки вы загружаете, как вы их загружаете и т. Д.), Тогда, пожалуйста, рассмотрите возможность сообщения об ошибке Докладываю: M-x report-emacs-bug.
Дрю
4
nb IIRC, пакеты Emacs для Debian (возможно, и других ОС) отделяют .elфайлы (считаются необязательными) от .elcфайлов (обязательных), так что вам нужно установить один или несколько дополнительных пакетов для их получения. Если вы получили Emacs от менеджера пакетов вашей ОС, возможно, это объясняет это.
Филс
1
Вы можете выполнить grep (или другую поисковую утилиту) для имени двоичных файлов (с разрешениями для исполняемых файлов) - emacs или emacsclient - и посмотреть, где они находятся на вашем жестком диске. Я храню мои совершенно отдельно в своей собственной папке. Например, у меня есть версия , которая поставляется с моей операционной системой - /usr/bin/emacsи /usr/bin/emacsclient, и у меня есть версия красиво упакованная в приложении OSX папки заканчивается в .app - то есть, /Applications/Emacs.app(внутри что Emacs.app, являются бинарными файлами и все файлы исходного кода).
юрист

Ответы:

7

Причина, по которой вы иногда видите «интерактивно скомпилированную функцию Lisp» (или аналогично для переменных) без имени файла, заключается в том, что функция была загружена из скомпилированного байта файла, а соответствующий исходный файл Elisp отсутствует. Чтобы показать вам исходный код, Emacs должен быть в состоянии найти исходный код.

Многие дистрибутивы поставляют исходные файлы Lisp в отдельном пакете, потому что не каждый пользователь хочет их, и они громоздки. Например, на Debian и производные, установите emacs24-el. Если вы строите Emacs из исходного кода, make installкопируйте исходные коды Elisp.

Если вы хотите увидеть исходный код примитивов (подпрограммы и специальные формы), Emacs должен быть в состоянии найти источники Си. Они обычно не доступны, если вы не установили из источника.

Emacs ищет источники Lisp в каталогах в load-path. Для функции или переменной, загруженной из foo.elc,файла, может быть foo.elили foo.el.gz. Emacs ищет исходники C source-directoryи запрашивает другой каталог, если не находит исходный файл.

Жиль "ТАК - перестань быть злым"
источник
Хотя я мог бы поклясться, что собрал эту версию Emacs из исходного кода, когда я звоню, M-x emacs-versionв конце она говорит «изменено Debian», что будет означать, что я использую версию из диспетчера пакетов моей ОС (Ubuntu), верно?
elethan
@elethan Если написано «изменено Debian», значит, вы установили или хотя бы собрали пакет Ubuntu. Возможно, вы создали его из исходного кода (возможно, потому, что вы хотели более новую версию, чем та, которая была в вашем выпуске Ubuntu). Ты бежишь /usr/bin/emacsили /usr/local/bin/emacs?
Жиль "ТАК - перестань быть злым"
1

Если вы ищете способы быстрого перехода к исходному коду, есть также find-function-at-pointи такие, find-variable-at-pointкоторые будут переходить к определению символа под курсором - вы можете, например, связать их с Ch Cf и Ch Cv.

Или вы можете попробовать elisp-slime-nav , который использует M-. перейти к определению символа и M-, чтобы вернуться - он перемещается к переменным, функциям, библиотекам и лицам - https://github.com/purcell/elisp-slime-nav/

Брайан Бернс
источник