Puis-je utiliser le mode org pour structurer mon .emacs ou un autre fichier de configuration .el?


48

Mon .emacsfichier de configuration devient de plus en plus gros et j'aimerais avoir une meilleure vue d'ensemble et une meilleure structuration en ajoutant des titres, des sous-titres et en étant capable de les masquer ou de les montrer comme je peux le faire avec Emacs org-mode.

J'ai remarqué que je peux org-modeégalement activer le .emacstampon et qu'il est possible d'ajouter des en-têtes et de les réduire. Mais Emacs / Aquamac pourra-t-il toujours charger le code Elisp à partir du document si j'ajoute des en- org-modetêtes (c'est-à-dire des lignes commençant par un ou plusieurs astérisques)?

Puis-je avoir tout cela dans un fichier ou devrais-je avoir un .*orgfichier puis exporter régulièrement le code Elisp dans un autre fichier?

Réponses:


46

Oui, vous pouvez certainement, vous pouvez utiliser org-babel-load-filepour faire cela.

Dans votre init.el, mettez ce qui suit:

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

(J'utilise ~ / .emacs.d / settings.org mais c'est une préférence personnelle). Dans le settings.orgfichier, vous pouvez l'arranger comme bon vous semble, en enveloppant elisp dans:

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

Lorsque vous démarrez Emacs, il déterminera automatiquement si le fichier settings.org a été modifié et, si nécessaire, mélangez-le pour produire un settings.elfichier qui sera chargé.


1
Comment orgchangeriez- vous ceci pour charger le dernier en date d'elpa, au lieu de orgcelui disponible dans un propre Emacs? Il semble que le packagecode d'initialisation aurait besoin d'être extrait settings.orget inséré init.el?
Mankoff

3
@ mankoff C'est vrai, c'est mon 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 Désolé pour le formatage médiocre, j'ai une version plus lisible près du sommet de writequit.org/org/settings.html
Lee H

2
Il existe plus que quelques exemples de config alphabétisés Emacs. Peut-être qu'il est temps de commencer un index. Voici le mien par exemple github.com/grettke/home
grettke

1
souvenez-vous de ne pas configurer les éléments liés à org dans le fichier org si vous souhaitez utiliser la dernière version de org (9) disponible sur Melpa. Je fais cela github.com/cescoferraro/dotfiles/blob/master/src/emacs.d/…
CESCO le

23

Si vous ne souhaitez que l'affichage sélectif des sections et la navigation entre les titres, vous n'avez pas besoin du mode Org. Tout ce dont vous avez besoin est le mode Outline . Le mode Plan est essentiellement la gestion du niveau d'en-tête et de la visibilité des sections du mode Org. En fait, le mode Org était à l’origine les extensions de l'auteur en mode Plan, et a grandi, et grandi, et grandi… Encore aujourd'hui, org-modeon en dérive outline-mode.

Le mode Plan existe à la fois en mode majeur et en mode mineur. Le mode mineur peut être utilisé dans n'importe quel mode majeur. Vous pouvez le configurer pour utiliser un format d'en-tête compatible avec la syntaxe de votre programme, comme le font de nombreux modes principaux, en définissant la outline-regexpvariable sur une expression rationnelle qui correspond au début d'un en-tête. Par exemple, il s’agit de la valeur par défaut en mode Lisp d’Emacs:

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

C'est-à-dire que les en-têtes de section commencent par au moins trois points-virgules et un seul espace, ou une parenthèse ouvrante dans la marge de gauche. La variable outline-levelcontient le nom d'une fonction pour déterminer la profondeur d'un en-tête; la valeur par défaut est la longueur de la chaîne correspondante outline-regexp, et le mode Lisp d’Emacs le remplace pour attribuer une profondeur plus grande à (et ;;;###autoload.

Si le format d'en-tête par défaut ne vous convient pas, définissez la variable outline-regexpdans une déclaration de variable locale de fichier . C’est ce que j’utilise - mes en-têtes de section sont tous ;;;suivis de la séquence classique d’étoiles:

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

Si vous souhaitez que le mode mineur hiérarchique soit automatiquement activé lorsque vous chargez le fichier, ajoutez la ligne suivante dans la section Variables locales - notez que cela vous avertira du code dangereux dans Emacs ≤23.x.

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

Les commandes pour le mode contour mineur utilisent le C-c @préfixe plutôt gênant par défaut. Je le déplace M-o(je n'utilise jamais les liaisons de facemenu), vous pouvez préférer une autre clé ou reproduire les liaisons du mode Org (qui ont divergé un peu du mode Plan).


4
Je seconde ceci. Org est génial, mais pour cela, tout ce dont vous avez besoin est en mode contour. Et cela devient encore meilleur si vous le combinez avec les modes outshine, outorg et navi. Avec outshine et outorg, vous n'avez pas besoin d'utiliser org-babel et son mélange dans des fichiers séparés pour obtenir de beaux commentaires de style org. Voici un aperçu du code elisp que j'utilise pour que les codes Python, elisp et shell fonctionnent et se plient joliment en contour / en éclat.
Blujay

14

La programmation lettrée vous emmène le plus souvent, org-mode le supporte via org-babel . Deux solutions possibles sont expliquées sur le blog de @malabarba :

Le moyen le plus simple est de charger org-mode, puis d’utiliser sa fonctionnalité de démêlage pour charger une configuration alphabétisée d’Emacs:

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

Alternativement (pour éviter de charger entièrement l'org), le démêlage peut être effectué avec les primitives Lisp d'Emacs:

(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

Encore un vote pour le mode contour. Par exemple, pour organiser, .emacsj'utilise la syntaxe suivante:

;;; HEADING:

les parties importantes sont ;;;et:\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)
            ))

Voici un exemple .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)
)

