usar salir como configuration emacs elisp

configuration - salir - ¿Cómo modularizar una configuración de emacs?



como usar emacs (10)

¿Qué pasa con el uso de load-file ?

Algunos bits adicionales que puede encontrar útiles incluyen

  • file-exists-p
  • file-expand-wildcards

Use Ch f <function> para obtener ayuda, y puede encontrar útil una Introducción a la Programación en Emacs Lisp (o descargue el PDF )

He decidido volver a escribir mis .emacs desde cero, y quiero configurar algo que sea modular, para evitar un temido archivo 1k + LoC init.el ...

Creo que hay algunas preocupaciones básicas que cada configuración debe abordar:

  • opciones globales
  • funciones de edición
  • navegación (marcos y buffers)
  • atajos de teclado
  • modos de personalizaciones

Mientras todavía estoy tratando de pensar en la estructura, estoy buscando algunos consejos sobre cómo lograr esto.
He visto algunos .emacs en github y cosas así, y parece que hay enfoques diferentes, y no hay una manera preferida de ir con esto, lo cual es un poco confuso.
Me interesaría leer algunas ideas sobre cómo estructurar una configuración así, y especialmente algún código elisp relacionado.

edit: estado atrapado con cosas, y no he tenido mucho tiempo para jugar con esto todavía. Probará los métodos propuestos en unos días y verá qué es lo mejor, mientras tanto, ¡gracias por todas las recomendaciones!

edit2: He estado usando un archivo de inicio alfabetizado con org-mode , ¡y esto es absolutamente genial!
Todavía no estoy configurado para un mecanismo de carga específico, he estado usando este código, para cargar recursivamente mi directorio elisp, luego requiero o lo que indiquen las instrucciones de configuración.

(if (fboundp ''normal-top-level-add-subdirs-to-load-path) (let* ((my-lisp-dir "~/.emacs.d/elisp/") (default-directory my-lisp-dir)) (setq load-path (cons my-lisp-dir load-path)) (normal-top-level-add-subdirs-to-load-path)))

Todavía necesito pulir esto, tal vez usando autocarga, y algunos byte-recompilar si se modifican trucos; me encantaría escuchar sugerencias sobre eso.


Aquí hay una biblioteca que le permite instalar nuevos módulos simplemente guardándolos en un directorio designado. Se puede descargar e instalar desde http://github.com/tripleee/my-site-start/

;;; my-site-start.el --- set up personal .emacs.d/site-start.d/ ;; ;; Copyright (C) era eriksson <http://www.iki.fi/~era/> 2008-2009 ;; License: GPL v2 ;; Version: see `my-site-start-version'' below ;; ;;; Commentary: ;; ;; The purpose of my-site-start is to simplify maintenance of user libraries. ;; Instead of indefinitely tweaking your .emacs, just create a site-start.d ;; directory and add symlinks to the libraries you want to load into Emacs.

Esta arquitectura impone algunas convenciones que pueden o no gustarle. Vea el resto de la sección de comentarios cerca de la parte superior del archivo para obtener la primicia completa.

Soy el autor de este código y aprecio cualquier comentario (aunque no directamente a través de este foro público).


Eche un vistazo al excelente kit de inicio de emacs, que está muy bien organizado y también incluye paquetes ELPA. Utilicé la estructura como inspiración para mi propia configuración mucho más simple.


Gracias a @JoeCasadonte por mencionar la página de EmacsWiki . Como estoy usando Debian y Ubuntu, este fragmento particular funcionó muy bien (para ponerlo en .emacs.d / init.el):

(setq dotfiles-dir (file-name-directory (or load-file-name (buffer-file-name)))) (let ((user-site-start-dir (concat dotfiles-dir "/site-start.d"))) (debian-run-directories user-site-start-dir))

Entonces, solo necesito poner mis archivos .el dentro de ~ / .emacs.d / site-start.d (por ejemplo, ~/.emacs.d/site-start.d/50cedet.el ) y todos se cargan automáticamente.


