Beiträge finden und bearbeiten ist eine Hälfte vom Alltag. Die andere ist alles rund um Medien, also Bilder, Anhänge, Shortcodes, dazu lokale Vorschau und der Deploy zum Hoster. Auch das geht ohne Wechsel ins Terminal oder den Dateimanager.

:Hugo media

Ohne Argument öffnet :Hugo media (<leader>hm) einen Picker mit allen Subkommandos, falls Du sie Dir nicht alle merken willst. Alternativ rufst Du das Subkommando direkt auf.

:Hugo media import

Kopiert eine Datei von Deinem Rechner in die Site. Zwei Schritte:

  1. Quell-Datei auswählen, der Picker startet in Deinem Home-Verzeichnis.
  2. Ziel-Verzeichnis innerhalb der Site auswählen.

Bei Namens-Kollisionen hängt das Plugin -2, -3 an. Die Datei wird nur kopiert, ein Link im Markdown landet damit nicht automatisch im Beitrag. Dafür ist :Hugo media insert da.

:Hugo media insert page

Braucht eine Markdown-Datei im Buffer. Picker zeigt alle Beiträge der Site, Auswahl fügt am Cursor [Title]({{< relref "path" >}}) ein. Hugo löst den Link beim Build auf und nimmt automatisch die richtige Sprache.

:Hugo media insert image

Braucht eine Markdown-Datei im Buffer. Picker zeigt alle Bilder aus dem aktuellen Bundle und aus static/. Auswahl fügt ![](path) am Cursor ein. Den Alt-Text trägst Du in die eckigen Klammern nach.

Braucht eine Markdown-Datei im Buffer. Wie insert image, aber für Nicht-Markdown-Dateien (PDFs, ZIPs, MP3s). Du wählst die Datei, gibst einen Link-Text an, das Plugin fügt [text](path) ein.

:Hugo media insert shortcode

Fügt einen Hugo-Shortcode mit allen Parametern am Cursor ein. Picker listet alle verfügbaren Shortcodes, also Deine eigenen aus layouts/shortcodes/, die vom Theme und die Hugo-Built-ins. Das Plugin liest das Shortcode-Template, findet die benannten Parameter und fügt sie leer vorbelegt ein.

Beispiel figure mit Parametern src, alt, caption:

{{< figure src="" alt="" caption="" >}}

Der Cursor landet im ersten leeren "", Du kannst direkt tippen. Bei paired Shortcodes wie {{< quote >}}…{{< /quote >}} springt der Cursor in den Body.

:Hugo media cover

Braucht irgendeine Datei aus dem Ziel-Bundle im Buffer. Setzt das Cover-Bild für das Bundle. Picker wählt das Bild (gleicher Pool wie bei insert image), das Plugin schreibt cover.image in alle Sprach-Geschwister.

Falls das Frontmatter schon ein cover.alt-Feld hat, wird zusätzlich nach Alt-Text gefragt, der landet nur in der aktuellen Sprache. Andere Cover-Felder wie relative, caption, hidden werden nicht angefasst, die gehören ins Archetype, wenn Du sie vorbelegen willst.

:Hugo media rename und :Hugo media delete

Benennen oder löschen eine Mediendatei direkt im Bundle. Markdown-Dateien sind nicht im Pool. rename kann nicht über Verzeichnisgrenzen gehen, die Datei bleibt also wo sie liegt.

Beide aktualisieren keine Markdown-Links, die auf die Datei zeigen. Nach einem Rename oder Delete läuft automatisch ein ripgrep-Scan über content/, der Dir sagt, wie viele Stellen den alten Namen noch nutzen. Auflösen ist dann Deine Aufgabe.

Vorschau

:Hugo preview

<leader>hp startet hugo server in einem Terminal-Split unten am Bildschirm und öffnet die aktuelle Seite im Browser. Drafts und zukünftig datierte Posts sind in der Vorschau enthalten.

Die URL wird aus dem Pfad des aktuellen Buffers abgeleitet:

  • content/_index.mdhttp://localhost:1313/
  • content/posts/2026/hello.mdhttp://localhost:1313/posts/2026/hello/
  • content/posts/2026/hello/index.de.mdhttp://localhost:1313/de/posts/2026/hello/

Buffer außerhalb von content/ fallen aufs Site-Root zurück. Bei ungewöhnlichen Permalink- oder Sprach-Configs kann die abgeleitete URL daneben liegen.

Wenn der Server schon läuft, öffnet ein erneutes :Hugo preview einfach die aktuelle Seite im Browser, ohne neu zu starten. Praktisch zum Springen zwischen Beiträgen.

:Hugo preview stop (<leader>hP) hält den Server an. Den Terminal-Split zu schließen tut es auch. Quittest Du neovim, geht der Server mit. Eine Vorschau zur Zeit.

:Hugo publish

<leader>h! führt deploy.sh im Site-Root aus. Output streamt in einen Terminal-Split unten. Wenn keine deploy.sh da ist, bricht das Plugin mit Fehler ab.

Warum ein Skript und kein eingebauter Build-und-Upload? Deployment sieht von Site zu Site komplett unterschiedlich aus, rsync auf einen VPS, sftp zu einem Shared Host, git push zu einem Anbieter der selbst baut, aws s3 sync, Netlify CLI, was auch immer. Das alles nativ abzudecken hieße endlose Konfig-Knöpfe. Build und Upload zusammen in deploy.sh geben Dir auch volle Kontrolle über die hugo-Flags (--minify, --gc, custom environments), ohne dass das Plugin pro Wunsch eine Option mitbringen muss.

Beispiel mit hugo --minify und rclone:

#!/usr/bin/env bash
set -euo pipefail
cd "$(dirname "$0")"

hugo --minify

rclone copy public/ <remote>:/<zielpfad>/ \
  --exclude ".DS_Store" \
  --progress

<remote> ist Dein vorher mit rclone config angelegtes Ziel, <zielpfad> das Verzeichnis beim Hoster. Skript ausführbar machen mit chmod +x deploy.sh, danach reicht ein <leader>h! zum Bauen und Hochladen.

Vor dem Ausführen fragt das Plugin sicherheitshalber nach und zeigt Skript-Pfad und Working Directory an. Default-Antwort ist Nein, Du musst Yes explizit wählen.

Wie es weitergeht

Damit hast Du den Werkzeugkasten von hugo-cms.nvim für eine einsprachige Site beisammen. Wie sich das mit Mehrsprachigkeit, Slugs pro Sprache und Cover-Alt-Texten verzahnt, ist Thema von einem eigenen Beitrag.