;; ...

Il faut activer outline-minor-mode, puis les deux touches de touche requises sont les suivantes:

  • C-c @ C-t - montrer la structure de niveau supérieur

    ce qui précède devient

    ;;; preliminaries:
    ;;; modes:
    ;;; customizations:
    
  • C-c @ C-a - montrer tout à nouveau

Une utilisation typique est de montrer la structure de niveau supérieur, de passer à la rubrique d'intérêt et de tout afficher à nouveau.


1
Peut-on utiliser des directives comme dans org-mode: eg #+STARTUP: overviewou show allou contentsoptions.
doctorat

@doctorate: la prise en charge du pliage en mode org est également basée sur le mode contour. Nous ne pouvons pas utiliser uniquement les directives: parce que, contrairement au mode org, elisp #n’est pas un signe de commentaire, l’interpréteur intégré d’elisp d’emacs serait confus lorsqu’il frappe le #+STARTUPou quelque chose comme ça. (ou ai-je mal compris votre commentaire?)
Adobe

Je veux dire, existe-t-il un moyen de mettre en œuvre la STARTUPdirective à l'intérieur orgstruct-mode, par exemple, c'était un tampon R mais la même idée: emacs.stackexchange.com/a/8065/2443
doctorat

3

Dans la réponse suivante, vous verrez comment le faire, par exemple des projets utilisant un ou plusieurs fichiers org, quels sont les avantages d’utiliser Cask et des liens vers de la documentation.

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

J'ai tourné ma configuration vers org il y a quelques mois et je ne suis pas totalement satisfaite. Cela nécessite quelques config et la lecture du manuel org pour avoir un fichier org utile qui facilite l'édition du code elisp. Il faut activer la fontification de bloc src (désactivé par défaut -> utiliser une variable par fichier), vérifier que les autres modes ne sont pas en conflit pour l'édition de blocs src (mode de remplissage automatique), etc. On ne veut pas utiliser Cc (backtick) (org-edit-src-block`) pour éditer un bloc src. Et cela devient un peu gênant pour le débogage.

Mon conseil serait: commencez par casser votre fichier init en petits morceaux elisp, essayez un paquetage plus étroit, utilisez-le helm-swooppour la navigation rapide, puis envisagez de l'utiliser org-mode.


1

J'ai récemment investi du temps pour faire exactement cela. Je me suis retrouvé avec une configuration qui - est maintenue avec org-mode - utilise 'use-package' pour installer automatiquement les paquets manquants - est un dépôt github de ce type d'installation automatique (plug sans vergogne: https://github.com / pascalfleury / emacs-config )

J'ai «amorcé» quelques machines (Linux et Mac) en clonant le référentiel et en ajoutant une seule ligne dans le fichier ~ / .emacs et le tour est joué. Je suis installé comme je veux.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.