Skip to content

Leben in Emacs

Thomas Cole: Expulsion from the Garden of Eden

Als höchstes Ideal für Emacs-User gilt es, sämtliche Aufgaben, die man am Rechner erledigt, in Emacs zu erledigen.

Es gilt als höchstes Ideal, Emacs niemals zu verlassen, niemals zu beenden und niemals - wirklich niemals - neu zu starten:

Wie, du verlässt Emacs?

Das höchste Ideal für Emacs-"Enthusiasten" besteht aus drei einfachen Worten:

Leben in Emacs.

aka

Living in Emacs.

Kann man machen. Muss man aber nicht. Ich habe diesen Punkt bereits überwunden und hinter mich gelassen. Ich lebte eine Zeitlang in Emacs - und zwar nur in Emacs - , es war nett, es war schön, doch die Reise dahin war schöner als das Ziel selbst. Was macht er, der ständig um sein Leben kämpfende Held, wenn er alle Ziele erreicht, alle Gefahren überwunden hat?

Er fängt an, sich furchtbar zu langweilen.

Emacs ist Kampf

Dinge in Emacs zu konfigurieren, ist Kampf: Wer in Emacs konfiguriert, der programmiert. Er ist Teil einer Elite. Er ist die Elite. Wo andere Programme ein einfaches ´Parameter = Wert´-Schema pflegen, schreibt er Elisp-Code.

Das ist geil und das wollen wir alle. Manchmal wollen wir das aber auch nicht. Nämlich dann, wenn wir merken, dass dieses "Konfigurieren" zum Selbstzweck wird. Irgendwann ist der Punkt gekommen, wo das Gebastel mehr Spaß macht, als das eigentliche Benutzen selbst.

Und das kann süchtig machen!!1elf!

Wer nach unzähligen Nächten diesen Punkt erreicht hat, wo etwas endlich funktioniert, fällt in ein tiefes Loch: Ein neues Feature zu konfigurieren war Lebensinhalt. Lebenszweck. Es war der Sinn des Lebens!

Sobald es dann läuft, hat das Leben seinen Sinn verloren und man sieht sich nach heftiger Depression nach einer neuen Aufgabe um.

Emacs ist Krieg

Die Dokumentation gibt es nur auf Japanisch? Umso besser: Losgegoogelt nach Konfigurations-Beispielen aller möglichen Leute und irgendwas zusammengeschustert, bis es funktioniert. Jeder konfiguriert sich alles anders und bei jedem scheint der Kram zu funktionieren, außer bei einem selbst.

Irgendwann funktioniert's dann aber auch bei einem selbst. Die Schlacht - ach was: Der ganze verdammte Krieg - ist gewonnen.

Auf zum nächsten Krieg!

Scherz beiseite

Wer wirklich alles mit Emacs erledigt, glotzt den ganzen Tag in einen kleinen schwarzen Bildschirm. Egal ob er Mails abruft, per org-mode bloggt, im irc chattet, etwas programmiert, Musik hört, im Internet surft oder etwas schreibt.

Als ich alles mit Emacs erledigt habe, merkte ich, dass es doch eigentlich Spaß macht, alle möglichen verschiedenen Technologien zu verwenden und damit rumzuspielen.

Wie gern schaue ich mir das Design von medium.com an?

Wie wundervoll sehen Twitter-Profile aus, packen sie sich schöne Bilder oder lustige GIFs in ihre Tweets?

Instagram!

Alles Dinge, die ich nicht oder nur wenig benutze. Trotzdem schaue ich immer wieder gern vorbei.

Und fangen wir erst gar nicht mit Ghost an!

(Nur mit Facebook bin ich wirklich nie warm geworden.)

Wer braucht schon Mäuse?

"Richtige" Emacser erledigen alles mit der Tastatur. Und "alles" heißt in diesem Fall auch "alles". Wer braucht schon 'ne Maus?

You mouse = you noob!

Erledigen Sie alles in Emacs, geben Sie ständig mehr oder weniger ergonomische Tastenkürzel ein. Das ist anstrengend. Ein Mausklick wäre manchmal einfach ergonomischer (Navigieren in einem größeren Textblock? Ein Mausklick. Oder ´M-r SUCHBEGRIFF´ gefolgt von ´M-r´, bis die entsprechende Stelle im Text erreicht ist).

Tastatur-Makros machen alles einfacher!

Ja, aber bis die Makros im Live-Betrieb konfiguriert sind ...

