2015-10-16 91 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

相關問題