Lo que he hecho es para cada cosa, X, que podría querer usar, crear un archivo llamado configure-X y poner un require correspondiente en .emacs. Esta característica se puede eliminar comentando una línea.

Por ejemplo, para elegir el más simple (si mal nombrado), tengo configure-picture-and-artist-mode.el. Este archivo es muy simple:

(global-set-key (kbd "C-M-P") ''picture-mode) (provide ''configure-picture-and-artist-mode)

Y en .emacs:

(require ''configure-picture-and-artist-mode)

Después de ordenar esto, no tengo nada en mis archivos .emacs a excepción de una gran lista de require y algunos cambios en load-path , un paquete determinado se puede eliminar con bastante facilidad, y toda la configuración para cada paquete está en uno lugar.

(También tengo un archivo .el catch-all que uso para almacenar cosas que no tienen ningún hogar obvio (mis combinaciones de teclas globales, funciones de ayuda, etc.) pero aún así idealmente quiero quedarme fuera de .emacs. bit no es muy modular, y puede introducir dependencias implícitas en los paquetes que se supone que mi esquema hace fácilmente descargables, pero en la práctica no parece ser un gran problema.)


Mi archivo .emacs carga ~ / .emacs.d / init.el , que define las siguientes funciones, escritas primero para XEmacs, pero que funcionan lo suficientemente bien para Emacs en estos días:

(defconst user-init-dir (cond ((boundp ''user-emacs-directory) user-emacs-directory) ((boundp ''user-init-directory) user-init-directory) (t "~/.emacs.d/"))) (defun load-user-file (file) (interactive "f") "Load a file in current user''s configuration directory" (load-file (expand-file-name file user-init-dir)))

Luego, el resto del archivo va y carga muchos archivos individuales con formularios como este:

(load-user-file "personal.el")

Mi conjunto actual de archivos es el siguiente:

  • personal.el
  • platform.el
  • cygwin.el
  • variables.el
  • paths.el
  • mail-news.el
  • misc-funcs.el
  • bbdb.el
  • calendar.el
  • gnus-funcs.el
  • c-y-java.el
  • lisp.el
  • clojure.el
  • go.el
  • markdown.el
  • sgml-xml.el
  • tex.el
  • spelling.el
  • org.el
  • packages.el
  • fonts.el
  • color-theme.el
  • frame.el
  • server.el
  • keys.el
  • aquamacs.el

Algunos de ellos son mucho más específicos en su intención que otros, como sugieren los nombres. Cuanto más precisos sean los archivos, más fácil será deshabilitar un grupo de formularios cuando reinstale un paquete o una biblioteca. Esto es especialmente útil cuando "se muda" a un nuevo sistema, donde arrastra sus archivos de configuración pero aún no tiene todos los paquetes de soporte instalados.




Puede hacer (require ''foo) y cargará el primer "foo.el" elisp encontrado en su ruta de carga, o (require ''foo "/home/user/experimental/foo.el") para algo que (require ''foo "/home/user/experimental/foo.el") fuera de su ruta de carga . Informará un error si "foo.el" no contiene la expresión (provide ''foo) . En una situación perversa, podrías hacer (require ''foo "bar.el") , y esto funcionaría siempre que '''' bar.el '''' tuviera una cláusula (provide ''foo) .


Si quiere dividir sus custom-set-variables , pero quiere algo más ligero que initsplit.el , intente esto:

