¿Organiza el contenido de ~ / .emacs.d / init.el y ~ / emacs.d?

28
  1. Cuando agregamos más y más líneas ~/.emacs.d/init.elpara varios propósitos (para el modo python, para emacs-eclim, para ...), el archivo se vuelve más largo y menos legible. ¿Hay alguna manera de ayudar a organizar su contenido?
  2. Mi actual se ~/.emacs.dve así

    $ ls *
    init.el
    
    auto-save-list:
    
    elisp:
    python-mode.el-6.1.3
    
    elpa:
    archives        auctex-readme.txt         s-20140910.334
    auctex-11.87.7  emacs-eclim-20140809.207
    
    eshell:
    history
    

    python-mode.el-6.1.3se instaló manualmente, mientras que emacs-eclim-20140809.207fue instalado por elpa, y no estoy 100% seguro de que las otras cosas que se encuentran debajo elpa/fueran elpa. ¿Cómo puedo organizar el contenido de ~/.emacs.d/?

Tim
fuente

Respuestas:

32

A las personas que usan editores menores les gusta dividir su código en varios archivos. Si está utilizando Emacs, no hay razón para hacerlo: solo use un solo archivo grande, que se divide en secciones.

Cada sección debe comenzar con

^L
;;; title of the section

donde inserta el ^Lcarácter escribiendo C-q C-l. Luego puede usar comandos como C-x ]( forward-page) o C-x n p( narrow-to-page) para navegar por el archivo. Ver Sección 25.4 (Páginas) del manual de Emacs para más información.

jch
fuente
16
Tampoco hay una razón especial para no dividir el código en varios archivos. Depende de lo que quiera que signifique la agrupación de cosas: cómo quiere que se comporte. Y puede depender de qué tan grande es GRANDE. Y puede depender de si partes de su código se comparten con otros, como bibliotecas, por ejemplo.
Dibujó
2
Aprovechando los comentarios de @ Drew, el usuario puede querer tener diferentes configuraciones para diferentes versiones y entornos de emacs y cargar el elisp correspondiente en consecuencia. Dicho esto, me gusta la sugerencia de paginación.
Harvey
3
@Harvey: la paginación y el uso de archivos separados son formas independientes de organizar el texto. Puedes usar ambos, obviamente. Utilizo la paginación en todas mis bibliotecas, para separar secciones. Pero también tengo bibliotecas separadas (archivos).
Dibujó el
1
@jch Si está utilizando este estilo, es posible que también desee habilitar el Modo menor del esquema o una característica similar, para permitir el plegado de secciones y funciones. Plegar todos los encabezados de nivel superior le ofrece una buena visión general de todas las secciones en su configuración de Emacs.
Lunaryorn
@lunaryorn, lo he intentado, pero me ha distraído: encuentro que los comandos de movimiento de la página son suficientes la mayor parte del tiempo, solo ocasionalmente necesito estrecharme. Quizás mi .emacsy .wlno son lo suficientemente largos.
jch
20

Una forma clásica de hacerlo es dividirlo .emacsen archivos separados. Por ejemplo, podría mover todos sus elementos web ~/.emacs.d/web-config.ely luego cargarlos dentro init.el:

(load "~/.emacs.d/web-config.el")

Si desea mantener ~/.emacs.dun poco más organizado, también puede cambiar estos archivos de configuración a su propio directorio:

(load "~/.emacs.d/config/web.el")

Ahora puede saltar al archivo apropiado al hacer cambios en su configuración.

Una cosa que falta de esto son las variables establecidas a través del sistema de personalización. Estos seguirán estando en su init.el principal. Aparentemente, hay una pequeña utilidad llamada init split que te permite establecer reglas sobre qué configuración de personalización va a dónde, pero nunca la he usado yo mismo. Alternativamente, el sistema "personalizar" se puede configurar para usar un archivo separado para sus modificaciones a sus configuraciones. Establezca la custom-filevariable para especificar dónde se debe leer y escribir la configuración de "personalizar" .

