Früher habe ich für meinen Haupteditor jed viele kleine Hilfsfunktionen zur Erleichterung der Arbeit programmiert. Mit meinen Umstieg auf Emacs hat dies (leider) nachgelassen, da mir Lisp nicht so gut liegt, die S-Lang. Aber ich kämpfe mich immer tiefer durch die Klammerwelt voran.

Schlagwort In-Arbeit automatisch setzen und löschen

Da ich immer an mehreren Seiten gleichzeitig schreibe – je nachdem wie mir die Gedanken zu den Themen kommen –, sollen die Seiten, die ich im Emacs geöffnet habe und somit »in Bearbeitung« sind, entsprechend mit dem Tag In-Arbeit versehen werden. Leider vergesse ich manchmal den Tag zu setzen oder auch ihn am Ende zu löschen. Deshalb soll diese Aufgabe Emacs übernehmen.

Ich habe mir also die zwei Hilfsfunktionen add-in-arbeit und remove-in-arbeit erstellt, die ich dann im markdown-mode-hook aufrufe bzw. als kill-buffer-hook hinzufüge:

(defun add-in-arbeit ()
  "Add the tag \"In-Arbeit\" in markdown files of my website"
  (unless buffer-read-only
    (save-excursion
      (goto-char 0)
      (if (and (search-forward "[[!tag" nil t)
               (not (search-forward "In-Arbeit" (line-end-position) t))
               )
          (let ((save-it (not (buffer-modified-p))))
            (insert " In-Arbeit")
            (if save-it
                (save-buffer)
              ))
        ))
    ))

(defun remove-in-arbeit ()
  "Remove the tag \"In-Arbeit\" in markdown files of my website"
  (unless buffer-read-only
    (save-excursion
      (goto-char 0)
      (if (and (search-forward "[[!tag" nil t)
               (search-forward " In-Arbeit" (line-end-position) t)
               )
          (let ((save-it (not (buffer-modified-p))))
            (delete-char -10)
            (if save-it
                (save-buffer)
              ))
        ))
  ))

(add-hook 'markdown-mode-hook
          (lambda ()
            (setq local-abbrev-table html-mode-abbrev-table)
            (setq fill-column 80)
            (when (and buffer-file-name
                       (string-match "/Projekte/website/" buffer-file-name))
              (if (< 0 (buffer-size))
                  (add-in-arbeit)

                ; initialize yas-mode before using yas, global-mode isn't enough
                (yas-minor-mode t)
                (yas-expand-snippet (yas-lookup-snippet "Skeleton for my web site"))
                )
              (add-hook 'kill-buffer-hook 'remove-in-arbeit t t))
              (add-hook 'before-save-hook 'update-mod-time t t)
           ))

Hilfsfunktion für neue Seite

Meist fällt mir der Dateiname für eine Seite immer beim Erstellen des Titels ein. Deshalb will ich als erstes eine leere Datei, die einfach eine Nummer trägt und die ich danach mit rename-file-and-buffer noch umbenennen kann.

(defun new-web-page ()
  "Creates a new page for my website"
  (interactive)

  (find-file
   (let ((dir (concat
               "~/Projekte/website/src/"
               (format-time-string "%Y-%m"))))
     (concat dir "/"
      (if (file-exists-p dir)
          (let ((files (directory-files dir nil "^[0-9]+.md" t)))
            (if files
                (number-to-string
                 (1+ (seq-max (seq-map 'string-to-number files))))
              "1")
            )
        (make-directory dir)
        "1")
      ".md")
     ))
  )

Aktualisierung der Bearbeitungszeit

Die Erstellungszeit und die letzte Bearbeitungszeit der Seiten anhand der Zeiten der Datei zu ermitteln, so wie es ikiwiki tut, hat sich als völlig nachteilig erwiesen. Deshalb habe ich zwei entsprechende Felder in meine yasnippet-Vorlage eingebaut, bei der der Erstellungszeitpunkt entsprechend gesetzt wird und für den Bearbeitungszeitpunkt habe ich folgenden before-save-hook geschrieben:

(defun update-mod-time ()
  "Update the `Last-modified-on` field used in my webpages"
  (save-excursion
    (goto-char 0)
    (when (search-forward "Last-modified-on: " nil t)
      (delete-region (point) (line-end-position))
      (insert (format-time-string "%Y-%m-%dT%H:%M%z"))
      )
    ))

Im Moment (Juli 2020) haben diese Felder noch keine Auswirkung und die Zeitangaben auf den Webseiten sind immer noch falsch, aber ich hoffe, irgendwann diese Angaben nutzen zu können.