GUI? Geh mir weg!

Lenkt nur ab. Ich lese eh den ganzen Tag nur Docs und wozu brauche ich da Bilder und Bling Bling?

Hab gestern was mit Word geschrieben. Und du so?

Hab mit Emacs Musik gehört ...

(Schon mal von emms-lyrics gehört (ich hab das immer nur "Karaoke Mode" genannt)?)

Es gibt in Emacs so viel zu entdecken und auszuprobieren, dass man fast gar nicht mehr dazu kommt, irgendwas Produktives (Texte/Quellcode schreiben - wobei: Eigentlich schreibt man ja die ganze Zeit Quellcode) damit zu machen.

Und fangen wir am besten gar nicht erst mit dem "org-mode" an: "org" wie "organisieren" oder "organizer" - erwähnte ich schon, dass ich per org-mode meine Bücher von reinem Text nach .odt konvertiere?

Oder mal damit gebloggt habe? Hier mal meine damalige Konfig (Auszug ca. 50%):

Überspringen

;;; ---------------------------------------------------------
;;; Based on: https://ogbe.net/blog/blogging_with_org.html
;;;

;;; ---------------------------------------------------------
;;; General information
;;;
(setq bookhacker-github-username "bookhacker")

(setq my-blog-extra-head "")

;;; ---------------------------------------------------------
;;;
(defun my-blog-get-preview (file)
  "The comments in FILE have to be on their own lines, prefereably before and after paragraphs."
  (with-temp-buffer
    (insert-file-contents file)
    (goto-char (point-min))
    (let ((beg (+ 1 (re-search-forward "^#\\+BEGIN_PREVIEW$")))
          (end (progn (re-search-forward "^#\\+END_PREVIEW$")
                      (match-beginning 0))))
      (buffer-substring beg end))))

