Сбой автозагрузки в 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 для различия между ними.