Search code examples
emacsemacs23c-mode

Emacs c-mode autoloading failed


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")

Solution

  • 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.