Сбой автозагрузки в Emacs c-mode

Я хочу загрузить мой файл с именем "my-c-setup.el", когда загружается c-mode. Итак, я использую функцию "автозагрузка".

С моей настройкой Python это работает хорошо:

lang.el

(autoload 'python-mode "my-python-setup" "" t)

мой-питон-setup.el

(require 'python)
; ...

Я пытаюсь сделать то же самое с c-mode, но у меня ничего не получается:

lang.el

(autoload 'c-mode "my-c-setup" "" t)

моя-с-setup.el

(setq c-basic-offset 4)
; ...

Когда я пытаюсь открыть файл в режиме c (например, test.c), у меня появляется следующая ошибка:

File mode specification error: (error "Autoloading failed to define function c-mode")

3 ответа

Решение

Автозагрузка это не то, что вы ищете. Он просто загружает некоторый код в первый раз, когда это необходимо, что является удобным способом расширить функциональность Emacs, сохраняя при этом время запуска на низком уровне.

Чтобы решить вашу проблему, нам нужно подумать о том, что вы действительно хотите сделать: хотите ли вы, чтобы какой-то код загружался в какой-то момент, или вам нужны локальные настройки буфера для любого буфера, который находится в c-mode?

Если вы просто хотите, чтобы Emacs загружал ваш код при запуске, поместите код прямо в свой .emacs файл или использование load-file или же require вместо autoload:

load-file просто берет имя файла, загружает код lisp в этот файл и оценивает его. Поэтому, если ваш код находится в файле с именем "/path/to/my-c-setup.el", вы можете поместить следующую строку в ваш.emacs, и код будет загружаться при каждом запуске:

(load-file "/path/to/my-c-setup.el")

Возможно, вы не хотите указывать абсолютный путь для каждого загружаемого вами файла. В этом случае вы можете использовать функцию load-library вместо этого, который похож на load-file но пытается найти данное имя файла в любом из каталогов, хранящихся в переменной load-path:

(add-to-list 'load-path "/path/to")
(load-library "my-c-setup.el")

Преимущество в том, что вы должны сделать add-to-list часть только один раз, и все последующие вызовы load-library сможет найти код в этом каталоге.

Альтернативным способом является механизм предоставления / запроса: вы можете сделать так, чтобы ваш.el-файл "предоставил" некоторую функцию, поставив (provide 'feature) позвоните, например

(provide 'my-c-mode-customizations)

Затем положить в соответствии (require 'feature) в вашем файле.emacs, и ваш код также будет загружен:

(require 'my-c-mode-customizations)

Однако, если вы хотите, чтобы ваш код загружался только при c-mode активируется в буфере, способ добиться этого - через механизм Emacs ' Hook:

Хук - это переменная, в которой вы можете сохранить функцию или функции, которые будут вызываться в конкретном случае существующей программой.

Большинство основных режимов предоставляют настраиваемую переменную-ловушку, к которой вы можете добавлять функции, которые будут вызываться при каждом вызове основного режима. Например, с-режим обеспечивает c-mode-hook, Чтобы ваши собственные настройки вызывались при каждом включении c-режима для буфера, поместите их в функцию, скажем, my-c-mode-customizations и добавьте следующую строку в ваш файл.emacs:

(add-hook 'c-mode-hook 'my-c-mode-customizations)

Конечно, вам все еще нужно autoload для Emacs, чтобы найти определение этой функции.

Автозагрузка Lisp не вызывает функцию при загрузке файла, но сообщает lisp, что функция доступна и что данный файл ее предоставляет. Всякий раз, когда кто-то вызывает (еще не определенную) функцию, файл загружается.

я думаю что c-mode уже определен и поэтому не может быть перерегистрирован.

Автозагрузка не делает то, что вы думаете.
http://www.gnu.org/software/emacs/elisp/html_node/Autoload.html

То, что вы, вероятно, хотите, это мод-хуки или eval-after-load. См. Eval-after-load vs. mode hook для различия между ними.

Другие вопросы по тегам