1

c-mode のロード時に、「my-c-setup.el」という名前のファイルをロードしたいと考えています。そこで、「オートロード」という機能を使っています。

私のpythonセットアップでは、うまく機能します:

lang.el

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

my-python-setup.el

(require 'python)
; ...

私はcモードで同じことをしようとしていますが、うまくいきません:

lang.el

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

my-c-setup.el

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

ファイルを c モード (たとえば、test.c) で開こうとすると、次のエラーが発生します。

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

3 に答える 3

5

自動ロードはあなたが探しているものではありません。それが行うことは、最初にコードが必要になったときに単純にロードすることです。これは、起動時間を短く保ちながら Emacs の機能を拡張する便利な方法です。

あなたの問題を解決するには、あなたが本当にやりたいことを考えなければなりません: コードの一部をある時点でロードしたいだけですか、それとも にあるすべてのバッファーに対してバッファーローカルなカスタマイズをしたいc-modeですか?

.emacs起動時に Emacs にコードをロードさせたい場合は、コードを直接ファイルに入れるか、load-fileまたはrequireの代わりにor を使用し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部分を 1 回だけ実行する必要があり、その後のすべての呼び出しload-libraryでそのディレクトリ内のコードを見つけることができることです。

(provide 'feature)別の方法は提供/要求メカニズムです。.el ファイルに呼び出しを入れることで、いくつかの機能を「提供」することができます。

(provide 'my-c-mode-customizations)

次に(require 'feature)、.emacs ファイルに次のように記述します。コードも同様にロードされます。

(require 'my-c-mode-customizations)

c-modeただし、がバッファーでアクティブ化されたときにのみコードをロードする場合は、Emacs のフックメカニズムを使用してそれを実現します。

フックは、既存のプログラムによって特定の機会に呼び出される関数を格納できる変数です。

ほとんどのメジャー モードは、メジャー モードが呼び出されるたびに呼び出される関数を追加できる、カスタマイズ可能なフック変数を提供します。たとえば、c-mode は を提供しますc-mode-hook。バッファーに対して c-mode がオンになっているときはいつでも独自のカスタマイズが呼び出されるようにするには、それらを関数に入れmy-c-mode-customizations、次の行を .emacs ファイルに追加します。

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

もちろん、autoloadEmacs がその関数の定義を実際に見つける必要があります。

于 2011-04-23T09:55:56.457 に答える
1

Lispのautoloadは、ファイルがロードされたときに関数を呼び出さないが、関数が利用可能であり、指定されたファイルがそれを提供することをlispに通知します。誰かが(まだ定義されていない)関数を呼び出すたびに、ファイルがロードされます。

c-modeそれはすでに定義されているので、再登録に失敗すると思います。

于 2011-04-23T09:47:19.957 に答える
1

自動ロードは、あなたが思っていることをしません。
http://www.gnu.org/software/emacs/elisp/html_node/Autoload.html

おそらく必要なのは、モードフックまたは eval-after-load です。2 つの違いについては、eval-after-load とモード フックを参照してください。

于 2011-04-23T09:55:01.883 に答える