Bei der Umstellung meines Blogs auf Hugo hatte ich mehrere Shell-Aliase in der .bashrc erstellt, um die Arbeit einfacher zu gestalten, wie z. B. eine tmux-Session im Verzeichnis der Website starten, nach Seitennamen, Kategorien und Tags zu suchen und einiges mehr. Es wurden immer mehr Aliase und es war nicht wirklich flexibel sondern nur richtig hacky.

Update
Update (2024-01-09): Ich habe eine ganz neue Version des Python-Scripts veröffentlicht, das deutlich mehr kann, siehe in diesem Blogbeitrag.

Spätestens seitdem ich auch mein neues Wiki mit Hugo nutze, funktionieren die vielen Aliase nicht mehr, denn ich bräuchte alles doppelt, um auch die Arbeit mit meinem Wiki damit bewerkstelligen zu können. Flexibel ist anders.

Und weil auch Vri in Zukunft in der Lage sein soll, sowohl im Wiki als auch im Blog Dinge zu tun, musste ich da was Schönes bauen. Denn meine vorherige Frickellösung könnte ich guten Gewissens niemandem zumuten.

Also habe ich heute Nacht ohne Ahnung und viel $Suchmaschine ein Python-Script erstellt, das die ganzen Shell-Aliase ersetzt und jetzt für beliebig viele Webseiten funktioniert. Und dabei habe ich sogar einen fiesen Bug in der Plasmashell gefunden.

Was kann das Script?

Mit dem neuen Script kann ich sehr einfach:

  • Eine Website generieren lassen.
  • Eine Website hochladen (mit rsync synchronisieren).
  • Die beiden oberen Dinge in einem Aufruf.
  • Eine Website lokal zur Verfügung stellen (hugo server).
  • Eine tmux-Session innerhalb des lokalen Verzeichnisses starten, um dort z. B. git zu verwenden.
  • (Nur im Blog) nach verwendeten Tags und nach Kategorien suchen. Dabei funktionieren sowohl einfache Strings als auch Reguläre Ausdrücke.
  • Mittels grep -r suchen.
  • Aktuelle Uhrzeit inklusive Datum und Zeitzone erhalten. Für das Front Matter (Metadaten einer einzelnen Seite).

Hier z. B. die Suche nach allen Seiten im Blog, in denen der String hugo vorkommt:

[…]
content/posts/2016/2016-12-02-hugo-kann-mehrsprachig.md,,Hugo kann mehrsprachig :),2016-12-02T13:29:05Z,0001-01-01T00:00:00Z,2016-12-02T13:29:05Z,false,/2016/12/hugo-kann-mehrsprachig/

content/posts/2015/2015-12-10-gpeasy-php-durch-hugo-statisches-html-ersetzt.md,,gpEasy (PHP) durch Hugo (statisches HTML) ersetzt,2015-12-10T13:05:11Z,0001-01-01T00:00:00Z,2015-12-10T13:05:11Z,false,/2015/12/gpeasy-php-durch-hugo-statisches-html-ersetzt/

Format: path,slug,title,date,expiryDate,publishDate,draft,permalink
Results for 'hugo': 27

Externe Konfiguration

Die Konfigurationsdatei mit den Einstellungen für beliebig viele Websites liegt in ~/.config/hugo-noms.conf.

Hilfe

Da das Script argparse verwendet, gibt es automatisch eine schöne Hilfe: 1

usage: hg.py [-h] [--site SITE_NAME | --time | --printconfig | --sites]
             [--cd | --build | --upload | --deploy | --tmux | --serve | --serve_light]
             [--searchpost SEARCHPOST | --searchgrep SEARCHGREP | --searchtag SEARCHTAG | --searchcat SEARCHCAT]

Handles hugo stuff.

optional arguments:
  -h, --help            show this help message and exit
  --site SITE_NAME      Name of the website to work on currently.
  --time                Copy current date and time to clipboard.
  --printconfig         Print the devices configuration.
  --sites               Print sites from configuration
  --cd                  Change directory to workdir of site.
  --build               Build a site.
  --upload              Build AND upload site to remote.
  --deploy              Deploy (build AND upload) a site.
  --tmux                Start the tmux session for --site.
  --serve               Serves site (full).
  --serve_light         Serves site (light).
  --searchpost SEARCHPOST
                        Find pages/posts containing search term in 'path, slug, title, date or permalink'.
                        Strings and Regular Expressions (regex) are allowed.
  --searchgrep SEARCHGREP
                        Find pages/posts containing search term in file content. Uses 'grep -r'. Strings and
                        Regular Expressions (regex) are allowed.
  --searchtag SEARCHTAG
                        Find tags containing search term. Strings and Regular Expressions (regex) are allowed.
  --searchcat SEARCHCAT
                        Find categories containing search term. Strings and Regular Expressions (regex) are
                        allowed.

Wo gibts das Script?

Vielleicht kann das ja noch jemand gebrauchen. Ich weiß aktuell nicht, wo ich es hinschubsen könnte, daher liegt es jetzt erst einmal in meinem Wiki im neuen Bereich Hugo, siehe hier.

Nur noch zwei Aliase

Da ich ein extrem fauler Mensch bin, habe ich aber später trotzdem noch zwei Aliase in der .bashrc definiert:

alias hgb='/pfad/zu/hg.py --site blog'
alias hgw='/pfad/zu/hg.py --site wiki'

Somit kann ich z. B.

hg.py --site blog --tmux

abkürzen mit

hgb --tmux

🙂

Bug in Plasmashell

Ruft man ein Script mit diesen beiden Zeilen auf oder führt es in iPython aus, dann hängt sich die Plasmashell entweder für ein paar Sekunden, lange oder komplett auf. Der String landet trotzdem nicht in der Zwischenablage obwohl xclip als auch xsel installiert sind.

import pyperclip
pyperclip.copy("text")

Ich wollte diese Funktion nutzen, um einen generierten String mit Datum, Uhrzeit und Zeitzone in die Zwischenablage zu kopieren, um diesen dann im Front Matter eines Blogbeitrags manuell über die Zwischenablage einfügen zu können. Stattdessen nutze ich jetzt os.system("date … | xsel …").


  1. schlechtes Englisch darf behalten werden 🙂 ↩︎