2012-03-30 38 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)