En cuanto al directorio en sí, siempre me ha encantado el diseño predeterminado. El cambio principal que hice fue crear un directorio para todos mis paquetes personalizados y bibliotecas que no son administrados por package.el. Esto le da un hogar único a mi elisp personalizado que no está relacionado con la configuración.

Tikhon Jelvis
fuente
Gracias. (1) ¿cuál es el directorio de paquetes y bibliotecas que gestiona package.el? (2) ¿Los contenidos del directorio son elpaadministrados por elpa? ¿Puedo moverlos a otro lado?
Tim
2
Puede especificar un archivo separado para Personalizar variables configurando la custom-filevariable. Fuente
Kaushal Modi
@Tim: el directorio administrado por package.el es elpa. Elpa no es un paquete lisp, es un repositorio de paquetes. Package.el seguirá agregando todos los paquetes que instala (ya sea desde elpa o desde otro repositorio --- por ejemplo, en su caso, no creo que eclim y s sean de elpa) en el directorio elpa. Y sí, no debería preocuparse por el contenido de este directorio.
T. Verron
(No se puede editar más) Lo que escribí anteriormente no es rigurosamente cierto: elpa es el formato de los archivos de paquetes, package.el es el administrador de paquetes. Para el usuario, no hay una diferencia real entre los dos. Mi comentario anterior confunde elpa con GNU elpa, que es uno de los paquetes de elpa disponibles (y el único oficial).
T. Verron
16

Si te gusta el modo Org, puedes usarlo para organizar tu .emacssin dividirlo. Bajo mi configuración actual, mi .emacsarchivo solo inicia un archivo init.org que tengo bajo~/.emacs.d/init/init.org

