1

I want to load my file named "my-c-setup.el" when the c-mode is loading. So, I'm using the function "autoload".

With my python setup, it works well :

lang.el

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

my-python-setup.el

(require 'python)
; ...

I'm trying to do the same with the c-mode, but i does not work :

lang.el

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

my-c-setup.el

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

When I try to open a file in c-mode (test.c for example), I have the following error :

File mode specification error: (error "Autoloading failed to define function c-mode")
Sandro Munda
  • 39,921
  • 24
  • 98
  • 123

3 Answers3

5

Autoload is not what you're looking for. What it does is simply load some code the first time it is needed, which is a handy way to extend Emacs' functionality while still keeping the start-up time low.

To solve your problem, we gotta think about what you really want to do: do you simply want some of your code to be loaded at some point, or do you want buffer-local customizations for ever buffer that is in c-mode?

If you simply want Emacs to load your code at start-up, either put your code directly into your .emacs file or use load-file or require instead of autoload:

load-file simply takes a file name, loads the lisp code in that file and evaluates it. So if your code is in a file named "/path/to/my-c-setup.el", you could put the following line in your .emacs, and the code will be loaded on every start-up:

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

Perhaps you don't want to give the absolute path name for every file you load. In that case, you could use the function load-library instead which is similar to load-file but tries to find the given filename in any of the directories stored in the variable load-path:

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

The advantage is that you have to do the add-to-list part only once, and all subsequent calls to load-library will be able to find code in that directory.

An alternative way is the provide/require mechanism: you can make your .el-file "provide" some feature by putting a (provide 'feature) call in it, e.g.

(provide 'my-c-mode-customizations)

Then put an according (require 'feature) in your .emacs file, and your code will be loaded as well:

(require 'my-c-mode-customizations)

However, if you want your code only be loaded when c-mode is activated on a buffer, the way to achieve that is through Emacs' Hook mechanism:

A hook is a variable where you can store a function or functions to be called on a particular occasion by an existing program.

Most major modes provide a customizable hook variable to which you can add functions that will be called whenever the major mode is invoked. For instance, c-mode provides c-mode-hook. In order for your own customizations to be called whenever c-mode is turned on for a buffer, put them in a function, say, my-c-mode-customizations and add the following line to your .emacs file:

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

Of course, you still need autoload for Emacs to actually find the definition of that function.

Thomas
  • 17,016
  • 4
  • 46
  • 70
1

Lisp's autoload does not call a function when a file is loaded but tells lisp that the function is available and that the given file provides it. Whenever someone calls the (not yet defined) function, the file is loaded.

I think that c-mode is already defined and thus fails to re-register.

cweiske
  • 30,033
  • 14
  • 133
  • 194
1

Autoload doesn't do what you think it does.
http://www.gnu.org/software/emacs/elisp/html_node/Autoload.html

What you probably want are mode-hooks or eval-after-load. See eval-after-load vs. mode hook for the difference between the two.

Community
  • 1
  • 1
Nils Fagerburg
  • 640
  • 7
  • 12