;;; ---------------------------------------------------------
;;; 
(defun my-blog-sitemap (project &optional sitemap-filename)
  "Generate the sitemap for my blog."
  (let* ((project-plist (cdr project))
         (dir (file-name-as-directory
               (plist-get project-plist :base-directory)))
         (localdir (file-name-directory dir))
         (exclude-regexp (plist-get project-plist :exclude))
         (files (nreverse
                 (org-publish-get-base-files project exclude-regexp)))
         (sitemap-filename (concat dir (or sitemap-filename "sitemap.org")))
         (sitemap-sans-extension
          (plist-get project-plist :sitemap-sans-extension))
         (visiting (find-buffer-visiting sitemap-filename))
         file sitemap-buffer)
    (with-current-buffer
        (let ((org-inhibit-startup t))
          (setq sitemap-buffer
                (or visiting (find-file sitemap-filename))))
      (erase-buffer)
      ;; loop through all of the files in the project
      (while (setq file (pop files))
        (let ((fn (file-name-nondirectory file))
              (link ;; changed this to fix links. see postprocessor.
               (file-relative-name file (file-name-as-directory
                                         (expand-file-name (concat (file-name-as-directory dir) "..")))))
              (oldlocal localdir))
          (when sitemap-sans-extension
            (setq link (file-name-sans-extension link)))
          ;; sitemap shouldn't list itself
          (unless (equal (file-truename sitemap-filename)
                         (file-truename file))
            (let (;; get the title and date of the current file
          (title (org-publish-format-file-entry "%t" file project-plist))
          (date (org-publish-format-file-entry "%d" file project-plist))
          ;; (date (org-publish-find-date file))
          ;; (date (plist-get env :date))
                  ;; get the preview section from the current file
                  (preview (my-blog-get-preview file))
                  (regexp "\\(.*\\)\\[\\([^][]+\\)\\]\\(.*\\)"))
              ;; insert a horizontal line before every post, kill the first one
              ;; before saving
              (insert "-----\n")
              (cond ((string-match-p regexp title)
                     (string-match regexp title)
                     ;; insert every post as headline
                     (insert (concat" " (match-string 1 title)
                                    "[[file:" link "]["
                                    (match-string 2 title)
                                    "]]" (match-string 3 title) "\n")))
                    (t (insert (concat " [[file:" link "][" title "]]\n"))))
              ;; add properties for `ox-rss.el' here
              (let ((rss-permalink (concat (file-name-sans-extension link) ".html"))
                    (rss-pubdate (format-time-string
                                  (car org-time-stamp-formats)
                                  (org-publish-find-date file))))
                (org-set-property "RSS_PERMALINK" rss-permalink)
                (org-set-property "PUBDATE" rss-pubdate))
              ;; insert the date, preview, & read more link
              ;; (insert (concat date "\n\n"))
          (insert (concat "#+HTML: 
\nVeröffentlicht: " date "\n#+HTML:
\n\n")) (insert preview) (insert (concat "[[file:" link "][Weiterlesen...]]\n")))))) ;; kill the first hrule to make this look OK (goto-char (point-min)) (let ((kill-whole-line t)) (kill-line)) (goto-char (point-min)) (setq sitemap-title (plist-get project-plist :sitemap-title)) (insert (format "#+TITLE: %s\n\n" sitemap-title)) (save-buffer)) (or visiting (kill-buffer sitemap-buffer)))) ;;; --------------------------------------------------------- ;;; (defun my-blog-articles-postprocessor () "Massage the sitemap file and move it up one directory. for this to work, we have already fixed the creation of the relative link in the sitemap-publish function" (let* ((sitemap-fn (concat (file-name-sans-extension (plist-get project-plist :sitemap-filename)) ".html")) (sitemap-olddir (plist-get project-plist :publishing-directory)) (sitemap-newdir (expand-file-name (concat (file-name-as-directory sitemap-olddir) ".."))) (sitemap-oldfile (expand-file-name sitemap-fn sitemap-olddir)) (sitemap-newfile (expand-file-name (concat (file-name-as-directory sitemap-newdir) sitemap-fn)))) (with-temp-buffer (goto-char (point-min)) (insert-file-contents sitemap-oldfile) ;; massage the sitemap if wanted ;; delete the old file and write the correct one (delete-file sitemap-oldfile) (write-file sitemap-newfile)))) ;;; --------------------------------------------------------- ;;; (setq org-publish-project-bookhacker '(("bookhacker" :components ("bookhacker-articles" "bookhacker-pages" "bookhacker-static")) ("bookhacker-articles" :base-directory "~/org/websites/bookhacker.org/org-files/blog/" :base-extension "org" :publishing-directory "~/org/websites/bookhacker.org/public_html/blog/" :completion-function my-blog-articles-postprocessor :recursive t :publishing-function org-html-publish-to-html :with-author t :with-creator nil :with-date t :headline-level 4 :section-numbers nil :with-toc nil :with-drawers t :html-link-home "/" :html-preamble usw.

Das da oben ist nicht der komplette WordPress-Quelltext, das ist nur die Konfig. Für eine einzelne org-mode Webseite! Sexy, nicht?

Ablenkungsfreies Schreiben? Von wegen!

Hat man sich in Emacs sein kleines Refugium zum ablenkungsfreien Schreiben eingerichtet, wird Emacs irgendwann selbst zur Ablenkung. Das ist auch der Grund, warum meine Schreibkisten das alles zukünftig nicht mehr können werden.

Leute, wollt ihr ablenkungsfrei schreiben, kauft euch das billigste Netbook und die beste Tastatur, schafft im Textmodus mit einem reinen Text-Editor und installiert auf der Kiste wirklich nur das, was ihr zum Schreiben wirklich benötigt. Alles andere ist Spielzeug.

[Disclaimer: Der Verfasser ist seit zwanzig Jahren Emacs-Benutzer, verwendet Emacs auf einem Netbook im Textmodus ohne Maus und hält Emacs für das Großartigste, was Menschen jemals erschaffen haben. Er benutzt dieses Setup jedoch nur noch zum Schreiben. Da er ständig schreibt oder an einem Buch arbeitet, lebt er quasi noch immer in Emacs.]

(Ja, ginge es nach mir, wäre Emacs längst Weltkulturerbe!)

Bildnachweis: Thomas Cole (1801–1848): Expulsion from the Garden of Eden (1828)

Trackbacks

Kommentare

Ansicht der Kommentare: Linear | Verschachtelt

Noch keine Kommentare

Kommentar schreiben

Die angegebene E-Mail-Adresse wird nicht dargestellt, sondern nur für eventuelle Benachrichtigungen verwendet.
Gravatar, Twitter, Pavatar, Identica, Favatar Autoren-Bilder werden unterstützt.
Umschließende Sterne heben ein Wort hervor (*wort*), per _wort_ kann ein Wort unterstrichen werden.
Standard-Text Smilies wie :-) und ;-) werden zu Bildern konvertiert.
Markdown-Formatierung erlaubt
Formular-Optionen