2013-10-01 2 views
1

Я хочу быстрее загружать файлы init emacs, поэтому я использую «eval-after-load».
Например, когда я загружаю файл Clojure, я просто положилОсновное имя режима emacs-lisp

(eval-after-load 'clojure-mode 
    'do-something) 

Он работает.
Но когда я пытаюсь

(eval-after-load 'emacs-lisp-mode 
    'do-something) 

Это не работает. Мне интересно узнать правильное имя основного режима emacs-lisp.
Спасибо.

+1

Когда Emacs запускается, он автоматически открывает буфер * scratch *, который находится в режиме lisp-взаимодействия.Этот режим определен в lisp-mode.el. Это означает, что lisp-mode * всегда * загружается при запуске emacs, так что 'do-something' будет запускаться независимо от того, переносите ли вы его в' eval-after-load'. – Tyler

+0

Спасибо, я понял. –

ответ

2

Just eval с M-: переменная major-mode. На самом деле это emacs-lisp-mode. Обратите внимание, что *scratch* фактически находится в lisp-interaction-mode.

Что касается того, что вы пытаетесь сделать, используйте (eval-after-load "lisp-mode").

4

Пожалуйста, прочтите documentation of eval-after-load:

FORM БИБЛИОТЕКА

Eval-после нагрузки

Эта функция упорядочивает оценить форму в конце загрузки файла библиотеки, каждый раз, когда библиотека загружена. Если LIBRARY уже загружен, он сразу же оценивает форму. Не забудьте указать форму!

[...] БИБЛИОТЕКА также может быть функцией (то есть символом), в этом случае форма оценивается в конце любого файла, где вызывается (provide LIBRARY).

Вам необходимо передать имя файла или библиотеки, которая определяет основной режим, в качестве аргумента.

Хотя некоторые режимы определены в файлах с одинаковым именем (например, clojure-mode в clojure-mode.el), многие файлы имеют другое имя, особенно если на самом деле определяют несколько основных режимов.

emacs-lisp-mode определяется в lisp-mode.el, наряду с некоторыми другими режимами для редактирования Emacs Lisp (например, lisp-mode в качестве общего режима Lisp языка, или lisp-interaction-mode для *scratch* буферов).

Следовательно, использовать (eval-after-load 'lisp-mode …)

Кроме того, вы должны дать один Sexp в качестве второго аргумента, так что вы, вероятно, хотите использовать (eval-after-load 'lisp-mode '(do-something)), чтобы вызвать функцию do-something.

Если вы используете сборку снимков Emacs, используйте with-eval-after-load, то есть (with-eval-after-load 'lisp-mode (do-something)). Это позволяет использовать более одной формы и не требует цитирования.

+0

Спасибо, я понял. –

2

Как объяснил @lunaryom, аргумент arg eval-after-load не является именем функции, а именем функции, которое в основном является именем файла. Поэтому вам нужно найти имя файла, из которого загружается функция. Мы могли бы предоставить такую ​​функцию, как eval-after-defun, и действительно, это может быть хорошей идеей. Если вам нужна такая вещь, попросите ее через M-x report-emacs-bug.