如何在 emacs 中加载具有指定模式的 .el 配置文件

How can load a .el configure file with a specified mode in emacs

通常,我将各种语言的configire .el 文件放在src 目录中。比如Go,go-conf.el file:

(add-hook 'before-save-hook 'gofmt-before-save)
(add-hook 'go-mode-hook (lambda ()
                      (local-set-key (kbd "M-.") 'godef-jump)))
(add-hook 'go-mode-hook (lambda ()
                      (local-set-key (kbd "M-,") 'godef-jump-back)))
(add-to-list 'load-path "/usr/local/go/src/github.com/dougm/goflymake")
(add-hook 'after-init-hook #'global-flycheck-mode)
(require 'flycheck)
(require 'go-autocomplete)
(require 'auto-complete-config)
(ac-config-default)
)
(provide 'go-conf)

然后,在init.el,我写下这行

(require 'go-conf)

虽然可以成功加载 go-conf,但 emacs 启动缓慢。这是因为无论打开什么文件,emacs 都会加载 go-conf。我不能容忍它。 最好只有在打开Go文件时才加载go-conf。

我将init.el修改为:

(add-hook 'go-mode-hook '(lambda ()
                      (require 'go-conf)
                       (go-conf)
                      ))

但是不行!!

谁能帮帮我?

  1. 你添加到钩子的代码不起作用,因为钩子是 运行 只有在模式打开后,模式在加载库时才定义。在模式挂钩中加载相同的库是没有意义的。

  2. 如果 Emacs 在加载某些库后变慢,可能是因为该库。是不是不开模式加载库还是慢?

  3. 你可以尝试字节编译库代码。这有时会对性能产生很大的影响。您可以使用 M-x byte-compile 来编译给定的文件。

  4. 如果编译没有帮助,并且如果您在缓冲区 *Messages* 中没有看到任何可疑的东西(例如,看起来可能相关的警告),请考虑联系库维护者, 报告问题并寻求补救措施。

如果 go-mode 本身已经可用(很可能通过添加 auto-mode-alist 按需加载,如果它作为 ELPA 包安装,则可能会自动处理),并且您只是想同时加载您的自定义库,那么您可以使用 eval-after-load:

(eval-after-load 'go-mode
  '(require 'go-conf))

当然,请确保 go-conf.el 库的父目录在 load-path 中,否则 require 将找不到它。

您的代码似乎假定整个 Emacs 只有一个缓冲区和模式,但事实并非如此。例如。 (add-hook 'before-save-hook 'gofmt-before-save) 影响所有缓冲区,无论它们是否使用 go-mode。 (add-hook 'after-init-hook #'global-flycheck-mode) 也一样。 Emacs 的设计使您可以启动一次,然后在一个 Emacs 会话中同时编辑数百个不同的文件。所以你应该按照以下行重写你的代码:

(defun my-go-lang-config ()
  (add-hook 'before-save-hook #'gofmt-before-save nil 'local)
  (local-set-key (kbd "M-.") 'godef-jump)
  (local-set-key (kbd "M-,") 'godef-jump-back)
  (add-to-list 'load-path "/usr/local/go/src/github.com/dougm/goflymake")
  (require 'go-autocomplete))
(add-hook 'go-mode-hook #'my-go-lang-config)

(require 'auto-complete-config)
(ac-config-default)
(global-flycheck-mode 1)

最后三行是您的 "generic" 配置的一部分(不特定于支持 Go 语言),这意味着您想在可用时使用 flycheck 和自动完成,而不是仅在 go 中使用-模式。