(defmacro custom-set-variable (var value) "Call `custom-set-variables'' with a warning shown when customizing using the customize GUI. XXX: does not support setting the optional NOW and REQUEST (dependency) fields." (custom-set-variables ;; `load-file-name'' is set by `load-file'': ;; http://.com/a/1971376/470844 `(,var ,value nil nil ,(format "!!! CAREFUL: CUSTOM-SET IN %s !!!" load-file-name))))

Ahora, coloque sus módulos de configuración en archivos separados y cárguelos con load-file en su ~/.emacs , como otros han sugerido. En cada módulo de configuración, use

(custom-set-variable var value)

en lugar de

(custom-set-variables ''(var value))

o

(setq-default var value)

al configurar variables administradas por personalización. Luego, si alguna vez necesita personalizar la variable utilizando la interfaz de personalización, verá una advertencia que le indicará en qué archivo se debe almacenar la personalización:

"!!! CAREFUL: CUSTOM-SET IN <path to module file> !!!"

Si la versión controla sus archivos de configuración, una diferencia dirá qué línea de sus ~/.emacs mover al módulo personalizado.

Discusión de problemas con el uso ingenuo de llamadas a múltiples custom-set-variables : http://www.dotemacs.de/custbuffer.html

Editar: respuesta a las preguntas de Alan

El problema que resuelve la macro de la custom-set-variable

La interfaz de personalización en Emacs guarda todas las variables de conjunto personalizadas en sus ~/.emacs cada vez que edita cualquier variable de conjunto personalizado. Si modulariza sus variables personalizadas, extendiéndolas a través de múltiples archivos, entonces necesita darse cuenta cuando emacs inserte configuraciones duplicadas en sus archivos .emacs y los elimine. La macro de la macro del custom-set-variable le ayuda a hacer esto.

Un verdadero ejemplo de mis archivos de configuración

~/.emacs.d/extensions/whitespace.el variables relacionadas con el espacio en blanco en un ~/.emacs.d/extensions/whitespace.el que mis ~/.emacs . Por ejemplo, configuré mi variable search-whitespace-regexp siguiente manera:

(nc:custom-set-variable search-whitespace-regexp "[ /t/r/n]+")

Ahora, suceden dos cosas. Primero, cuando me encuentro con esa variable en la interfaz de personalización recibo una advertencia:

Segundo, si edito cualquier variable usando la interfaz de personalización, mi ~/.emacs hace que sea obvio que he sombreado algunas definiciones. Por ejemplo, después de cambiar search-whitespace-regexp y global-whitespace-mode en la interfaz de personalización, obtengo:

$ svn di --diff-cmd "diff" -x "-U0" ~/v/conf Index: /home/collins/v/conf/dot.emacs =================================================================== --- /home/collins/v/conf/dot.emacs (revision 267) +++ /home/collins/v/conf/dot.emacs (working copy) @@ -55,0 +56 @@ + ''(agda2-include-dirs (/` ("." (/, (file-truename "~/local/opt/agda-std-lib/src")))) nil nil "!!! CAREFUL: CUSTOM-SET IN /home/collins/.emacs.d/extensions/agda.el !!!") @@ -58,0 +60,3 @@ + ''(global-whitespace-mode t) + ''(indent-tabs-mode nil nil nil "!!! CAREFUL: CUSTOM-SET IN /home/collins/.emacs.d/extensions/whitespace.el !!!") + ''(indicate-empty-lines t nil nil "!!! CAREFUL: CUSTOM-SET IN /home/collins/.emacs.d/extensions/whitespace.el !!!") @@ -72,0 +77 @@ + ''(search-whitespace-regexp "" nil nil "!!! CAREFUL: CUSTOM-SET IN /home/collins/.emacs.d/extensions/whitespace.el !!!") @@ -74,0 +80 @@ + ''(tab-width 2 nil nil "!!! CAREFUL: CUSTOM-SET IN /home/collins/.emacs.d/extensions/whitespace.el !!!")

La macro no me ayuda a recordar que cambié search-whitespace-regexp , solo que ya está configurado en otro lado, pero me ayuda a saber qué ajustes de variable debo eliminar de mis ~/.emacs (todos aquellos con advertencias), y cuáles debería dejar en mi ~/.emacs , o mover a otros archivos separados (todos aquellos sin advertencias).

Conclusión

Es probable que la macro sea exagerada, pero una vez que existe, es fácil de usar, y hace que sea más fácil evitar dispararse en el pie con variables de conjunto personalizadas sombreadas.