2012-03-30 15 views
8

Sto refactoring un po 'nel mio set di Emacs e sono giunto alla conclusione che voglio usare un file init diverso da quello predefinito. Quindi, fondamentalmente, nel mio file ~/.emacs, ho questo:Emacs: definisce una funzione che carica il file in cui è definita la funzione stessa

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

Fino ad ora, che sta lavorando bene. Tuttavia, ora voglio ridefinire un vecchio comando che ho usato per secoli, che apre il mio file di inizializzazione:

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

Come si può vedere, questo aprirà ~/.emacs, non importa quello che faccio. Voglio che apra /some/directory/init.el, o ovunque sia definito il comando conf.

Come faccio?

+0

@RandyMorris: No, non posso usare solo load-file-name, perché sarà 'quelle negative al momento dell'esecuzione. – damd

+0

Ho scoperto che posso usare '(symbol-file 'conf)' per questo. – damd

+0

Mi sono reso conto che subito dopo aver postato quel commento, il mio male. –

risposta

6

È possibile utilizzare find-function per questo:

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

aggiungere la riga "(inizio-del-buffer)" prima dell'ultima parentesi per iniziare all'inizio del buffer anziché quel comando. – PascalVKooten

3

È anche possibile utilizzare un modo sneakier:

(defun conf() "blabla" (interattivo) (find-file di # $))

Perché # $ funziona un po 'come __FILE__ in C: viene sostituito dal nome file quando il file viene letto.

+0

Questo è molto bello, ma come avrei potuto scoprirlo nella documentazione di Emacs? Anche un esplicito '(apropos" # $ ")' non mi dice nulla. – Glyph

+0

Bene, ho detto "più sneaker". Non penso che questo sia (o dovrebbe essere) documentato. Viene utilizzato internamente nel formato dei file .elc e i file .el e .elc vengono elaborati allo stesso modo, quindi questo trucco funziona anche con i file .el. – Stefan

+0

Immagino che un modo leggermente meno sgradevole per farlo sia '(funzione-simbolo 'qualcosa' defun)'? – Glyph

0

Questo funziona per me.

;;; 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) 
Problemi correlati