簡體   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