2015-10-16 81 views
0

通常,我将confugire .el文件放在src目录中用于各种语言。如围棋,请即conf.el文件:如何在emacs中加载.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) 

虽然去-conf的可以成功加载,emacs的慢慢启动。这是因为无论打开哪个文件,emacs都会加载。我无法容忍它。 只有当Go文件被打开时,go-conf才会被加载。

我修改init.el为:

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

但它不工作!

谁能帮帮我?

+0

在初始化之前某个时间根本不打算加载的库中,没有任何目的使用'(add-hook'after-init-hook#'global-flycheck-mode)''。 – phils

回答

2

你的代码似乎假设整个Emacs只有一个缓冲区和模式,但事实并非如此。例如。 (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并在有可用时自动完成,而不仅仅在进入模式下。

+0

Stefan,你的解决方案还行 谢谢〜_〜 –

0
  1. 您的代码添加到勾不起作用,因为钩运行模式开启后,才和库之前被加载没有定义模式。在模式钩子中加载相同的库是没有意义的。

  2. 如果Emacs在加载某个库后变得很慢,那很可能是由于该库。即使您不打开该模式,加载库后速度会变慢吗?

  3. 您可以尝试字节编译库代码。这有时会在性能上造成很大的差异。您可以使用M-x byte-compile来编译给定的文件。

  4. 如果编译没有帮助,如果你没有看到过任何缓冲*Messages*犯罪嫌疑人(例如,看起来他们可能是相关的警告),然后再考虑库维护者联系,报告问题,并要求补救。

+0

1.我把“add-hook”(需要'go-conf')放在与“reuqire'go-conf”相同的位置。但只有“要求'去配合”才能很好地工作。 2. emacs变慢,因为golang conf被加载,即使我打开一个php文件。 –

+0

对不起,但我不太理解你的评论。如果它对你很重要,也许试试对它进行改写。 (不是'go-conf.el'定义'go-mode'的库?) – Drew

0

如果go-mode本身就已经是可用的(最有可能通过除了auto-mode-alist,如果它被安装为ELPA包这可能是采取自动处理按需加载),而你只是希望加载同时您的自定义库,那么你可以使用eval-after-load

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

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

+0

它不适用。没有错误报告。但go-conf也没有加载。 –

+0

假设'(必需'go-conf)'本身确实有效,那么我可能猜到了你使用的任何'go-mode'的错误特征名称。 (你没有说明你从哪里得到它,所以我不知道)。加载后eval的第一个参数可以是提供的特征符号,也可以是库的名称作为串。 – phils

+0

n.b. 'M-x find-function RET go-mode RET'应该将您带到源代码中,以便您可以确定该参数应该是什么。 – phils

相关问题