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

时间:2015-10-16 16:43:55

标签: emacs require mode

通常,我将sug文件中的confugire .el文件放在各种语言中。比如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)
                      ))

但它不起作用!!

谁能帮助我?

3 个答案:

答案 0 :(得分:2)

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

<!DOCTYPE html>
<html>
  <head>
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title><%= content_for?(:title) ? yield(:title) : "My App" %></title>
    <meta name="description" content="<%= content_for?(:description) ? yield(:description) : "Levi''s Vet Clinic" %>">
    <%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track' => true %>
    <%= javascript_include_tag 'application', 'data-turbolinks-track' => true %>
    <%= csrf_meta_tags %>
  </head>
  <body>
    <div id="wrap">
          <div id="main" class="container clear-top">
        <%= render 'layouts/navigation' %>
        <div id="push">
          <%= render 'layouts/messages' %>
          <%= yield %>
        </div>
      </div>
    </div>
  </body>
  <footer class="footer">
    <%= render 'layouts/footer' %>
  </footer>
</html>

其中最后三行是“通用”配置的一部分(不是特定于Go语言的支持),这意味着您希望在可用时使用flycheck并自动完成,而不是仅在go-mode中。< / p>

答案 1 :(得分:0)

  1. 要添加到挂钩的代码不起作用,因为挂钩仅在模式打开后运行,并且在加载库之前未定义模式。在模式挂钩中加载相同的库是没有意义的。

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

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

  4. 如果编译没有帮助,如果您没有在缓冲区*Messages*中看到任何可疑内容(例如,似乎可能与之相关的警告),请考虑联系图书馆维护人员,报告问题并要求补救。

答案 2 :(得分:0)

如果go-mode本身已经可用(很可能是通过添加到auto-mode-alist按需加载,如果它是作为ELPA包安装的话可能会自动处理),并且你&#39 ;只是想要同时加载您的自定义库,然后您可以使用eval-after-load

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

确保go-conf.el库的父目录位于load-path,当然,require无法找到它。