Konfiguration im Org-Mode

Die Zeit vor dem Org-Mode

Im Laufe der Zeit habe ich unterschiedlichste Konfigurationsstrategien ausprobiert. Nachdem ich mich intensiver mit dem org-Mode beschäftigt hatte, war die Umsetzung der Konfiguration über den org-Mode die für mich überzeugendste Variante. Holger Schurig hat das Prinzip beschrieben.

Quelle(n)

Was ich nun aus seiner Anleitung gemacht habe, soll hier dokumentiert werden.

Konfiguration des emacs im org-Mode

Org-Dateien haben zwei Voreile:

  • Den Klappmechanismus für Überschriften, der für Übersicht in langen Texten sorgt.

  • Die Möglichkeit Code in das Dokument zu integerieren, der als Dokumentation dienen, aber auch ausgeführt werden kann. Das nennt man dann »Literal Programming«.

Dies hat zur Folge, dass die Übersicht einer Komplexen Konfiguration erhalten bleibt und einzelne Teile der Konfiguration separat getestet werden können.

Inhalt von .emacs

Die .emacs bleibt weiterhin das zentrale Element der Konfiguration. Ausgelagert sind wichtige Teile in eine Datei config.org Die .emacs enthält nun eine Funktion welche die Datei config.org einliest, daraus eine config.el generiert und diese generierte Datei mit dem Start des EMACS ausführt.

../_images/konfiguration.png

Schritt I: Inhalt der .emacs

;; Peter EMACS-Konfiguration
;; 1. config.org wird eingelesen
;; 2. alle SRC-Blöcke werden evaluiert und nach config.el geschrieben
;; 3. die generierte config.el wird geladen und damit der EMACS konfiguriert
;; Quelle(n): http://www.holgerschurig.de/en/emacs-init-tangle/
;;            https://bitbucket.org/holgerschurig/emacsconf

(defun my-tangle-config-org ()
  "This function will write all source blocks
from =config.org= into =config.el= that are ...

- not marked as =tangle: no=
- doesn't have the TODO state =CANCELLED=
- have a source-code of =emacs-lisp="
  (require 'org)
  (let* ((body-list ())
     (output-file "~/config.el")
     (org-babel-default-header-args
      (org-babel-merge-params org-babel-default-header-args
                              (list (cons :tangle output-file)))))
    (message "Writing %s ..." output-file)
    (save-restriction
      (save-excursion
    (org-babel-map-src-blocks "~/config.org"
      (let* ((info (org-babel-get-src-block-info 'light))
             (tfile (cdr (assq :tangle (nth 2 info))))
             (match))
        (save-excursion
          (catch 'exit
            (org-back-to-heading t)
            (when (looking-at org-outline-regexp)
              (goto-char (1- (match-end 0))))
            (when (looking-at (concat " +" org-todo-regexp "\\( +\\|[ \t]*$\\)"))
              (setq match (match-string 1)))))
        (unless (or (string= "no" tfile)
                    (string= "CANCELED" match)
                    (not (string= "emacs-lisp" lang)))
          (add-to-list 'body-list body)))))
      (with-temp-file output-file
    (insert ";; Don't edit this file, edit config.org' instead ...\n\n")
    (insert (apply 'concat (reverse body-list))))
      (message "Wrote %s ..." output-file))))


(my-tangle-config-org)

(defvar HOME "~/")                       ;; HOME-Variable setzen
(cd "~/")                                ;; Startverzeichnis
(load-file (concat HOME "config.el"))

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Was nach diesem Drei-Zeiler steht wurde generiert und kann jederzeit gelöscht werden
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

Schritt II: config.org

Erste Einträge

Grundeineistellungen

Es folgen nun alle Grundeinstellungen nach Themen gruppiert. Hier sollte schon das Grundprinzip klar werden. Weitere Einstellungen werden folgen.

Farbe

Schriftfarbe…

#+BEGIN_SRC emacs-lisp

(set-face-background 'default "lemon chiffon")
(set-face-background 'region "pale goldenrod")
(set-background-color "lemon chiffon")

#+ENDSRC

Kursorfarbe …

#+BEGIN_SRC emacs-lisp

(setq default-frame-alist
  '((cursor-color . "orange")))
(add-to-list 'default-frame-alist '(cursor-color . "orange"))

Das erste Ergebnis

Es ist der Inhalt von config.el, generiert aus config.org!

;; Don't edit this file, edit config.org' instead ...

(set-face-background 'default "lemon chiffon")
(set-face-background 'region "pale goldenrod")
(set-background-color "lemon chiffon")


(setq default-frame-alist
  '((cursor-color . "orange")))
(add-to-list 'default-frame-alist '(cursor-color . "orange"))