tutorial mac emacs emacs24

tutorial - Deshabilitar la advertencia sobre emacs.d en la ruta de carga



emacs vs vim (4)

En la última versión de emacs (desde 24.3.50 instantánea) hay una advertencia al inicio cuando .emacs.d pasa a estar en la ruta de carga.

Warning (initialization): Your `load-path'' seems to contain your `.emacs.d'' directory: ~/.emacs.d/ This is likely to cause problems... Consider using a subdirectory instead, e.g.: /home/adriean/.emacs.d/lisp

¿Hay alguna manera de desactivar solo esta advertencia?

(ya que quiero mantener mi emacs.d en la ruta de carga, por ahora como un truco bruto rápido fui por (setq warning-minimum-level :error) , pero preferiría deshacerme de esto lo antes posible)


No deshabilite la advertencia. Está ahí por una buena razón: ~/.emacs.d no debería estar en su load-path .

Esto se debe a que Emacs escribe archivos en este directorio y, por lo tanto, es posible (existen casos) que esos archivos entren en conflicto con los nombres de las bibliotecas elisp. Si tiene este directorio en su ruta de carga y tiene un choque de nombres, entonces Emacs intentará cargar el archivo incorrecto si esa biblioteca es necesaria.

Solo cambia tu configuración. Es trivial mover las bibliotecas elisp que ha colocado en ese directorio a un subdirectorio, y luego actualizar el código que estaba agregando ~/.emacs.d a su ruta de carga, para que agregue el nuevo subdirectorio en su lugar :

(add-to-list ''load-path (expand-file-name "~/.emacs.d/lisp"))


Puede agregar la initialization a warning-suppress-log-types (no registrar la advertencia en absoluto), o warning-suppress-types (registrar la advertencia, pero no mostrar el búfer de advertencias).


Precaución

Su .emacs.d puede estar con seguridad en su load-path solo al final. Esto asegurará que si un archivo en su .emacs.d conflicto con una biblioteca, la biblioteca tendrá prioridad. Con add-to-list , puede hacer esto estableciendo el tercer parámetro ( APPEND ) en t :

(add-to-list ''load-path (expand-file-name "~/.emacs.d") t)

Desactivando la advertencia

Agregar ''initialization a warning-suppress-types o warning-suppress-log-types suprimirá la advertencia, pero tampoco verá errores o advertencias si algo sale mal en su archivo init.

La solución que uso en mi .emacs.d es un consejo que ignora selectivamente esta advertencia en función del mensaje de advertencia:

(defadvice display-warning (around no-warn-.emacs.d-in-load-path (type message &rest unused) activate) "Ignore the warning about the `.emacs.d'' directory being in `load-path''." (unless (and (eq type ''initialization) (string-prefix-p "Your `load-path'' seems to contain/nyour `.emacs.d'' directory" message t)) ad-do-it))

Esto necesitará actualización si el mensaje de advertencia cambia.

Consejo de organización

Si desea mantener los archivos personales directamente en su directorio .emacs.d , puede ser una buena idea despejarlo creando un directorio dedicado para los archivos guardados de varios paquetes, por ejemplo:

(defvar my-savefile-dir (expand-file-name "savefiles" "~/.emacs.d") "The directory for automatically generated save/history/etc. files.")

y luego, para cada paquete que pone su archivo en .emacs.d , algo como esto:

(setq tramp-persistency-file-name (expand-file-name "tramp" my-savefile-dir))

Actualización a la sugerencia de la organización

Desde que escribí lo anterior, descubrí que los paquetes generalmente usan locate-user-emacs-file para obtener las rutas a los archivos en los que almacenan sus datos. Esta función devuelve una ruta absoluta a un archivo en user-emacs-directory . De forma predeterminada, user-emacs-directory contiene la ruta a su .emacs.d , pero puede cambiarlo a un directorio donde desee guardar sus archivos (probablemente también desee conservar el valor anterior en alguna parte):

(defvar main-dir user-emacs-directory "The root directory of my Emacs configuration.") (setq user-emacs-directory (expand-file-name "savefiles/" main-dir)) ;; The trailing slash is mandatory.

Esto hará que la mayoría de los paquetes almacenen sus archivos en .emacs.d/savefiles . Si desea hacer una excepción, para que un paquete determinado almacene sus archivos directamente en .emacs.d , use algo como esto:

(setq package-user-dir (expand-file-name "elpa" main-dir))

También deberá cambiar la configuración de los paquetes que se cargan antes de su archivo init y, por lo tanto, usar el valor original de user-emacs-directory :

(setq auto-save-list-file-prefix (locate-user-emacs-file "auto-save-list/.saves-"))

Además, algunos paquetes usan rutas codificadas en lugar de locate-user-emacs-file , pero eso también es fácil de solucionar:

(setq smex-save-file (locate-user-emacs-file "smex"))

Sin embargo, la mayoría de los paquetes utilizan locate-user-emacs-file , por lo que en mi experiencia este método de organizar savefiles requiere menos código que el del original "consejo de organización" (al escribir esto, los fragmentos de código anteriores son las únicas configuraciones de save save en mi configuración de Emacs, mientras que el método original requería una línea para cada paquete).

No sé si este método es un uso previsto o un abuso de la variable user-emacs-directory . Lo uso y funciona sin problemas hasta el momento, pero su kilometraje puede variar.


Recientemente tuve el mismo problema, en 4.4.0-22-generic GNU / Linux (Ubuntu 16.04 LTS) y para mí lo único que funcionó fue:

$ chown -R my_user ~/.emacs.d $ # Fix the ''broken'' permissions

Puede obtener chown: cannot read directory ''/home/my_user/.emacs.d'': Permission denied , simplemente haga lo siguiente:

sudo chown -R topenmind ~/.emacs.d

Funcionó como un encanto para mí.

Árbitro. La fuente de la respuesta fue tomada del problema de Permiso con emacs para usuarios no root (Ubuntu 11.10) .