2012-03-30 17 views
8

Estoy refabricando un poco en mi configuración de Emacs y he llegado a la conclusión de que quiero usar un archivo init diferente al predeterminado. Así que, básicamente, en mi archivo ~/.emacs, tengo esto:Emacs: define una función que carga el archivo donde está definida la función

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

Hasta ahora, que ha estado trabajando muy bien. Sin embargo, ahora quiero volver a definir un viejo comando que he utilizado para las edades, que se abre mi archivo de inicio:

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

Como se puede ver, esto abrirá ~/.emacs no importa lo que hago. Quiero que se abra /some/directory/init.el, o donde sea que se haya definido el comando conf.

¿Cómo podría hacer eso?

+0

@RandyMorris: No, no puedo usar solo load-file-name, porque será 'nil' en el momento de la ejecución. – damd

+0

Descubrí que puedo usar '(symbol-file 'conf)' para esto. – damd

+0

Me di cuenta de que inmediatamente después de publicar ese comentario, mi mal. –

Respuesta

6

Puede utilizar find-function para esto:

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

agregue la línea "(beginning-of-buffer)" antes del último paréntesis para comenzar al principio del búfer en lugar de ese comando. – PascalVKooten

3

También se puede utilizar de una manera más disimulados:

(defun conf() "blabla" (interactiva) (find-file # $))

Porque # $ funciona un poco como __FILE__ en C: se reemplaza por el nombre del archivo cuando se lee el archivo.

+0

Esto es genial, pero ¿cómo podría haberlo descubierto en la propia documentación de Emacs? Incluso un '(apropos" # $ ")' explícito no me dice nada. – Glyph

+0

Bueno, dije "sneakier". No creo que esto esté (o deba ser) documentado. Se usa internamente en el formato de archivos .elc y los archivos .el y .elc se procesan de la misma manera, por lo que este truco también funciona en archivos .el. – Stefan

+0

Supongo que una manera un poco menos desagradable de hacer esto es '(symbol-function 'algo' defun)'? – Glyph

0

Esto funciona para mí.

;;; 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) 
Cuestiones relacionadas