如何在 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)
))
但是不行!!
谁能帮帮我?
你添加到钩子的代码不起作用,因为钩子是 运行 只有在模式打开后,模式在加载库时才定义。在模式挂钩中加载相同的库是没有意义的。
如果 Emacs 在加载某些库后变慢,可能是因为该库。是不是不开模式加载库还是慢?
你可以尝试字节编译库代码。这有时会对性能产生很大的影响。您可以使用 M-x byte-compile
来编译给定的文件。
如果编译没有帮助,并且如果您在缓冲区 *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 中使用-模式。
通常,我将各种语言的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)
))
但是不行!!
谁能帮帮我?
你添加到钩子的代码不起作用,因为钩子是 运行 只有在模式打开后,模式在加载库时才定义。在模式挂钩中加载相同的库是没有意义的。
如果 Emacs 在加载某些库后变慢,可能是因为该库。是不是不开模式加载库还是慢?
你可以尝试字节编译库代码。这有时会对性能产生很大的影响。您可以使用
M-x byte-compile
来编译给定的文件。如果编译没有帮助,并且如果您在缓冲区
*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 中使用-模式。