2012-03-30 35 views
8

我在Emacs的設置中重構了一下,並得出結論,我想使用不同於默認文件的init文件。所以基本上,在我的〜/ .emacs文件,我有這樣的:Emacs:定義一個函數來加載定義函數本身的文件

(load "/some/directory/init.el") 

截至目前爲止,這一直工作得很好。不過,現在我要重新定義一箇舊的命令,我用了好半天,打開我的初始化文件:

(defun conf() 
    "Open a buffer with the user init file." 
    (interactive) 
    (find-file user-init-file)) 

正如你所看到的,這將打開〜/的.emacs不管我做什麼。我希望它打開/some/directory/init.el,或者任何定義了命令的地方。

我該怎麼做?

+0

@RandyMorris:不,我不能只使用load-file-name,因爲它在執行時會是'nil'。 – damd 2012-03-30 16:43:26

+0

我發現我可以用'(symbol-file'c​​onf)'來做這個。 – damd 2012-03-30 16:45:57

+0

我意識到,我發佈該評論後立即發現,我的不好。 – 2012-03-30 16:54:39

回答

6

您可以使用find-function這個:

(defun conf() 
    "Open a buffer with the user init file." 
    (interactive) 
    (find-function this-command)) 
+0

在最後一個括號之前添加一行「(開始緩衝區)」,以便在緩衝區的開始處而不是該命令處開始。 – PascalVKooten 2012-09-22 16:09:43

3

你也可以使用一個sneakier方式:

(defun定義配置() 「布拉布拉」(互動)(查看文件#$) )

因爲#$在C中的作用有點像__FILE__:當文件被讀取時,它被替換爲文件名。

+0

這很酷,但是我怎麼會在Emacs自己的文檔中發現它呢?即使是明確的'(apropos「#$)'也不會告訴我任何事情。 – Glyph 2014-05-13 21:17:00

+0

嗯,我確實說過「偷偷摸摸」。我不認爲這是(或應該)記錄。它以.elc文件的格式在內部使用,.el和.elc文件實際上是以相同的方式處理的,所以這個技巧也適用於.el文件。 – Stefan 2014-05-13 21:52:53

+0

我想這樣做的一個稍微不討厭的方法是'(符號函數'東西'defun)'? – Glyph 2014-05-14 23:49:35

0

這適用於我。

;;; mymodule.el --- does my thing 

(defvar mymodule--load-path nil "load path of the module") 

    ... 

(defun mymodule-load-datafile() 
    "load a data file from the directory in which the .el resides" 
    (let* ((dir-name (concat 
         (file-name-directory mymodule--load-path))) 
     (data-file-name (concat dir-name "datafile.csv"))) 
    (if (file-exists-p data-file-name) 
     ...))) 

;; remember load time path 
(setq mymodule--load-path load-file-name) 

(provide 'mymodule)