(require 'org)

;; Load the actual configuration file
(org-babel-load-file
  (expand-file-name (concat user-emacs-directory "init/init.org")))

Mediante el uso de diferentes archivos que necesita en greplugar de simple C-spara buscar algo, y así sucesivamente. Además, es más fácil agregar varios niveles a su organización.

rlazo
fuente
1
Actualmente estoy en el proceso de hacer esto, aunque no pensé en usarlo org-babel-load-file. ¡Dulce! (Ejemplos: github.com/vermiculus/dotfiles/blob/… , github.com/larstvei/dot-emacs )
Sean Allred
Más sobre el uso del modo org para la configuración de Emacs en esta pregunta: ¿Puedo usar el modo org para estructurar mi .emacs u otro archivo de configuración .el?
ShreevatsaR
9

Simplemente mueva fragmentos de código init.elpara separar archivos (bibliotecas), que luego require. (Use provideen las bibliotecas para ser required.) Coloque esos archivos donde desee y actualice en load-pathconsecuencia.

Dibujó
fuente
Gracias. (1) por ejemplo? (2) ¿qué sugiere organizar ~ / .emacs.d /?
Tim
1
¿Qué quiere decir con "organizar el contenido ~/.emacs.d/? No ofrece ninguna especificación de lo que desea. No está obligado a tener todo en un directorio. Puede colocar cosas en cualquier lugar que desee y modificar en load-pathconsecuencia. Si algún programa / herramienta solo pone cosas ~/.emacs.d/(es decir, si no puede decirle dónde poner las cosas), luego muévalas a donde quiera después de que termine ese programa / herramienta.
Dibujó el
1
¿Qué quieres decir con "por ejemplo"? ¿De qué quieres un ejemplo? (require 'foobar)Es un ejemplo de uso require. (add-to-list 'load-path "/my/lisp/dir")Es un ejemplo de modificación load-path. (provide 'foobar)Es un ejemplo de uso provide.
Dibujó el
al "organizar el contenido de ~ / .emacs.d /, yo, como humano, puedo entenderlo mejor, no para que emacs lo entienda. Es un hábito, al igual que organizar su gabinete, cajones, estanterías. Por ejemplo, python -mode.el-6.1.3 se instaló manualmente, mientras que emacs-eclim-20140809.207 fue instalado por elpa. ¿Son ambos paquetes? Si es así, ¿es una buena idea ponerlos en un subdirectorio de ~ / .emacs.d /?
Tim
Usted es el humano que puede responder qué organización podría ayudarlo a comprenderlo mejor. (Emacs no entiende nada). Use la estructura de carpetas que desee. Llámalos gabinetes, cajones, estanterías o simplemente carpetas. Y de nuevo, init.elpuede cargar bibliotecas ubicadas en cualquier lugar , no solo dentro ~/.emacs.d/.
Dibujó el
7

Utilizo la sugerencia de targzeta que se encuentra en el Wiki de Emacs: Cargar directorio .

Básicamente tengo un ~ / .emacs.d / load-directory.el:

;;;; ~/.emacs.d/load-directory.el

;; Handy function to load recursively all '.el' files in a given directory
(defun load-directory (directory)
  "Load recursively all '.el' files in DIRECTORY."
  (dolist (element (directory-files-and-attributes directory nil nil nil))
    (let* ((path (car element))
           (fullpath (concat directory "/" path))
           (isdir (car (cdr element)))
           (ignore-dir (or (string= path ".") (string= path ".."))))
      (cond
       ((and (eq isdir t) (not ignore-dir))
        (load-directory fullpath))
       ((and (eq isdir nil) (string= (substring path -3) ".el"))
        (load (file-name-sans-extension fullpath)))))))

Luego solo pongo archivos separados en mi ~ / .emacs.d / config:

~/.emacs.d/config ls
01-packages.el  02-style.el  03-modes.el  04-keybindings.el  05-functions.el

Y finalmente tengo esto en mi ~ / .emacs.d / init.el:

;; Load all ".el" files under ~/.emacs.d/config directory.
(load "~/.emacs.d/load-directory")
(load-directory "~/.emacs.d/config")
Boccaperta-IT
fuente
Quieren que brindemos más información que solo un enlace, por ejemplo, una descripción resumida de lo que hay en ese enlace.
Dibujó el
Tienes razón, edité mi respuesta.
Boccaperta-IT
Hm. Como cortesía, al menos, probablemente debería decir que el código que deslizó textualmente fue escrito por targzeta . Resumir una página con referencias cruzadas no significa plagiar su contenido. (Por supuesto, si usted está targzeta, entonces no es de suponer ningún problema.)
dibujó
Tienes razón de nuevo, editado. Gracias.
Boccaperta-IT
Gracias. (Sé que lleva un poco de tiempo hacerlo bien, pero ayuda a todos un poco más).
Dibujó el
5

Obviamente, hay más de una forma de desollar este gato en particular. Mi favorito actual es usar outline-minor-modecon outshine . Extracto:

;; * This here is my emacs init file
;; ** Many subsections with headlines like this one omitted
;; ** Customising modes
;; […] more lines omitted
;; *** Org and outline modes
(autoload 'outshine-hook-function "outshine")
(add-hook 'outline-minor-mode-hook 'outshine-hook-function)
;; […] and more
;; * Emacs Magic
;;; Local Variables:
;;; mode: emacs-lisp
;;; coding: utf-8
;;; mode: outline-minor
;;; fill-column: 79
;;; End:

Tenga en cuenta que tendrá que salir de su repositorio de paquetes favorito.

Harald Hanche-Olsen
fuente
1
Comencé con el modo de esquema menor, pero encontré que las combinaciones de teclas eran demasiado dolorosas, y nunca encontré el tiempo para hacer algo al respecto. Así que me mudé a orgstruct-mode después de descubrir org-mode, pero luego me enteré de outshine. ¡Felicidad! Actualmente uso el esquema + outshine para toda mi estructuración de elisp, latex y otros archivos con su propio modo principal y el modo org para todo tipo de notas.
Harald Hanche-Olsen
2

Utilizo la siguiente estructura para realizar un seguimiento de los paquetes y archivos

~/.emacs.d
|-- elpa            ;; Package.el packages
|-- hack            ;; Development versions of packages (e.g. org, personal packages)
|-- single-lisp     ;; Individual lisp files from outside sources (e.g. EmacsWiki)
|-- site-lisp       ;; Lisp packages not managed by package.el (directories)
|-- user-config     ;; Machine/situation specific customization (work vs home)
|   `-- custom.el   ;; Customization settings
|-- lisp            ;; Individual .el files to keep init.el clean
|   `-- defaults.el ;; Default configuration settings
`-- init.el

Luego uso use-packagepara administrar qué paquetes se cargan y qué personalizaciones se establecen para cada paquete. La mayoría de las veces solamente hackyelpa requieren actualización, las otras carpetas a menudo son para paquetes que quiero probar o usar brevemente pero que no necesito cargar (incluso de forma inactiva).

custom.el es para personalizar la configuración, que prefiero no usar (y no versión, incluso si lo uso).

defaults.eles para la configuración general (barra de menú, fuente, codificación, etc.) que luego se puede sobrescribir en cualquier archivo .el user-config/para permitir un sistema que funcione como esperaba, pero se puede ajustar para adaptarse al entorno.

Había probado previamente para mantener functions, macros, adviceen paquetes separados para permitir la delimitación entre el contenido, pero se encontró con la definición / requerir temas así que han puesto los de nuevo en init.el. Eventualmente pueden volver a colocarse en~/.emacs.d/lisp/ .

Intento mantenerme init.elordenado, ordenar el contenido por función y propósito para que encontrarlo nuevamente sea sencillo. Tuve el init.elarchivo monolítico y seguí agregando contenido nuevo al final (o donde pensé que podría encajar) y luego terminaría sin saber qué había agregado o dónde lo había agregado cuando fui a buscarlo (y a veces la búsqueda usando isearchno ayudó, ya que no podía recordar cómo nombraba las cosas en ese momento).

Jonathan Leech-Pepin
fuente
2

Todas las respuestas existentes abordan las mejores prácticas para organizar archivos creados manualmente , me gusta init.ely amigos. Igualmente importante es la organización de todos los archivos creados automáticamente de varios paquetes, y para esto el paquete no-litteringes excelente.

Radon Rosborough
fuente
1

yo añadí

  (when (string= (buffer-name) "init.el")
    (setq imenu-generic-expression
      '((nil "^;; \\[ \\(.*\\)" 1))))

a emacs-lisp-mode-hook. Luego agregue a las secciones del archivo "yasnippet", "packaging", "java mode", etc. Esto funciona bien para mis 1000 líneas de código (comentarios incluidos).

EDITAR: Finalmente, cambio entre secciones con helm-imenu. En realidad, el timón se engancha automáticamente a la función imenu normal, así que todo lo que necesito es

       (local-set-key (kbd "C-*") 'imenu)
Matías
fuente
Podría estar utilizando una variable local de archivo en lugar de un gancho.
YoungFrog
1

Dividí mi .emacsarchivo relativamente pequeño en tres partes:

  • emacs-custom.el para personalizaciones, extrayendo muchos datos voluminosos e inútiles; el archivo se reescribe automáticamente sin tocar el archivo principal .emacs , evitando cambios espurios.

    (setq custom-file "~/.emacs-custom.el")
    (load custom-file)
    
  • lg-lib.el para el código en lugar de la configuración: cargar mis propias bibliotecas desde ubicaciones de origen no estándar en lugar de desde el directorio de paquetes y definir varias funciones (principalmente copiadas y pirateadas en ausencia de un paquete adecuado); Es otra gran reducción del recuento de líneas .emacs .

    (load "~/lg-lib")
    
  • El archivo principal .emacs : sin código voluminoso y variables de personalización voluminosas, contiene requirellamadas para paquetes, variables que no son parte del sistema Personalizar y llamadas de función variadas para cargar e inicializar paquetes. Lo "organizo" manteniendo cuidadosamente todas las líneas pertenecientes al mismo paquete o función juntas, y separando aún más la carga del paquete y la configuración relacionada con el paquete de la funcionalidad "central". Un extracto bastante representativo:

    (require 'ido)
    (ido-mode t)
    
    (require 'auto-complete)
    (add-to-list 'ac-dictionary-directories "~/.emacs.d/ac-dict")
    
    (require 'auto-complete-config)
    (ac-config-default)
    (global-auto-complete-mode t)
    

    Estas secciones son pequeñas, pero seguirían siendo manejables con muchas más líneas de configuración para cada paquete.

Lorenzo Gatti
fuente
1

Siga la configuración de un maestro Emacs, por ejemplo, https://github.com/purcell/emacs.d

Por ejemplo, con respecto a cómo organizar paquetes instalados manualmente y paquetes instalados desde ELPA, la configuración de Steven Purcell tiene

a place for 3rd party code which isn't available in MELPA or other
package repositories. This directory and its immediate
subdirectories will be added to load-path at start-up time.

Notably, in Emacs 23.x, a backported package.el is automatically
downloaded and installed here

¿Por qué seguir a un maestro? Un punto importante de mi "Master emacs en un año" es que los novatos pueden evitar eficientemente los gastos generales de configuración y los "problemas".

Entiendo que muchas personas no están de acuerdo conmigo, pero aquí está mi caso (detallado en mi artículo ):

Comencé a usar Emacs usando la respetada configuración de Purcell ( 1403 estrellas GitHub a partir de noviembre de 2014!), Estable (5 años en desarrollo). A pesar de comenzar con eso, todavía tenía muchos problemas . Steve Purcell me ayudó a resolver todos esos problemas. (De hecho, me convertí en su Padawan durante más de un año). Al usar su configuración y los problemas de su repositorio para informar problemas, y aprovechando su experiencia, evité perder mucho tiempo. Incluso hoy, sigo observando a muchas personas que usan git submodulepara administrar los complementos de terceros. Tanto Steve como yo dejamos de usar git submoduleesto porque puede ser una PITA .

Pero si tiene mucha confianza en sus habilidades o prefiere el autoaprendizaje, este no es el camino para usted.

Chen Bin
fuente
2
" Clonar la configuración del maestro ": sin tener en cuenta específicamente las referencias que cita, que podrían proporcionar características o consejos maravillosos (no lo he verificado), no estoy de acuerdo en general en que las personas deberían comenzar clonando archivos init u otras configuraciones de otros. Esa incluso ha sido una política explícitamente desalentada, el IIRC, ya que puede generar problemas. Es mejor comenzar desde cero y estar al tanto (¡e incluso comprender!), Sea lo que sea que use como configuración básica. Por supuesto, no hay nada de malo en estudiar y aprender de lo que otros han hecho. Pero no es aconsejable copiar ciegamente los archivos de inicio. (Solo una opinión.)
Dibujó el
1
En realidad, escribo mi artículo porque todavía hay muchas personas que creen que deberían comenzar desde cero en la configuración. No es la mejor manera para la mayoría de las personas, como lo observé, y una forma innecesariamente difícil para los novatos. solo busque
chen bin
1
Que es " la mejor manera para la mayoría de la gente ". Simplemente busque discusiones y consejos para no comenzar utilizando el archivo init de otra persona. Buscar [email protected], y www.emacswiki.org, y [email protected], e incluso debbugs.gnu.org. Dicho esto, no hay nada de malo en compartir el archivo init de uno, para servir a otros como alimento para el pensamiento. El consejo es que los novatos no comiencen de esa manera; El consejo no es que las personas no compartan sus propios enfoques y consejos de inicio.
Dibujó el
1
Es por el "sesgo de supervivencia". Muchas personas se dan por vencidas antes de conocer emacswiki o la lista de correo.
chen bin
0

Una forma innovadora y simple de limpiar su .emacs.dcarpeta es usar org-modey delinear todo usando bloques fuente. Luego, en su .emacsarchivo, señale su config.org.

Un recurso maravilloso sobre esto es Harry Schwartz. Tiene un video de YouTube que toca y una publicación de blog que explica los detalles . Pude seguirlo como un novato de emacs y obtener toda la configuración. Funciona de maravilla. 1 archivo para mi entero init.

SeaDude
fuente