繁体   English   中英

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

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

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

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

但这不起作用!!

谁能帮我?

您的代码似乎假设整个Emacs仅具有单个缓冲区和模式,而事实并非如此。 例如, (add-hook 'before-save-hook 'gofmt-before-save)无论是否使用go-mode (add-hook 'before-save-hook 'gofmt-before-save)影响所有缓冲区。 (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)

最后三行是“通用”配置的一部分(不特定于对Go语言的支持),这意味着您希望在可用时使用flycheck和自动完成功能,而不是仅在go模式下使用。

  1. 您添加到挂钩中的代码不起作用,因为仅在打开模式后才运行挂钩,并且直到加载库后才定义模式。 在模式挂钩中加载相同的库没有任何意义。

  2. 如果在加载某些库后Emacs变慢,则可能是由于该库所致。 即使不打开模式,加载库后速度是否很慢?

  3. 您可以尝试对库代码进行字节编译。 有时这可能会在性能上产生很大的差异。 您可以使用Mx byte-compile来编译给定的文件。

  4. 如果编译无济于事,并且如果您在缓冲区*Messages*没有看到任何可疑的*Messages* (例如,警告似乎与之相关,则),请考虑与库维护人员联系,报告问题并寻求补救措施。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM