¿Puedo usar el modo org para estructurar mi .emacs u otro archivo de configuración .el?


48

Mi .emacsarchivo de configuración se hace cada vez más grande y me gustaría obtener una mejor visión general y estructuración agregando encabezados, subtítulos y poder ocultarlos o mostrarlos como puedo hacer con Emacs org-mode.

Noté que también puedo activar org-modeen el .emacsbúfer y que es posible agregar encabezados y colapsarlos. ¿Pero Emacs / Aquamacs todavía podrá cargar el código Elisp del documento si agrego org-modeencabezados (es decir, líneas que comienzan con uno o más asteriscos)?

¿Puedo tener todo eso en un archivo o tendría que tener un .*orgarchivo y luego exportar regularmente el código Elisp a otro archivo?

Respuestas:


46

Sí, ciertamente puedes, puedes usar org-babel-load-filepara hacer esto.

En tu init.el, pon lo siguiente:

(require 'org)
(org-babel-load-file
 (expand-file-name "settings.org"
                   user-emacs-directory))

(Estoy usando ~ / .emacs.d / settings.org pero esa es una preferencia personal). En el settings.orgarchivo puede organizarlo como desee, envolviendo elisp en:

* Turn off menu bar
#+BEGIN_SRC emacs-lisp
(menu-bar-mode -1)
#+END_SRC

Cuando inicie Emacs, determinará automáticamente si el archivo settings.org ha cambiado y, si es necesario, lo enredará para producir un settings.elarchivo que se cargará.


1
¿Cómo cambiaría esto para cargar lo último orgde elpa, en lugar de lo orgque está disponible en un emacs limpio? Parece que el packagecódigo de inicialización debería extraerse settings.orgy colocarse init.el?
mankoff

3
@mankoff Eso es correcto, este es mi init.el: (require 'package) (package-initialize) (setq custom-file "~/.emacs.d/custom.el") (when (file-exists-p custom-file) (load custom-file)) (require 'org) (org-babel-load-file (expand-file-name "settings.org" user-emacs-directory))
Lee H

2
@mankoff Lo siento por el mal formato, tengo una versión más legible cerca de la parte superior de writequit.org/org/settings.html
Lee H

2
Hay más de unos pocos ejemplos de configuraciones alfabetizadas de Emacs. Quizás es hora de comenzar un índice. Aquí está el mío, por ejemplo github.com/grettke/home
grettke

1
recuerde no configurar cosas relacionadas con la organización dentro del archivo de organización si desea utilizar la última versión de la organización (9) disponible en Melpa. Estoy haciendo esto github.com/cescoferraro/dotfiles/blob/master/src/emacs.d/…
CESCO

23

Si todo lo que desea es una visualización selectiva de secciones y navegación entre encabezados, no necesita el modo Org. Todo lo que necesitas es el modo Esquema . El modo de esquema es básicamente el nivel de encabezado y la gestión de visibilidad de sección del modo Org. De hecho, el modo Org fue originalmente las extensiones del autor al modo Esquema, y ​​creció, creció y creció ... Incluso hoy, org-modese deriva de outline-mode.

El modo de esquema existe como modo principal y como modo secundario. El modo menor se puede usar en cualquier modo mayor. Puede configurarlo para usar un formato de encabezado que sea compatible con la sintaxis de su programa, y ​​muchos modos principales lo hacen, configurando la outline-regexpvariable en una expresión regular que coincida con el inicio de un encabezado. Por ejemplo, este es el valor predeterminado en el modo Emacs Lisp:

";;;\\(;* [^ \t\n]\\|###autoload\\)\\|("

es decir, los encabezados de sección comienzan con tres o más puntos y comas y un solo espacio, o un paréntesis de apertura en el margen izquierdo. La variable outline-levelcontiene el nombre de una función para determinar la profundidad de un encabezado; el valor predeterminado es la longitud de la cadena que coincide outline-regexp, y el modo Emacs Lisp lo anula para asignar una mayor profundidad a (y ;;;###autoload.

Si no le gusta el formato de encabezado predeterminado, configure la variable outline-regexpen un archivo de declaración de variable local . Esto es lo que uso: todos mis encabezados de sección consisten en ;;;seguidos de la secuencia clásica de estrellas:

;;; Local Variables:
;;; outline-regexp: ";;;\\*+\\|\\`"
;;; End:

Si desea que el modo secundario Esquema se active automáticamente cuando carga el archivo, agregue la siguiente línea en la sección Variables locales: tenga en cuenta que esto le advertirá sobre el código inseguro en Emacs ≤23.x.

;;; eval: (outline-minor-mode 1)

Los comandos para el modo de esquema menor usan el C-c @prefijo bastante inconveniente de forma predeterminada. Lo muevo a M-o(nunca uso los enlaces del menú facial), puede preferir otra tecla o replicar los enlaces del modo Org (que se han desviado bastante del modo Esquema).


44
Secundo esto. Org es genial, pero para esto, todo lo que necesitas es el modo de esquema. Y se pone aún mejor si lo combina con el modo outshine, outorg y navi-mode. Con outshine y outorg, no necesita usar org-babel y su enredado en archivos separados para obtener buenos comentarios de estilo org-mode. Aquí hay una idea general del código elisp que uso para hacer que Python, elisp y el código de shell funcionen y se plieguen bien en el esquema / outshine.
Blujay

14

La programación literaria lo lleva al máximo, org-mode lo admite a través de org-babel . En el blog de @malabarba se explican dos posibles soluciones :

La forma más simple es cargar el modo org, luego usar su función de desenredado para cargar una configuración alfabetizada de Emacs:

(require 'org)
(org-babel-load-file
 (expand-file-name "emacs-init.org"
                   user-emacs-directory))

Alternativamente (para evitar cargar la organización por completo), se puede desenredar con las primitivas Emacs Lisp:

(defvar endless/init.org-message-depth 3
  "What depth of init.org headers to message at startup.")

(with-temp-buffer
  (insert-file "~/.emacs.d/init.org")
  (goto-char (point-min))
  (search-forward "\n* init.el")
  (while (not (eobp))
    (forward-line 1)
    (cond
     ;; Report Headers
     ((looking-at
       (format "\\*\\{2,%s\\} +.*$"
               endless/init.org-message-depth))
      (message "%s" (match-string 0)))
     ;; Evaluate Code Blocks
     ((looking-at "^#\\+BEGIN_SRC +emacs-lisp.*$")
      (let ((l (match-end 0)))
        (search-forward "\n#+END_SRC")
        (eval-region l (match-beginning 0))))
     ;; Finish on the next level-1 header
     ((looking-at "^\\* ")
      (goto-char (point-max))))))

6

Un voto más para el modo de esquema. Por ejemplo, para organizar .emacs, uso la siguiente sintaxis:

;;; HEADING:

las partes importantes son ;;;y:\n

(add-hook 'emacs-lisp-mode-hook 
          (lambda ()
            (make-local-variable 'outline-regexp)
            (setq outline-regexp "^;;; ")
            (make-local-variable 'outline-heading-end-regexp)
            (setq outline-heading-end-regexp ":\n")
            (outline-minor-mode 1)
            ))

Aquí hay una muestra .emacs:

;;; preliminaries:
;; load-path:
;; This little monster adds all non-dot dirs to Your load path recursively
(let* ((my-lisp-dir "~/.emacs.d/site-lisp/")
       (default-directory my-lisp-dir)
       (orig-load-path load-path))
  (setq load-path (cons my-lisp-dir nil))
  (normal-top-level-add-subdirs-to-load-path)
  (nconc load-path orig-load-path))

;; ...

;;; modes:

;; python-mode:
(setq py-install-directory "~/.emacs.d/site-lisp/python-mode")
(add-to-list 'load-path py-install-directory)
(require 'python-mode)

;; ...

;;; customizations:
(custom-set-variables
 '(blink-cursor-mode nil)
)

;; ...

Uno debe habilitar outline-minor-modey luego las dos pulsaciones de teclas necesarias son:

  • C-c @ C-t - mostrar estructura de nivel superior

    lo anterior se convierte

    ;;; preliminaries:
    ;;; modes:
    ;;; customizations:
    
  • C-c @ C-a - mostrar todo de nuevo

Un uso típico es mostrar la estructura de nivel superior, pasar al encabezado de interés y mostrar todo de nuevo.


1
podemos usar directivas como en org-mode: por ejemplo, #+STARTUP: overviewo la show allo contentslas opciones.
doctorado

@doctorate: el soporte del modo org para el plegado también se basa en el modo de esquema. No podemos usar solo las directivas: porque en contraste con el modo org, en elisp #no es un signo de comentario, por lo que el intérprete de elisp incorporado de emacs se confundiría cuando golpeara #+STARTUPo algo así. (¿o he entendido mal su comentario?)
Adobe

Quiero decir, ¿hay alguna manera de implementar la STARTUPdirectiva en el interior? orgstruct-modePor ejemplo, este era un buffer R pero la misma idea: emacs.stackexchange.com/a/8065/2443
doctorado

3

En la siguiente respuesta SO, verá cómo hacerlo, ejemplos de proyectos que usan un solo archivo de organización o muchos, cuál es la ventaja de usar Cask y enlaces a la documentación.

https://stackoverflow.com/questions/25430029/whats-the-best-way-to-package-my-emacs-installation-packages-and-config-so-tha/25430745#25430745

Cambié mi configuración a org hace unos meses, y no estoy totalmente satisfecho con ella. Requiere un poco de configuración y lectura del manual de la organización para tener un archivo de organización útil que facilite la edición del código elisp. Uno tiene que habilitar la fuente de bloques src (desactivada por defecto -> usar una variable por archivo), verificar que otros modos no entren en conflicto para editar bloques src (modo de autocompletar), etc. Uno no quiere usar Cc (backtick) (org-edit-src-block`) para editar un bloque src. Y se pone un poco en el camino para la depuración.

Mi consejo sería: comience dividiendo su archivo de inicio en pequeños trozos de elisp, intente con un paquete de restricción, use helm-swooppara una navegación rápida y luego considere usarlo org-mode.


1

Recientemente he invertido algo de tiempo para hacer exactamente eso. Terminé con una configuración que, mantenida con el modo org, usa 'use-package' para instalar automáticamente los paquetes faltantes, es un repositorio de github que se instala automáticamente (enchufe descarado: https://github.com / pascalfleury / emacs-config )

He 'arrancado' algunas máquinas (Linux y Mac) clonando el repositorio y agregando una sola línea en ~ / .emacs et voila. Estoy preparado como me gusta.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.