<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Emacs on Jan Iversen</title><link>https://jan-iversen.de/tags/emacs/</link><description>Recent content in Emacs on Jan Iversen</description><generator>Hugo</generator><language>de-de</language><lastBuildDate>Tue, 12 May 2026 11:27:51 +0200</lastBuildDate><atom:link href="https://jan-iversen.de/tags/emacs/index.xml" rel="self" type="application/rss+xml"/><item><title>Emails in Emacs (speziell Proton Mail)</title><link>https://jan-iversen.de/posts/emails-in-emacs-speziell-proton/</link><pubDate>Thu, 30 Apr 2026 00:00:00 +0000</pubDate><guid>https://jan-iversen.de/posts/emails-in-emacs-speziell-proton/</guid><description>&lt;p&gt;Ich hatte am 18. April kurz darüber geschrieben, dass ich meinen Proton Mail Account in Emacs eingerichtet habe. Da alles stabil läuft und ich sehr zufrieden damit bin, meine Emails in Emacs zu lesen, schreibe ich heute die Anleitung. Insbesondere in Verbindung mit Proton Mail gibt es doch ein oder zwei Dinge zu beachten.&lt;/p&gt;
&lt;h2 id="vorbemerkung-zu-proton-mail"&gt;Vorbemerkung zu Proton Mail&lt;/h2&gt;
&lt;p&gt;Wie beschrieben habe ich einen Email-Account bei Proton Mail. Im Gegensatz zu anderen Emailanbietern liegen die Emails verschlüsselt auf den Servern. Es gibt keinen Weg, per IMAP auf die Emails zuzugreifen. Dafür hat Proton die Mail Bridge entwickelt. Diese Mailbridge lädt die Emails herunter und entschlüsselt sie dann lokal. Emailprogramme können dann lokal per IMAP auf die Bridge zugreifen. Die Bridge bietet auch SMTP für den Versand an.&lt;/p&gt;</description><content:encoded><![CDATA[<p>Ich hatte am 18. April kurz darüber geschrieben, dass ich meinen Proton Mail Account in Emacs eingerichtet habe. Da alles stabil läuft und ich sehr zufrieden damit bin, meine Emails in Emacs zu lesen, schreibe ich heute die Anleitung. Insbesondere in Verbindung mit Proton Mail gibt es doch ein oder zwei Dinge zu beachten.</p>
<h2 id="vorbemerkung-zu-proton-mail">Vorbemerkung zu Proton Mail</h2>
<p>Wie beschrieben habe ich einen Email-Account bei Proton Mail. Im Gegensatz zu anderen Emailanbietern liegen die Emails verschlüsselt auf den Servern. Es gibt keinen Weg, per IMAP auf die Emails zuzugreifen. Dafür hat Proton die Mail Bridge entwickelt. Diese Mailbridge lädt die Emails herunter und entschlüsselt sie dann lokal. Emailprogramme können dann lokal per IMAP auf die Bridge zugreifen. Die Bridge bietet auch SMTP für den Versand an.</p>
<h2 id="vorbemerkung-zu-emacs">Vorbemerkung zu Emacs</h2>
<p>In Emacs habe ich mich für Mu4e entschieden. Mu4e nutzt den Index, den <a href="https://github.com/djcb/mu">Mu</a> aufgebaut hat. Es ist quasi dann eine lokale Suchmaschine für die eigenen Emails. Mu4e ist dann das Frontend in Emacs um die Suche zu nutzen und auf die Emails zuzugreifen. Wie ich bereits am 18. 04. geschrieben habe, ist das alles extrem schnell. Soweit ich es verstehe, kennt Mu keine Labels wie man es von anderen Emailprovidern ggf. kennt. Es arbeitet mit Ordnern. Also eher klassisch.</p>
<h2 id="einrichtung">Einrichtung</h2>
<h3 id="ordner-für-die-emails-anlegen">Ordner für die Emails anlegen</h3>
<p>Ich habe im Homeverzeichnis den Ordner <code>Mail</code> angelegt. Dieser Ordner wird später für die Speicherung der EMails verwendet.</p>
<h3 id="proton-mail-bridge">Proton Mail Bridge</h3>
<p>Wir müssen als erstes die Proton Mail Bridge installieren. In openSUSE Tumbleweed gibt es die Bridge nicht als natives Paket. Daher habe ich das Flatpak eingerichtet. Die Einrichtung erfolgt über einen Assistenten. Man muss sich lediglich in der Bridge einmal mit seinem Proton Mail Account anmelden. Dann beginnt die Bridge bereits die Emails herunterzuladen. Bei mir hat das sehr lange gedauert (ca. eine Stunde). Ich habe aber auch ca. 30.000 Emails in dem Postfach. Man kann aber mit der weiteren Einrichtung fortfahren und die Protonbridge im Hintergrund laufen lassen.</p>
<p><strong>Wichtig: Die Bridge sollte automatisch gestartet werden, wenn man sich am Computer anmeldet. Sonst bekommt man keine neuen Emails.</strong></p>
<p>Wir benötigen aus der Bridge noch das Zertifikat für ein weiteres Programm. Das Zertifikat kann in den „advanced settings“ unter „Export TLS certificates“ exportiert werden. Ich habe das Zertifikat in meinem Mail Ordner gespeichert. Es kann aber auch an einem anderen Ort abgelegt werden. Wir müssen den Ort für die weiteren Sync-Programme in der Konfiguration angeben. Die Daten für den Imap- und SMTP-Server sowie das Passwort benötigen wir ebenfalls gleich.</p>
<h3 id="pakete-für-sync-mu-etc-installieren">Pakete für Sync, Mu, etc installieren</h3>
<p>Damit wir die Emails im <code>Mail</code>-Ordner synchronisieren, verwenden wir <strong><strong><a href="https://isync.sourceforge.io/mbsync.html">mbsync</a></strong></strong>. Für den Versand verwenden wir <strong><strong><a href="https://marlam.de/msmtp/">msmtp</a></strong></strong>. Und dann benötigen wir noch <strong>Mu</strong> und <strong>Mu4e</strong>. Unter Tumbleweed sind alle Pakete im Repository vorhanden und können wie folgt installiert werden:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>sudo zypper in isync msmtp maildir-utils w3m mu4e
</span></span></code></pre></div><h3 id="mbsync-einrichten">mbsync einrichten</h3>
<p>mbsync erledigt für uns die Arbeit die Emails im Mail-Verzeichnis zu synchronisieren. Damit mbsync funktioniert, benötigt es die Informationen wie Zugangsdaten zu unserer Mail-Bridge (oder Imap), Zielordner, Zertifikat, etc. Für Proton habe ich bei mir folgende Konfiguration unter <code>~./mbsyncrc ~</code> angelegt.</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-cfg" data-lang="cfg"><span style="display:flex;"><span><span style="color:#75715e"># 1. DER ZUGANG (Dein Proton-Konto in der Bridge)</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">IMAPAccount protonmail</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">Host 127.0.0.1</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">Port 1143</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">User xxx@proton.me</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">Pass yyy</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">TLSType STARTTLS</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">TLSVersions +1.2</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">AuthMechs LOGIN</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># Hier sagen wir mbsync, dass es dem Zertifikat der Flatpak-Bridge vertrauen soll:</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">CertificateFile ~/Mail/cert.pem</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># 2. DER FERNE SPEICHER (Proton Server via Bridge)</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">IMAPStore protonmail-remote</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">Account protonmail</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># 3. DER LOKALE SPEICHER (Dein Rechner)</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">MaildirStore protonmail-local</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">Subfolders Verbatim</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">Path ~/Mail/</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">Inbox ~/Mail/INBOX</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># 4. DIE VERBINDUNG (Was soll synchronisiert werden?)</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">Channel protonmail</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">Far :protonmail-remote:</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">Near :protonmail-local:</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">Patterns INBOX Drafts Sent Trash Archive Spam</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">Create Near</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">SyncState *</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">Sync all</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">Expunge Near</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">Expunge Far</span>
</span></span></code></pre></div><p>Ich werde nicht sämtliche Parameter erklären. Wichtig sind aber die Patterns, Syncstate, Sync all und Expunge. Die Konfiguration sorgt so dafür, dass Emails beim Löschen in den Ordner Trash verschoben werden. Ich hatte zuerst mit direktem Löschen experimentiert. Das hat aber dann zu Dubletten geführt, da ich zwei Computer habe. Verschieben funktioniert robust. Die „gelöschten“ Emails liegen dann im Trash und werden dort von Proton nach dreißig Tagen gelöscht.</p>
<p>Sobald mbsync eingerichtet ist, können wir den ersten Sync testen. Dazu in der Shell den Befehl <code>mbsync -a</code> eingeben. Es sollten jetzt bereits die ersten Emails aus der Proton Bridge synchronisiert und im Mail-Verzeichnis gespeichert werden.</p>
<h3 id="mu-einrichten">Mu einrichten</h3>
<p>Wenn mbsync eingerichtet ist, müssen wir mu einmalig initialisieren. Mit diesem Befehl in der Shell führen wir die Initialisierung durch:</p>
<ul>
<li><code>mu init --maildir=~/Mail --my-address=jan.iversen@proton.me</code></li>
<li><code>mu index</code></li>
</ul>
<h3 id="automatisierung-des-sync-und-der-indizierung">Automatisierung des Sync und der Indizierung</h3>
<p>Damit wir einen Automatismus haben, können wir einfach einen systemd-Timer nutzen.</p>
<p>Falls wir noch kein Verzeichnis für eigene systemd-Dienste haben, legen wir es an: <code>mkdir -p ~/.config/systemd/user/</code></p>
<h3 id="mbsync-dot-service-anlegen">mbsync.service anlegen</h3>
<p>Hier legen wir den eigentlichen Dienst an. Der Dienst wird über einen Timer gestartet. Es wird der Sync durchgeführt. Anschließend indiziert mu die Emails.</p>
<p>Die Datei <code>~/.config/systemd/user/mbsync.service</code> erstellen</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-toml" data-lang="toml"><span style="display:flex;"><span>[<span style="color:#a6e22e">Unit</span>]
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">Description</span>=<span style="color:#a6e22e">Mail</span> <span style="color:#a6e22e">Sync</span>
</span></span><span style="display:flex;"><span>[<span style="color:#a6e22e">Service</span>]
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">Type</span>=<span style="color:#a6e22e">oneshot</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">ExecStart</span>=<span style="color:#960050;background-color:#1e0010">/</span><span style="color:#a6e22e">usr</span><span style="color:#960050;background-color:#1e0010">/</span><span style="color:#a6e22e">bin</span><span style="color:#960050;background-color:#1e0010">/</span><span style="color:#a6e22e">mbsync</span> <span style="color:#a6e22e">-a</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">ExecStartPost</span>=<span style="color:#a6e22e">-</span><span style="color:#960050;background-color:#1e0010">/</span><span style="color:#a6e22e">usr</span><span style="color:#960050;background-color:#1e0010">/</span><span style="color:#a6e22e">bin</span><span style="color:#960050;background-color:#1e0010">/</span><span style="color:#a6e22e">mu</span> <span style="color:#a6e22e">index</span>
</span></span></code></pre></div><h3 id="mbsync-dot-timer-anlegen">mbsync.timer anlegen</h3>
<p>Der Timer sorgt dafür, dass alle fünf Minuten eine Synchronisation stattfindet.</p>
<p>Die Datei <code>~/.config/systemd/user/mbsync.timer</code> erstellen.</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-toml" data-lang="toml"><span style="display:flex;"><span>[<span style="color:#a6e22e">Unit</span>]
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">Description</span>=<span style="color:#a6e22e">Mail</span> <span style="color:#a6e22e">Sync</span> <span style="color:#a6e22e">alle</span> <span style="color:#ae81ff">5</span> <span style="color:#a6e22e">Minuten</span>
</span></span><span style="display:flex;"><span>[<span style="color:#a6e22e">Timer</span>]
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">OnBootSec</span>=<span style="color:#ae81ff">2</span><span style="color:#a6e22e">m</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">OnUnitActiveSec</span>=<span style="color:#ae81ff">5</span><span style="color:#a6e22e">m</span>
</span></span><span style="display:flex;"><span>[<span style="color:#a6e22e">Install</span>]
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">WantedBy</span>=<span style="color:#a6e22e">timers</span>.<span style="color:#a6e22e">target</span>
</span></span></code></pre></div><h3 id="timer-aktivieren">Timer aktivieren</h3>
<p>Diesen Befehl einmalig ausführen. Systemd aktiviert dann den Timer sofort.</p>
<p><code>systemctl --user enable --now mbsync.timer</code></p>
<h3 id="emails-versenden">Emails versenden</h3>
<p>Wir wollen auch Emails versenden. Dafür verwenden wir msmtp. Das Programm sendet lokal die Mails an die Protonbridge. Und diese erledigt dann den Rest für uns. Hier benötigen wir ebenfalls eine Konfiguration. Die Konfiguration liegt unter <code>~/.msmtprc</code></p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-cfg" data-lang="cfg"><span style="display:flex;"><span><span style="color:#75715e"># Standardeinstellungen für alle Konten</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">defaults</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">auth           on</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">tls            on</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">tls_starttls   on</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># Hier nutzen wir wieder dein exportiertes Zertifikat</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">tls_trust_file ~/Mail/cert.pem</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">logfile        ~/.msmtp.log</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># Dein Proton-Konto via Bridge</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">account        protonmail</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">host           127.0.0.1</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">port           1025</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">from           &#34;xxx@proton.me&#34;</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">user           &#34;xxx@proton.me&#34;</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">passwordeval   &#34;echo &#39;yyy&#39;&#34;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># Dieses Konto als Standard setzen</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">account default : protonmail</span>
</span></span></code></pre></div><p>Auch msmtp benötigt den Ort des Zertifikats sowie die Zugangsdaten der Proton Mail Bridge.</p>
<h3 id="konfiguration-in-emacs">Konfiguration in Emacs</h3>
<p>Ich kopiere hier einfach meine Konfiguration. Das ist teilweise durch KI generiert oder übernommene Parameter aus anderen Blogs. Für mich funktioniert die Konfiguration so sehr gut.</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-emacs-lisp" data-lang="emacs-lisp"><span style="display:flex;"><span>  (use-package mu4e
</span></span><span style="display:flex;"><span>    :ensure <span style="color:#66d9ef">nil</span> <span style="color:#75715e">; Wir nutzen das Systempaket von openSUSE</span>
</span></span><span style="display:flex;"><span>    :config
</span></span><span style="display:flex;"><span>    <span style="color:#75715e">;; --- GRUNDLAGEN ---</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#75715e">;; Sagt Emacs, wo dein Haupt-Mail-Ordner liegt.</span>
</span></span><span style="display:flex;"><span>    (setq mu4e-maildir <span style="color:#e6db74">&#34;~/Mail&#34;</span>)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#75715e">;; Intervall für Emailcheck</span>
</span></span><span style="display:flex;"><span>    (setq mu4e-update-interval <span style="color:#ae81ff">300</span>)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#75715e">;; Sent-Mails löschen</span>
</span></span><span style="display:flex;"><span>    (setq mu4e-sent-messages-behavior <span style="color:#e6db74">&#39;delete</span>)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#75715e">;; --- DEINE IDENTITÄT ---</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    (setq user-mail-address <span style="color:#e6db74">&#34;jan.iversen@proton.me&#34;</span>
</span></span><span style="display:flex;"><span>          <span style="color:#a6e22e">user-full-name</span> <span style="color:#e6db74">&#34;Jan Iversen&#34;</span>)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#75715e">;; --- ORDNER-STRUKTUR (Proton-Standard) ---</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#75715e">;; Hier definieren wir, welche Ordner für was zuständig sind.</span>
</span></span><span style="display:flex;"><span>    <span style="color:#75715e">;; Das &#34;mu4e-maildir-shortcuts&#34; erlaubt dir, mit &#39;j&#39; und</span>
</span></span><span style="display:flex;"><span>    <span style="color:#75715e">;; dann dem Buchstaben (z.B. &#39;i&#39;) blitzschnell zu springen.</span>
</span></span><span style="display:flex;"><span>    (setq mu4e-maildir-shortcuts
</span></span><span style="display:flex;"><span>          <span style="color:#f92672">&#39;</span>((<span style="color:#e6db74">&#34;/INBOX&#34;</span>   <span style="color:#f92672">.</span> <span style="color:#e6db74">?i</span>)
</span></span><span style="display:flex;"><span>            (<span style="color:#e6db74">&#34;/Sent&#34;</span>    <span style="color:#f92672">.</span> <span style="color:#e6db74">?s</span>)
</span></span><span style="display:flex;"><span>            (<span style="color:#e6db74">&#34;/Trash&#34;</span>   <span style="color:#f92672">.</span> <span style="color:#e6db74">?t</span>)
</span></span><span style="display:flex;"><span>            (<span style="color:#e6db74">&#34;/Drafts&#34;</span>  <span style="color:#f92672">.</span> <span style="color:#e6db74">?d</span>)
</span></span><span style="display:flex;"><span>              (<span style="color:#e6db74">&#34;/Archive&#34;</span> <span style="color:#f92672">.</span> <span style="color:#e6db74">?a</span>)))
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#75715e">;; --- VERSAND (msmtp) ---</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#75715e">;; Hier sagen wir Emacs, dass es msmtp zum Verschicken nutzen soll.</span>
</span></span><span style="display:flex;"><span>    (setq send-mail-function <span style="color:#e6db74">&#39;sendmail-send-it</span>
</span></span><span style="display:flex;"><span>          sendmail-program <span style="color:#e6db74">&#34;/usr/bin/msmtp&#34;</span>
</span></span><span style="display:flex;"><span>          message-sendmail-f-is-evil <span style="color:#66d9ef">t</span>
</span></span><span style="display:flex;"><span>          message-sendmail-extra-arguments <span style="color:#f92672">&#39;</span>(<span style="color:#e6db74">&#34;--read-envelope-from&#34;</span>))
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#75715e">;; --- KOMFORT ---</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#75715e">;; Bilder direkt in der Mail anzeigen (schön auf deinem Ultrawide!)</span>
</span></span><span style="display:flex;"><span>    (setq mu4e-view-show-images <span style="color:#66d9ef">t</span>)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#75715e">;; HTML-Mails schick im Emacs-Puffer anzeigen</span>
</span></span><span style="display:flex;"><span>    (setq mu4e-html2text-command <span style="color:#e6db74">&#34;w3m -T text/html&#34;</span>))
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>  <span style="color:#75715e">;; Anzahl ungelesene Emails in Modeline anzeigen</span>
</span></span><span style="display:flex;"><span>  (mu4e-modeline-mode <span style="color:#ae81ff">1</span>)
</span></span><span style="display:flex;"><span>  (add-hook <span style="color:#e6db74">&#39;mu4e-index-updated-hook</span> <span style="color:#a6e22e">#&#39;force-mode-line-update</span>)
</span></span><span style="display:flex;"><span>  (setq mu4e-sent-folder   <span style="color:#e6db74">&#34;/Sent&#34;</span>
</span></span><span style="display:flex;"><span>      mu4e-drafts-folder <span style="color:#e6db74">&#34;/Drafts&#34;</span>
</span></span><span style="display:flex;"><span>      mu4e-trash-folder  <span style="color:#e6db74">&#34;/Trash&#34;</span>
</span></span><span style="display:flex;"><span>      mu4e-refile-folder <span style="color:#e6db74">&#34;/Archive&#34;</span>)
</span></span><span style="display:flex;"><span><span style="color:#75715e">;; Proton ist zickig beim Löschen</span>
</span></span><span style="display:flex;"><span>(setq mu4e-change-filenames-when-moving <span style="color:#66d9ef">t</span>)
</span></span><span style="display:flex;"><span>(setq mu4e-trash-without-flag <span style="color:#66d9ef">t</span>)
</span></span><span style="display:flex;"><span>(setq mu4e-headers-leave-behavior <span style="color:#e6db74">&#39;apply</span>)
</span></span></code></pre></div><p>Wichtig sind die letzten drei Parameter für Proton. Ich verstehe nicht genau, was eigentlich im Hintergrund geschieht. Aber wenn alles so konfiguriert ist, funktioniert das „Löschen“, also Verschieben einer Email in Trash, zuverlässig.</p>
<h2 id="abschluss">Abschluss</h2>
<p>Wenn alles eingerichtet ist, Emacs einmal neu starten. Über Alt+x mu4e starten und sich (hoffentlich) freuen, dass Emails im Dashboard angezeigt werden. Ab da verweise ich dann auf die Dokumentation für mu4e für die Bedienung. Am besten den Versand einer Email einmal testen und prüfen, ob alles korrekt ankommt. Bei mir hat es (bis auf das Löschen von Mails) sofort funktioniert. Und teste dann einmal die Suche, wenn alle Emails synchronisiert sind.</p>
<h2 id="fazit">Fazit</h2>
<p>Für mich funktioniert die Emailverwaltung in Emacs wunderbar. Es ist rasend schnell. HTML-Emails werden auch gut dargestellt und sind sogar entspannter zu lesen. Emacs bereinigt quasi die HTML-Mails und man kann sich auf den Inhalt konzentrieren. Wenn Emacs geschlossen ist, läuft dennoch der Sync und die Indizierung. Dadurch sind lokal alle Daten aktuell. Der einzige „Wermutstropfen“&hellip; es kann durch die Intervalle durchaus einige Minuten dauern, bis in Emacs eine Email angezeigt wird. Ich kann damit leben. Falls mal ein 2FA-Code per Email gesendet wird, den ich wirklich sofort benötige, schaue ich entweder auf das Smartphone oder stoße den Sync kurz manuell an. Aber wie oft kommt das wirklich vor. Mich entschleunigt das Lesen der Emails in Emacs sehr. Und ich kann jetzt Emails mit TODOs in orgmode verknüpfen.</p>
<figure>
    <img loading="lazy" src="/ox-hugo/560dc96fc2.png"/> 
</figure>

<h2 id="links">Links</h2>
<ul>
<li><a href="https://flathub.org/de/apps/ch.protonmail.protonmail-bridge">Proton Mail Bridge in Flathub</a></li>
<li><a href="https://www.djcbsoftware.nl/code/mu/">Mu</a></li>
<li><a href="https://www.djcbsoftware.nl/code/mu/mu4e.html">Mu4e</a></li>
<li><a href="https://isync.sourceforge.io/mbsync.html">mbsync</a></li>
<li><a href="https://marlam.de/msmtp/">msmtp</a></li>
</ul>
]]></content:encoded></item><item><title>Ich lese meine Emails in Emacs</title><link>https://jan-iversen.de/posts/ich-lese-meine-emails-in/</link><pubDate>Sat, 18 Apr 2026 00:00:00 +0000</pubDate><guid>https://jan-iversen.de/posts/ich-lese-meine-emails-in/</guid><description>&lt;p&gt;Gestern und heute habe ich mir in Emacs die Möglichkeit eingerichtet, meine Emails zu lesen. Da ich Proton Mail nutze, war es etwas komplizierter. Aber jetzt klappt alles. Alle Emails werden lokal synchronisiert. Das Programm mu führt eine Volltextindizierung durch. Und über das Paket mu4e kann ich dann in Emacs meine Mails lesen.&lt;/p&gt;
&lt;p&gt;Ich bin begeistert, wie schnell und gut alles funktioniert. Allein die Suche war die Zeit für die Einrichtung wert. Ich gebe einen Suchbegriff ein und sofort (und wirklich sofort) werden mir alle Emails mit einem Treffer angezeigt. Wenn ich da an mein Postfach in der Firma denke (Outlook&amp;hellip; &lt;strong&gt;&lt;strong&gt;hust&lt;/strong&gt;&lt;/strong&gt;)&amp;hellip; da bin ich froh, wenn mir in einem akzeptablen Zeitraum überhaupt eine Liste mit Ergebnissen angezeigt wird.&lt;/p&gt;</description><content:encoded><![CDATA[<p>Gestern und heute habe ich mir in Emacs die Möglichkeit eingerichtet, meine Emails zu lesen. Da ich Proton Mail nutze, war es etwas komplizierter. Aber jetzt klappt alles. Alle Emails werden lokal synchronisiert. Das Programm mu führt eine Volltextindizierung durch. Und über das Paket mu4e kann ich dann in Emacs meine Mails lesen.</p>
<p>Ich bin begeistert, wie schnell und gut alles funktioniert. Allein die Suche war die Zeit für die Einrichtung wert. Ich gebe einen Suchbegriff ein und sofort (und wirklich sofort) werden mir alle Emails mit einem Treffer angezeigt. Wenn ich da an mein Postfach in der Firma denke (Outlook&hellip; <strong><strong>hust</strong></strong>)&hellip; da bin ich froh, wenn mir in einem akzeptablen Zeitraum überhaupt eine Liste mit Ergebnissen angezeigt wird.</p>
<p>Ich werde es die nächsten Tage einfach benutzen. Wenn es weiterhin stabil, schnell und ohne Probleme funktioniert, dann schreibe ich eine kleine Anleitung. Eigentlich habe ich die Anleitung bereits in org-roam. Aber dann kann ich es auch hier im Blog beschreiben, was für die Einrichtung gemacht werden muss.</p>
<p>Aber hier ein Bild:</p>
<figure>
    <img loading="lazy" src="/ox-hugo/2026-04-18-20-07-33-screenshot.png"/> 
</figure>

]]></content:encoded></item><item><title>Org-Agenda als ICS-Datei</title><link>https://jan-iversen.de/posts/orgagenda-als-icsdatei/</link><pubDate>Sat, 11 Apr 2026 00:00:00 +0000</pubDate><guid>https://jan-iversen.de/posts/orgagenda-als-icsdatei/</guid><description>&lt;p&gt;Heute habe ich zusammen mit einer KI ein wenig gebastelt. Ich habe begonnen, meine Termine und Todos in einer Agenda-Datei in Emacs zu verwalten. Der berühmte Org-Mode wird jetzt genutzt. Mein Problem ist, dass es unterwegs auf dem Handy eher mühsam ist, eine org-Datei zu öffnen und zu lesen. Es gibt zwar das Programm orgzly-revived, welches org-Dateien einlesen und darstellen kann, aber ich werde mit dem Programm nicht so ganz warm.
Meine Idee: Ich möchte einfach aus der org-Agenda für die nächsten 360 Tage eine ics-Datei exportieren lassen. Diese Datei soll auf einen meiner V-Server hochgeladen werden. Auf dem Smartphone soll dann ein Programm regelmäßig die Datei abrufen und in der Kalender-App zur Verfügung stellen.
Dank KI war eine Funktion in Lisp recht zügig erstellt. Ich hatte noch mit einem HTML-Export experimentiert. Daher sind wohl einige Lisp-Funktionen unnötig. Aber vielleicht ist es für den ein oder anderen interessant.&lt;/p&gt;</description><content:encoded><![CDATA[<p>Heute habe ich zusammen mit einer KI ein wenig gebastelt. Ich habe begonnen, meine Termine und Todos in einer Agenda-Datei in Emacs zu verwalten. Der berühmte Org-Mode wird jetzt genutzt. Mein Problem ist, dass es unterwegs auf dem Handy eher mühsam ist, eine org-Datei zu öffnen und zu lesen. Es gibt zwar das Programm orgzly-revived, welches org-Dateien einlesen und darstellen kann, aber ich werde mit dem Programm nicht so ganz warm.
Meine Idee: Ich möchte einfach aus der org-Agenda für die nächsten 360 Tage eine ics-Datei exportieren lassen. Diese Datei soll auf einen meiner V-Server hochgeladen werden. Auf dem Smartphone soll dann ein Programm regelmäßig die Datei abrufen und in der Kalender-App zur Verfügung stellen.
Dank KI war eine Funktion in Lisp recht zügig erstellt. Ich hatte noch mit einem HTML-Export experimentiert. Daher sind wohl einige Lisp-Funktionen unnötig. Aber vielleicht ist es für den ein oder anderen interessant.</p>
<h2 id="schritt-1-erstelle-eine-ics-datei">Schritt 1 - Erstelle eine ICS-Datei</h2>
<p>Das ist die Methode, die jetzt in meiner Emacs-Konfiguration vorhanden ist. Das Umkopieren der Dateien in meinen org-Ordner habe ich auskommentiert. Scheinbar kommt mein Sync-Client für meine NAS damit nicht klar und landet in einem endlosen Sync-Prozess. Einiges an Code ist also überflüssig. Gemini hat den soweit generiert und er funktioniert.
Es werden in /tmp Dateien mit der exportieren HTML- und ICS-Agenda angelegt. Wie gesagt, die HTML-Agenda ist für mich jetzt überflüssig.</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-lisp" data-lang="lisp"><span style="display:flex;"><span>(defvar my/agenda-export-running <span style="color:#66d9ef">nil</span>
</span></span><span style="display:flex;"><span>  <span style="color:#e6db74">&#34;Verhindert, dass der Export mehrfach gleichzeitig startet.&#34;</span>)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>(with-eval-after-load <span style="color:#e6db74">&#39;org-agenda</span>
</span></span><span style="display:flex;"><span>  <span style="color:#75715e">;; subr-x stellt den &#39;dlet&#39; Befehl bereit</span>
</span></span><span style="display:flex;"><span>  (<span style="color:#a6e22e">require</span> <span style="color:#e6db74">&#39;subr-x</span>)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>  (defun my/export-and-push-agenda ()
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;Exportiert die Agenda NAS-schonend und lädt sie auf den v-Server hoch.&#34;</span>
</span></span><span style="display:flex;"><span>    (interactive)
</span></span><span style="display:flex;"><span>    (unless my/agenda-export-running
</span></span><span style="display:flex;"><span>      (<span style="color:#66d9ef">setq</span> my/agenda-export-running <span style="color:#66d9ef">t</span>)
</span></span><span style="display:flex;"><span>      (<span style="color:#66d9ef">unwind-protect</span>
</span></span><span style="display:flex;"><span>          (dlet ((org-agenda-span <span style="color:#ae81ff">365</span>)
</span></span><span style="display:flex;"><span>                 (org-agenda-sticky <span style="color:#66d9ef">nil</span>)
</span></span><span style="display:flex;"><span>                 (org-agenda-tags-column <span style="color:#ae81ff">-1</span>)
</span></span><span style="display:flex;"><span>                 (org-agenda-prefix-format <span style="color:#f92672">&#39;</span>((agenda <span style="color:#f92672">.</span> <span style="color:#e6db74">&#34; %-10:c &#34;</span>)))
</span></span><span style="display:flex;"><span>                 (org-icalendar-include-todo <span style="color:#e6db74">&#39;all</span>))
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>            (<span style="color:#66d9ef">let</span> ((tmp-html <span style="color:#e6db74">&#34;/tmp/agenda.html&#34;</span>)
</span></span><span style="display:flex;"><span>                  (tmp-ics <span style="color:#e6db74">&#34;/tmp/agenda.ics&#34;</span>)
</span></span><span style="display:flex;"><span>                  (final-html (expand-file-name <span style="color:#e6db74">&#34;~/org/agenda.html&#34;</span>))
</span></span><span style="display:flex;"><span>                  (final-ics (expand-file-name <span style="color:#e6db74">&#34;~/org/agenda.ics&#34;</span>)))
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>              <span style="color:#75715e">;; 1. Export in den Temp-Ordner (unsichtbar für das NAS)</span>
</span></span><span style="display:flex;"><span>              (save-window-excursion
</span></span><span style="display:flex;"><span>                (org-agenda-list)
</span></span><span style="display:flex;"><span>                (with-current-buffer <span style="color:#e6db74">&#34;*Org Agenda*&#34;</span>
</span></span><span style="display:flex;"><span>                  (<span style="color:#66d9ef">let</span> ((inhibit-read-only <span style="color:#66d9ef">t</span>))
</span></span><span style="display:flex;"><span>                    (delete-trailing-whitespace))
</span></span><span style="display:flex;"><span>                  (org-agenda-write tmp-html)
</span></span><span style="display:flex;"><span>                  (org-agenda-write tmp-ics)
</span></span><span style="display:flex;"><span>                  (kill-buffer <span style="color:#e6db74">&#34;*Org Agenda*&#34;</span>)))
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>              <span style="color:#75715e">;; 2. HTML-Design anpassen (Schriftgröße &amp; Umbruch)</span>
</span></span><span style="display:flex;"><span>              (with-current-buffer (find-file-noselect tmp-html)
</span></span><span style="display:flex;"><span>                (goto-char (point-min))
</span></span><span style="display:flex;"><span>                (when (search-forward <span style="color:#e6db74">&#34;&lt;/style&gt;&#34;</span> <span style="color:#66d9ef">nil</span> <span style="color:#66d9ef">t</span>)
</span></span><span style="display:flex;"><span>                  (goto-char (match-beginning <span style="color:#ae81ff">0</span>))
</span></span><span style="display:flex;"><span>                  (insert <span style="color:#e6db74">&#34;      body { font-size: 20pt; font-family: sans-serif; line-height: 1.4; padding: 20px; }\n&#34;</span>)
</span></span><span style="display:flex;"><span>                  (insert <span style="color:#e6db74">&#34;      pre { white-space: pre-wrap; }\n&#34;</span>))
</span></span><span style="display:flex;"><span>                (basic-save-buffer)
</span></span><span style="display:flex;"><span>                (kill-buffer))
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>              <span style="color:#75715e">;; 3. Dateien atomar an das NAS übergeben</span>
</span></span><span style="display:flex;"><span>              <span style="color:#75715e">;;(rename-file tmp-html final-html t)</span>
</span></span><span style="display:flex;"><span>              <span style="color:#75715e">;;(rename-file tmp-ics final-ics t)</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>              <span style="color:#75715e">;; 4. Geräuschloser Upload zum v-Server (jan-iversen.de)</span>
</span></span><span style="display:flex;"><span>              (<span style="color:#66d9ef">let</span> ((default-directory <span style="color:#e6db74">&#34;~/&#34;</span>))
</span></span><span style="display:flex;"><span>                (start-process <span style="color:#e6db74">&#34;agenda-upload&#34;</span> <span style="color:#66d9ef">nil</span>
</span></span><span style="display:flex;"><span>                               <span style="color:#e6db74">&#34;scp&#34;</span> tmp-ics <span style="color:#e6db74">&#34;xxx@yyy:/var/www/ics/agenda.ics&#34;</span>))
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>              (message <span style="color:#e6db74">&#34;Agenda-Export erfolgreich abgeschlossen.&#34;</span>)))
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>        <span style="color:#75715e">;; Diese Zeile MUSS innerhalb der unwind-protect Klammern stehen</span>
</span></span><span style="display:flex;"><span>        (<span style="color:#66d9ef">setq</span> my/agenda-export-running <span style="color:#66d9ef">nil</span>)))))
</span></span></code></pre></div><h2 id="schritt-2-vorbereiten-des-servers">Schritt 2 - Vorbereiten des Servers</h2>
<p>Ich habe auf meinen virtuellen Server bereits NGINX im Einsatz. Ich habe mir dort lediglich unter <code>/var/www</code> den Ordner ics angelegt. Danach habe ich die Rechte an dem Ordner auf meinen Benutzer geändert. So kann ich einfach per <code>scp</code> eine Datei auf den Server kopieren.
Eine neue Konfiguration für die Seite wurde angelegt. Und ich habe die Seite per htpasswd abgesichert. So kann niemand die Datei einfach herunterladen.</p>
<h2 id="schritt-3-dns-eintrag">Schritt 3 - DNS-Eintrag</h2>
<p>Bei Netcup habe ich einen neuen DNS-Eintrag gesetzt. Diesmal hat es nur wenige Minuten gedauert, bis der DNS-Eintrag auch überall bekannt war. Ich konnte also zügig weitermachen.</p>
<h2 id="schritt-4-erster-test">Schritt 4 - Erster Test</h2>
<p>In Emacs habe ich die neue Methode das erste Mal gestartet. Die ICS-Datei wurde korrekt auf den Server kopiert. Über die URL konnte ich im Browser die Passwortabfrage testen und danach die Datei erfolgreich herunterladen. Hat also wunderbar geklappt.</p>
<h2 id="schritt-5-einrichtung-auf-dem-handy">Schritt 5 - Einrichtung auf dem Handy</h2>
<p>Für Android gibt es das Programm ICSx⁵. Dieses Programm macht genau das, was ich wollte. Es lädt regelmäßig eine ICS-Datei herunter. In der Kalenderapp wird dann ein neuer Kalender angezeigt. Man kann noch Optionen wie Erinnerungszeiten setzen. Für mich reicht es aber, wenn ich die Einträge erst einmal im Kalender sehen kann.</p>
<h2 id="schritt-6-automatischer-hook-in-emacs">Schritt 6 - Automatischer Hook in Emacs</h2>
<p>Wenn ich etwas in Emacs an meiner Agenda ändere und speichere, soll ein Hook automatisch ausgeführt werden. Dieser Hook soll dann die Methode von oben aufrufen. Der ganze Vorgang geht erstaunlich schnell. Vielleicht liegt es daran, dass ich noch eine überschaubare Agenda habe.</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-lisp" data-lang="lisp"><span style="display:flex;"><span>(defun my/org-agenda-maybe-push ()
</span></span><span style="display:flex;"><span>  <span style="color:#e6db74">&#34;Prüft beim Speichern, ob es die Agenda-Datei ist und startet dann den Export.&#34;</span>
</span></span><span style="display:flex;"><span>  (when (and (buffer-file-name)
</span></span><span style="display:flex;"><span>             (<span style="color:#a6e22e">string=</span> (file-truename (buffer-file-name))
</span></span><span style="display:flex;"><span>                      (file-truename (expand-file-name <span style="color:#e6db74">&#34;~/org/Agenda.org&#34;</span>))))
</span></span><span style="display:flex;"><span>    <span style="color:#75715e">;; Wir stellen sicher, dass die Export-Funktion geladen ist</span>
</span></span><span style="display:flex;"><span>    (unless (<span style="color:#a6e22e">fboundp</span> <span style="color:#e6db74">&#39;my/export-and-push-agenda</span>)
</span></span><span style="display:flex;"><span>      (<span style="color:#a6e22e">require</span> <span style="color:#e6db74">&#39;org-agenda</span>))
</span></span><span style="display:flex;"><span>    (my/export-and-push-agenda)))
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">;; Den Hook global registrieren</span>
</span></span><span style="display:flex;"><span>(add-hook <span style="color:#e6db74">&#39;after-save-hook</span> <span style="color:#a6e22e">#&#39;</span>my/org-agenda-maybe-push)
</span></span></code></pre></div><h2 id="fazit">Fazit</h2>
<p>Um meine Termine unterwegs schnell einsehen zu können, reicht dieser Ansatz bisher. Es ist genügend automatisiert, damit ich mich auf den Prozess soweit verlassen kann. In meinem Backlog liegt aber als Todo bereits die Idee, eine richtige Caldav-Synchronisation mit Emacs gegen einen Caldav-Server einzurichten. Aber das ist noch Zukunftsmusik.</p>
]]></content:encoded></item><item><title>Emacs - Neuanfang</title><link>https://jan-iversen.de/posts/emacs-neuanfang/</link><pubDate>Sat, 04 Apr 2026 00:00:00 +0000</pubDate><guid>https://jan-iversen.de/posts/emacs-neuanfang/</guid><description>&lt;p&gt;Ich verwende Emacs. Seit längerem insbesondere Doom Emacs. Nun ist es Zeit für mich zu Vanilla Emacs zu wechseln. Dazu habe ich eine uralte Konfiguration ausgegraben und überarbeitet. Mittlerweile ist die Konfiguration soweit, dass ich damit arbeiten kann. Hier ein erster Einblick.&lt;/p&gt;
&lt;figure&gt;
&lt;img loading="lazy" src="https://jan-iversen.de/ox-hugo/2026-04-04-13-37-13-screenshot.png"/&gt;
&lt;/figure&gt;
&lt;p&gt;Folgende Pakete habe ich aktuell unter anderem in Verwendung:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Orgmode (klar, oder)&lt;/li&gt;
&lt;li&gt;org-roam (Aufbau eines Wissennetz)&lt;/li&gt;
&lt;li&gt;denote (für meine bisherigen Notizen)&lt;/li&gt;
&lt;li&gt;org-download für Screenshots&lt;/li&gt;
&lt;li&gt;org-olivetti zum entspannten Schreiben&lt;/li&gt;
&lt;li&gt;sudo-edit zum Bearbeiten von Systemdateien&lt;/li&gt;
&lt;li&gt;Marginalia zur Ergänzung des Minibuffers um weitere Informationen&lt;/li&gt;
&lt;li&gt;EF-Themes&lt;/li&gt;
&lt;li&gt;Vertico für eine bessere Suche&lt;/li&gt;
&lt;li&gt;Consult&lt;/li&gt;
&lt;li&gt;Which-Key für die Anzeige der Tastenkombinationen&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Und noch weitere Pakete&amp;hellip;.&lt;/p&gt;</description><content:encoded><![CDATA[<p>Ich verwende Emacs. Seit längerem insbesondere Doom Emacs. Nun ist es Zeit für mich zu Vanilla Emacs zu wechseln. Dazu habe ich eine uralte Konfiguration ausgegraben und überarbeitet. Mittlerweile ist die Konfiguration soweit, dass ich damit arbeiten kann. Hier ein erster Einblick.</p>
<figure>
    <img loading="lazy" src="/ox-hugo/2026-04-04-13-37-13-screenshot.png"/> 
</figure>

<p>Folgende Pakete habe ich aktuell unter anderem in Verwendung:</p>
<ul>
<li>Orgmode (klar, oder)</li>
<li>org-roam (Aufbau eines Wissennetz)</li>
<li>denote (für meine bisherigen Notizen)</li>
<li>org-download für Screenshots</li>
<li>org-olivetti zum entspannten Schreiben</li>
<li>sudo-edit zum Bearbeiten von Systemdateien</li>
<li>Marginalia zur Ergänzung des Minibuffers um weitere Informationen</li>
<li>EF-Themes</li>
<li>Vertico für eine bessere Suche</li>
<li>Consult</li>
<li>Which-Key für die Anzeige der Tastenkombinationen</li>
</ul>
<p>Und noch weitere Pakete&hellip;.</p>
<p>Die Konfiguration ist eine org-Datei, die ich mittels org-babel-tangle dann in die <code>init.el</code> ausgebe.</p>
<p>Was mir aktuell sehr gefällt, ist die Schriftart Iosevka für Codeblöcke und Iosevka Aile für normalen Text. Es sieht für mich sehr edel aus.</p>
]]></content:encoded></item><item><title>Org-Roam-UI… oder: Wie wurde die Notizvorschau repariert.</title><link>https://jan-iversen.de/posts/orgroamui-oder-wie-wurde-die/</link><pubDate>Wed, 24 Sep 2025 00:00:00 +0000</pubDate><guid>https://jan-iversen.de/posts/orgroamui-oder-wie-wurde-die/</guid><description>&lt;p&gt;Ich benutze Emacs. Unter anderem verwende ich es für die Planung, Vorbereitung und Nachbereitung meiner Pen&amp;amp;Paper-Runde “Fluch des Strahd”. Diese Kampagne hat eine hohe Komplexität. Es gibt viele Non-Player-Charakters (NPC), Orte, Ereignisse und Geheimnisse, die mit einander zusammenhängen. Das Buch der Kampagne ist leider nicht besonders gut strukturiert. Beim ersten Lesen ist mir bereits aufgefallen, dass sehr viele Informationen z. B. zu NPCs über das gesamte Buch verstreut sind. Als Spielleiter benötige ich aber alle Informationen gebündelt. Nur so kann ich gezielt Hinweise einstreuen, die wichtig sind. Meine Aufgabe ist es, die Gruppe grundsätzlich einen Rahmen zu geben, in dem sie sich bewegen können. Und sie sollten auch genug Informationen haben, damit sie Entscheidungen treffen können. Ich weiß, dass kann kontrovers gesehen werden (Railroad vs. Sandbox…), aber so ist mein Stil. Und bisher scheinen meine Mitspieler das zu mögen.&lt;/p&gt;</description><content:encoded><![CDATA[<p>Ich benutze Emacs. Unter anderem verwende ich es für die Planung, Vorbereitung und Nachbereitung meiner Pen&amp;Paper-Runde “Fluch des Strahd”. Diese Kampagne hat eine hohe Komplexität. Es gibt viele Non-Player-Charakters (NPC), Orte, Ereignisse und Geheimnisse, die mit einander zusammenhängen. Das Buch der Kampagne ist leider nicht besonders gut strukturiert. Beim ersten Lesen ist mir bereits aufgefallen, dass sehr viele Informationen z. B. zu NPCs über das gesamte Buch verstreut sind. Als Spielleiter benötige ich aber alle Informationen gebündelt. Nur so kann ich gezielt Hinweise einstreuen, die wichtig sind. Meine Aufgabe ist es, die Gruppe grundsätzlich einen Rahmen zu geben, in dem sie sich bewegen können. Und sie sollten auch genug Informationen haben, damit sie Entscheidungen treffen können. Ich weiß, dass kann kontrovers gesehen werden (Railroad vs. Sandbox…), aber so ist mein Stil. Und bisher scheinen meine Mitspieler das zu mögen.</p>
<p>Nun zu Emacs und meinen Vorbereitungen. Ich lese also die Kampagne und will für mich selber die Informationen festhalten. Außerdem möchte ich sie auch miteinder verknüpfen. Kurz geschrieben: ich will ein eigenes Wiki aufbauen. Dazu gibt es für Emacs das Paket Org-roam (<a href="https://www.orgroam.com/">Homepage</a>). Org-Roam erstellt Notizen mit Metainformationen. Zusätzlich legt es eine Datenbank an, in der Verlinkungen und einige weitere Meta-Informationen enthalten sind. Soweit, so gut.</p>
<p>Nun möchte ich aber für die Kampagne in Org-Roam einen eigenen Bereich mit Notizen haben. Es soll getrennt von anderen Notizen sein. Org-Roam kann das grundsätzlich. Es gibt aber ein zusätzliches Modul Org-Roam-UI. Dies kann die Vernetzungen im Browser abbilden. Es ist interaktiv, kann die Notizen anzeigen und sogar auf Emacs reagieren. Verwendet man, wie ich, einen zusätzliche, separierten Ort für die Notizen, funktioniert die Ansicht der Notizen nicht. Man kann zwar das Netzwerk im Browser sehen, aber der Inhalt einer Notiz wird mit einem HTTP-Fehler beantwortet. Der Fehler wird in diesem <a href="https://github.com/org-roam/org-roam-ui/issues/236">Github-Issue</a> beschrieben.</p>
<p>Ich bin kein Entwickler. Und kann die vermeintliche Lösung nicht bei mir umsetzen. Aber ich arbeite in einer Softwarefirma. Und ein sehr geschätzer Kollege ist Softwareentwickler und verwendet ebenfalls Emacs und kann sogar Lisp. Also habe ich ihn gefragt, ob er mir nicht helfen kann. Und er hat für mich folgende Lösung implementiert. Vielen lieben Dank an dieser Stelle für die Hilfe.</p>
<p>Vielleicht hilft sie jemand anderen.</p>
<p>In Doom-Emacs muss dieser Code in der <code>config.el</code> ergänzt werden. Danach dann den Sync in Doom ausführen und die Anzeige der Notizen funktioniert.</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-lisp" data-lang="lisp"><span style="display:flex;"><span>  <span style="color:#75715e">;; Fix für Org-Roam-UI</span>
</span></span><span style="display:flex;"><span>  (defvar jan/org-roam-ui--roam-directory <span style="color:#66d9ef">nil</span>)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>  (defun jan/org-roam-ui--advice-set-dir (fun <span style="color:#66d9ef">&amp;rest</span> args)
</span></span><span style="display:flex;"><span>    (<span style="color:#66d9ef">let</span> ((old-value org-roam-directory))
</span></span><span style="display:flex;"><span>      (<span style="color:#66d9ef">setq</span> org-roam-directory jan/org-roam-ui--roam-directory)
</span></span><span style="display:flex;"><span>      (prog1
</span></span><span style="display:flex;"><span>          (<span style="color:#a6e22e">apply</span> fun args)
</span></span><span style="display:flex;"><span>        (<span style="color:#66d9ef">setq</span> org-roam-directory old-value))))
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>  (advice-add <span style="color:#e6db74">&#39;httpd/node</span> <span style="color:#e6db74">:around</span> <span style="color:#e6db74">&#39;jan/org-roam-ui--advice-set-dir</span>)
</span></span><span style="display:flex;"><span>  (advice-add <span style="color:#e6db74">&#39;httpd/img</span> <span style="color:#e6db74">:around</span> <span style="color:#e6db74">&#39;jan/org-roam-ui--advice-set-dir</span>)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>  (defun jan/org-roam-ui--save-dir (<span style="color:#66d9ef">&amp;rest</span> args)
</span></span><span style="display:flex;"><span>  (when org-roam-ui-mode
</span></span><span style="display:flex;"><span>    (<span style="color:#66d9ef">setq</span> jan/org-roam-ui--roam-directory org-roam-directory)))
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>  (advice-add <span style="color:#e6db74">&#39;org-roam-ui-mode</span> <span style="color:#e6db74">:after</span> <span style="color:#e6db74">&#39;jan/org-roam-ui--save-dir</span>)
</span></span></code></pre></div><h2 id="beispielvorschau-im-browser--spoiler">Beispielvorschau im Browser (Spoiler)</h2>
<details class="spoiler-block">
<summary>Vorsicht: Spoiler! (Klicken zum Anzeigen)</summary>
<div class="spoiler-content">
<figure>
    <img loading="lazy" src="/ox-hugo/orgroamui.png"/> 
</figure>
</div>
</details>
]]></content:encoded></item><item><title>Warum benutze ich Emacs?</title><link>https://jan-iversen.de/posts/warum-benutze-ich-emacs/</link><pubDate>Mon, 22 Sep 2025 00:00:00 +0000</pubDate><guid>https://jan-iversen.de/posts/warum-benutze-ich-emacs/</guid><description>&lt;p&gt;Heute möchte ich ein wenig über Emacs schreiben. Für mich ist Emacs mittlerweile ein sehr wichtiges Werkzeug in meiner persönlichen aber auch beruflichen Organisation geworden. Im folgenden werde ich kurz beschreiben, wie ich als Nichtentwickler Emacs für mein Wissens- und Projektmanagement verwende? Wie nutze ich Emacs im Beruf und Privat?&lt;/p&gt;
&lt;p&gt;Aber vielleicht sollten wir zuerst klären: Was ist Emacs?&lt;/p&gt;
&lt;h2 id="was-ist-eigentlich-emacs"&gt;Was ist eigentlich Emacs?&lt;/h2&gt;
&lt;p&gt;Ich glaube, auf diese Frage gibt es eigentlich keine wirkliche Antwort. Schaue ich in die Wikipedia, dann wird Emacs als Texteditor definiert. Auch die Homepage des GNU Emacs-Projekt beschreibt Emacs als “freien, erweiterbaren und konfigurierbaren Texteditor und mehr”. Dieses “und mehr” ist der gemeine Teil der Beschreibung.
Nach meiner bisherigen Erfahrung mit Emacs würde ich folgende Definition nennen:
“Emacs ist eine vielfach verwendbare, anpassbare und freie Plattform mit diversen Textmanipulationsmöglichkeiten sowie Anwendungsprogrammen.” Klingt irgendwie etwas sperrig. Man kann in Emacs Softwareentwicklung durchführen, man kann damit Projektorganisation durchführen, man kann aber auch darin seine RSS-Feeds lesen, Spiele spielen, Musik hören, im Internet surfen,…. und man kann auch Texte darin schreiben.
Also bleiben wir vielleicht beim Texteditor… fürs Erste.&lt;/p&gt;</description><content:encoded><![CDATA[<p>Heute möchte ich ein wenig über Emacs schreiben. Für mich ist Emacs mittlerweile ein sehr wichtiges Werkzeug in meiner persönlichen aber auch beruflichen Organisation geworden. Im folgenden werde ich kurz beschreiben, wie ich als Nichtentwickler Emacs für mein Wissens- und Projektmanagement verwende? Wie nutze ich Emacs im Beruf und Privat?</p>
<p>Aber vielleicht sollten wir zuerst klären: Was ist Emacs?</p>
<h2 id="was-ist-eigentlich-emacs">Was ist eigentlich Emacs?</h2>
<p>Ich glaube, auf diese Frage gibt es eigentlich keine wirkliche Antwort. Schaue ich in die Wikipedia, dann wird Emacs als Texteditor definiert. Auch die Homepage des GNU Emacs-Projekt beschreibt Emacs als “freien, erweiterbaren und konfigurierbaren Texteditor und mehr”. Dieses “und mehr” ist der gemeine Teil der Beschreibung.
Nach meiner bisherigen Erfahrung mit Emacs würde ich folgende Definition nennen:
“Emacs ist eine vielfach verwendbare, anpassbare und freie Plattform mit diversen Textmanipulationsmöglichkeiten sowie Anwendungsprogrammen.” Klingt irgendwie etwas sperrig. Man kann in Emacs Softwareentwicklung durchführen, man kann damit Projektorganisation durchführen, man kann aber auch darin seine RSS-Feeds lesen, Spiele spielen, Musik hören, im Internet surfen,…. und man kann auch Texte darin schreiben.
Also bleiben wir vielleicht beim Texteditor… fürs Erste.</p>
<h2 id="wozu-verwende-ich-emacs">Wozu verwende ich Emacs?</h2>
<p>Ich bin kein Softwareentwickler. Zwar habe ich früher, also in meinen jungen Jahren, ein wenig Softwareentwicklung gelernt (und damit meine ich Turbo Pascal, etwas C und ganz wenig Assembler), aber ich bin es nicht geworden. Meine Arbeit und auch mein Privatleben besteht zum Großteil daraus, Projekte zu verwalten. Und was gehört dazu? Informationen niederschreiben, Informationen wieder finden, Informationen zu verändert. Also ich muss Wissen managen. Emacs ist das Werkzeug, dass mich dabei unterstützt.</p>
<h2 id="was-nutze-ich-in-emacs">Was nutze ich in Emacs?</h2>
<h3 id="welches-emacs-denn">Welches Emacs denn?</h3>
<p>Jetzt wird es wohl etwas technisch. Ich verwende nicht die Basisversion von GNU Emacs (im folgenden spreche ich von Vanilla). Bei mir läuft auf sämtlichen Computern Doom Emacs (<a href="https://github.com/doomemacs/doomemacs">Homepage von Doom</a>). Das ist eine angepasste, vorkonfigurierte Version von Emacs. Ich habe einige Gründe, warum ich Doom und nicht Vanilla Emacs nutze.</p>
<ol>
<li>
<p>Vanilla Emacs sorgt für Schmerzen in meiner linken Hand.
Das ist eine gar nicht so untypische Begleiterscheinung, wenn man Emacs verwendet. Die Tastenkombinationen werden über STRG bzw. Alt durchgeführt. Und es gibt sehr, sehr, sehr viele Tastenkombinationen. Ich habe schnell festgestellt, dass ich damit Probleme bekomme.
Doom konfiguriert Emacs so um, dass es ein modaler Editor ist. Emacs verhält sich dann ähnlich wie VIM. Ich kann viele Tastenkombinationen durch die Leertaste starten. Ich finde die Tastenkombinationen auch für mich logischer und einfacher. Und mir tut die Hand nicht weh. Also -&gt; Doom</p>
</li>
<li>
<p>Doom bringt alles wichtige gleich mit
Ich muss mich nicht mit der Konfiguration von Emacs zu sehr beschäftigen. Da kann sehr viel Zeit aufgebracht werden, bis Emacs so funktioniert, wie man es gerne haben möchte. Und ich bin kein Softwareentwickler. Die Konfiguration ist in Lisp geschrieben. Der Sprache, in der auch Emacs selbst entwickelt ist. Ich verstehe bedingt den Code. Aber wenn etwas nicht funktioniert, dann bin ich meistens aufgeschmissen.</p>
<p>&gt; Fun Fact: LLMs wie Gemini können bei Problemen mit Emacs so gut wie gar nicht helfen. Fast alle Antworten, die ich von Google Gemini erhalte, sind ausgedacht. Es ist erschreckend schlecht.</p>
</li>
<li>
<p>Doom sieht gut aus
Ja…. es ist ein Texteditor. Aber Doom sieht wirklich gut aus. Da musste ich nicht viel ändern. Außer ein anderes Themes und eine angepasste Schrift, passt es.</p>
</li>
</ol>
<p>Es gibt noch mehr Gründe für Doom Emacs. Aber die drei sind die wesentlichen.</p>
<h3 id="pakete-funktionen-komm-auf-den-punkt-dot">Pakete, Funktionen??? Komm auf den Punkt.</h3>
<h4 id="mein-fundament-orgmode">Mein Fundament: Orgmode</h4>
<p>Ja… was benutze ich nun. Der wichtigste Grund für mich…. Orgmode. Ganz klar. Der Orgmode ist genial. Ich kann gar nicht sagen, wie viel Spaß es mir macht, ein Meetingprotokoll im Orgmode zu schreiben. Oder z. B. diesen Blogeintrag… ich schreibe das gerade in Emacs im Orgmode. Und exportiere dann den Inhalt in Markdown. Das kann Emacs. Ich kann auch eine Latex- oder PDF-Datei erzeugen. Cool, oder? Ich verwende insbesondere beruflich auch viel die Agenda sowie die TODO-Verwaltung. Orgmode ist wie ein Werkzeugkasten mit wirklich sehr viel und gutem Werkzeug. Ich muss nur für mich selber entscheiden, was ich denn mit dem Werkzeugkasten genau machen möchte.</p>
<h4 id="notizenverwaltung-leicht-gemacht-denote">Notizenverwaltung leicht gemacht: Denote</h4>
<p>Denote (<a href="https://protesilaos.com/emacs/denote">Handbuch</a>) ist ein sehr bekanntes Paket von Protesilaos Stavrou (auch bekannt als Prot). Damit kann ich meine Notizen super verwalten. Dieser Blogeintrag ist auch eine Denote-Notiz. Ich mag den Ansatz, dass die gesamte Verwaltung über den Dateinamen in Verbindung des Frontmatter durchgeführt wird. Wirklich geniale Idee. Im Beruf stelle ich immer mehr auf Denote um. Projekte, Meetingmitschriften, normale Notizen verwalte ich nahezu komplett über Denote. Ich kann schnell etwas finden. Es ist einfach und simpel und dennoch mächtig.</p>
<h4 id="d-and-d-kampagnen-managen-org-roam">D&amp;D-Kampagnen managen: Org-Roam</h4>
<p>Jetzt wird es richtig abgefahren. Ich leite aktuell zwei Dungeons and Dragons-Runden. Dafür benötige ich auch viele Notizen. Und die Notizen müssen unter einander verlinkt sein. So gibt es z. B. NPCs, Orte, Ereignisse und Sessions. Wenn also in einer Session zwei NPCs eine Rolle spielen und diese sich an einem Ort befinden, verlinke ich von der Notiz für die Session zu den entsprechenden anderen Notizen. Org-Roam bietet dafür sehr gute Funtionen an. Ich kann auch z. B. in einer Notiz sehen, welche Backlinks es gibt. Also welche anderen Notizen verweisen auf diese Notiz. Mit einem Plugin kann ich dieses Wissensnetz visualisieren. Mir hilft es ungemein, so meine Kampagnen zu verwalten. Wobei… ich aktuell nur eine der beiden Kampagnen über Org-Roam und Emacs verwalte. Die andere läuft weiterhin in meinem Obsidian. Das ist der letzte Anwendungsfall bei mir für Obsidian (aber Obsidian ist auch genial… ich mag Emacs nur lieber).</p>
<h4 id="was-nutze-ich-sonst">Was nutze ich sonst?</h4>
<p>Nun… eigentlich nur eine Sache… alle Dateien, egal ob Denote oder Org-Roam oder normale Texte sind bei mir alle im Orgmode-Format abgelegt. Es sind also normale Textdateien, die mit Markupinformationen angereichert sind. So kann ich sie mir dann auch auf dem Smartphone zum Beispiel anschauen. Ein normaler Texteditor reicht schon, dann kann ich den Inhalt lesen.</p>
<h2 id="warum-emacs-und-nicht-programm-x-y-oder-z">Warum Emacs und nicht Programm X, Y oder Z?</h2>
<p>Ich habe schon kurz Obsidian erwähnt. Obsidian ist genial. Und ich habe es längere Zeit genutzt (ca. zwei Jahre). Mir hat in Obsidian eine gute Möglichkeit der Aufgabenverwaltung gefehlt. Und es gibt keinen wirklichen Kalender. Außerdem… Emacs ist schon wirklich nerdig. Es ist total anders als sämtliche anderen Programme. Das hat mich schon immer gereizt. Im Prinzip… der Orgmode war dann das endgültige Argument. Die Möglichkeit Textpassagen einfach ein- oder auzuklappen, ist genial. Todos sind einfach verwaltet. Für mich funktioniert Emacs einfach gut (unter Linux ist es super, Windows ist gut… könnte gerne etwas schneller sein).</p>
<h2 id="ist-emacs-etwas-für-dich">Ist Emacs etwas für dich?</h2>
<p>Emacs hat eine steile Lernkurve. Und ich werde niemals am Ende der Lernkurve ankommen. Aber ich glaube, Emacs belohnt mich auch. Ich lerne immer wieder eine neue Funktion dazu. Und freue mich über all die Kleinigkeiten, die einfach funktionieren und mir Arbeit abnehmen.
Also stell dir vielleicht diese beiden Fragen.</p>
<ol>
<li>Willst du etwas völlig Neues lernen?</li>
<li>Kannst und willst du dafür einiges an Zeit aufbringen?</li>
</ol>
<p>Wenn du beide Fragen mit Ja beantwortest… dann schau dir doch Emacs mal an. Prot hat einige gute Videos. Schau dir auch vielleicht ein Video zum Orgmode an. Und dann verspürst du auch den Drang ein Programm kennenzulernen, welches so anders ist.</p>
<figure>
    <img loading="lazy" src="/ox-hugo/emacs-blogeintrag.png"/> 
</figure>

]]></content:encoded></item></channel></rss>