tutorial source para mac for emacs elisp

source - ¿Cómo puedo acceder a la ruta al directorio actual en un archivo de variable de directorio de emacs?



emacs para mac (6)

Creo que (file-name-directory (or load-file-name buffer-file-name)) debería darle la ruta del directorio.

Ver http://xahlee.org/emacs/elisp_idioms_batch.html

Edición : Excepto que no, porque las expresiones eval se evalúan en el contexto del búfer cuyas variables se están pirateando.

De acuerdo con la documentación de Emacs, las Variables de Directorio se aplican a todos los archivos debajo de un directorio que contiene un archivo .dir-locals.el .

¿Cómo puedo, en ese archivo, establecer una variable para la ruta completa que contiene el archivo? Por ejemplo:

((nil . ((indent-tabs-mode . t) (my-project-path **THIS_DIRECTORY**))))


En caso de que aún le importe, al OP o algún otro, le sugiero que cree una función para generar el archivo .dir-locals.el . Entonces uno podría escribir algo como:

(let ((path default-directory) file) (setq file (format "%s/.dir-locals.el" path)) (with-temp-buffer (insert (format "((nil . ((indent-tabs-mode . t) (my-project-path /"%s/"))))" path)) (when (file-writable-p file) (write-region (point-min) (point-max) file))))

Para ser ejecutado dentro del directorio de inicio del proyecto.


En mi caso, quería localizar un archivo que estuviera relacionado con mi directorio de trabajo actual para mi repositorio, y el archivo .dir-locals.el se registró en la raíz, por lo que un archivo "local" para los .dir-locals. El también fue un archivo "local" a la raíz del proyecto.

La respuesta anterior de pajato0 funcionó en algunos casos, pero también rompió otros modos (como Magit). Resolví el problema usando la función projectile projectile-project-root del paquete de projectile-project-root para encontrar mi ruta base para mí:

((nil . ((eval . (setq cmake-ide-build-dir (concat (projectile-project-root) "/build-make")) ))))


Me hice la misma pregunta y no encontré ninguna solución en la web, así que creo que esta respuesta puede ayudar. En realidad, resulta que podemos reutilizar dir-locals-find-file para obtener el directorio que contiene el archivo .dir-locals.el . Así que esto es lo que encontré para, por ejemplo, configurar un diccionario personal aspell dedicado a todo un directorio:

((nil . ((eval . (setq ispell-personal-dictionary (expand-file-name ".aspell_words" (file-name-directory (let ((d (dir-locals-find-file "."))) (if (stringp d) d (car d))))))))))

Además, parece que las entradas se evalúan en el orden en que se especifican, por lo que el siguiente código debería funcionar:

((nil . ((eval . (set (make-local-variable ''my-project-path) (file-name-directory (let ((d (dir-locals-find-file "."))) (if (stringp d) d (car d)))))) (eval . (message "Project directory set to `%s''." my-project-path)))))

Emacs se quejará de las variables locales inseguras (debido a la construcción eval ), pero uno todavía puede marcarlo como seguro.


Si está trabajando en * nix, puede obtener el directorio de trabajo mediante el siguiente código elisp,

(defun get-working-directory () (getenv "PWD))

Por cierto, debo mencionar que, (shell-command "pwd") dará como resultado el directorio donde se encuentra el archivo (que corresponde al búfer que está editando actualmente).


hack-local-variables es la función principal para procesar todas las variables locales, y llama a hack-dir-local-variables para tratar con el archivo .dir-locals.el (o una variable de clase dir local, si no está usando ese archivo).

El código para establecer el directorio no está aislado en su propia función, por lo que tendremos que copiarlo en una nueva función (esto de GNU Emacs 24.0.95.1):

(defun my-dir-locals-dir () "Return the directory local variables directory. Code taken from `hack-dir-local-variables''." (let ((variables-file (dir-locals-find-file (or (buffer-file-name) default-directory))) (dir-name nil)) (cond ((stringp variables-file) (setq dir-name (file-name-directory variables-file))) ((consp variables-file) (setq dir-name (nth 0 variables-file)))) dir-name))