Перейдіть до вихідного коду вбудованих функцій та змінних


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і придумати будь-яку кількість способів швидкого доступу до цього каталогу, але мені цікаво, чи є швидкий і простий спосіб перейти до вбудованого визначення функції / змінної у вихідний код. Дякую!


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щоб встановити розташування коду С-джерела після його копіювання.
законник

1
Використання майстер - гілки Emacs, я отримую наступне з M-x describe-function: описати-функція являє собою інтерактивну функцію автозавантаження скомпільований Лисп в «довідковому-fns.el». І звідти я можу натиснути (або натиснути клавішу введення) help-fns.elі потім перенестись у відповідний розділ коду. Можливо, у вас є кілька версій Emacs, а в тій, яку ви використовуєте на даний момент, не встановлено весь вихідний код?
законник

Якщо ви проявляєте таку поведінку, коли ви запускаєте Emacs за допомогою emacs -Q(без файлу init) або якщо ви можете спростувати його за допомогою рецепта, який починається з emacs -Q(наприклад, кажучи, які бібліотеки ви завантажуєте і як ви завантажуєте їх тощо), тоді, будь ласка, подумайте про подачу помилки доповідаю: M-x report-emacs-bug.
Дрю

4
nb IIRC, пакети Emacs для Debian (можливо, також і інші ОС) відокремлюють .elфайли (трактуються як необов'язкові) від .elcфайлів (обов'язково), таким чином, щоб отримати їх, вам потрібно встановити один або кілька додаткових пакетів. Якщо ви отримали Emacs від свого менеджера пакунків ОС, можливо, це пояснюється.
філ

1
Ви можете зробити греп (або іншу утиліту пошуку) для назви бінарних файлів (з виконаними правами доступу) - emacs або emacsclient - і подивитися, де вони знаходяться на вашому жорсткому диску. Я зберігаю мою повністю окремо у власній спеціальній папці. Наприклад, у мене є версія, що постачається з моєю операційною системою - /usr/bin/emacsі у /usr/bin/emacsclientмене є версія, добре упакована в папку додатків OSX, що закінчується в .app - тобто /Applications/Emacs.app(всередині цього Emacs.app - це бінарні файли та всі файли вихідного коду).
законник

Відповіді:


7

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

Багато дистрибутивів постачають вихідні файли Lisp в окремий пакет, тому що не кожен користувач хоче їх, і вони об'ємні. Наприклад, на Debian та похідні встановіть emacs24-el. Якщо ви make installстворюєте Emacs з джерела, скопіюйте джерела 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 Якщо в ньому написано "модифіковано 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/

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.