<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="../../assets/xml/rss.xsl" media="all"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Plain DrOps (Einträge über emacs)</title><link>https://plaindrops.de/</link><description></description><atom:link href="https://plaindrops.de/de/categories/emacs.xml" rel="self" type="application/rss+xml"></atom:link><language>de</language><copyright>Contents © 2026 &lt;a href="mailto:andy@plaindrops.de"&gt;Andy Drop&lt;/a&gt; </copyright><lastBuildDate>Wed, 12 Aug 2026 16:58:00 GMT</lastBuildDate><generator>Nikola (getnikola.com)</generator><docs>http://blogs.law.harvard.edu/tech/rss</docs><item><title> Was ich von einem Editor als Programmierer erwarte</title><link>https://plaindrops.de/de/blog/2026/programming/</link><dc:creator>Andy Drop</dc:creator><description>&lt;p&gt;
Ich habe in den letzten Jahren beruflich eigentlich nur mit einem Programm-Editor gearbeitet, nämlich dem VB6-Editor, aber meine Reise begann schon viel früher - in den frühen 90ern. Damals war alles noch ein bisschen einfacher - oder zumindest übersichtlicher.
&lt;/p&gt;
&lt;!-- TEASER_END --&gt;

&lt;p&gt;
Anfangs war es nämlich einfach ein normaler Text-Editor. Die erste Umgebung, die man so bezeichnen konnte, war das PDS 7.1, Microsofts Professional Development System, das - obwohl unter DOS lauffähig - bereits mit der Fensteraufteilung daherkam, die man bis heute aus den Microsoft-Umgebungen von VB bis Visual Studio kennt und die weithin übernommen wurden. In dieser Umgebung habe ich mich pudelwohl gefühlt.
&lt;/p&gt;

&lt;p&gt;
Und genau das versuche ich in diesem Artikel zu analysieren: Was war es eigentlich, das dazu geführt hat? Was erwarte ich von meinem Programmiereditor? Und wie richte ich mir Emacs so ein, dass es all diese Aufgaben nahtlos übernehmen kann?
&lt;/p&gt;
&lt;h2 class="collapsible" id="org0459df3"&gt;Fenster Handling&lt;/h2&gt;
&lt;div id="outline-container-org0459df3" class="outline-2 collapsme"&gt;
&lt;div class="outline-text-2" id="text-org0459df3"&gt;
&lt;p&gt;
In der Regel arbeite ich mit nur einem oder maximal zwei Fenstern für den Code - und das auch nur, wenn ich mehrere Code-Stellen parallel sehen muss. Dazu brauche ich ein Fenster, in dem ich den Projektbaum sehe und auf- und zuklappen kann. Ideal wäre noch ein Fenster, das mir einen Überblick über die einzelnen Funktionen und Klassen in der aktuell angezeigten Datei gibt, um schnell innerhalb der Datei navigieren zu können. Eine flexible Fensterverwaltung ist für mich essenziell, ohne dass ich mich in zu vielen Fenstern verliere. 
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 class="collapsible" id="org9ab81d6"&gt;Navigation&lt;/h2&gt;
&lt;div id="outline-container-org9ab81d6" class="outline-2 collapsme"&gt;
&lt;div class="outline-text-2" id="text-org9ab81d6"&gt;
&lt;p&gt;
Unter Navigation verstehe ich alles, was dafür sorgt, dass ich schnell an den Punkt im Code komme, an den ich gerade möchte, und dass ich keinen Code sehe, der mich gerade nicht interessiert. Daher betrachte ich auch Code-Folding für mich als Teil der Navigation.
&lt;/p&gt;

&lt;p&gt;
Ich möchte im Codebaum auf und ab springen können, sowie ebenenweise navigieren. Wenn ich in einer Funktion bin, möchte ich mit einem Tastendruck am Klassenkopf sein und diese Klasse einklappen können, wenn ich mich um eine andere Klasse kümmern möchte. Sprünge an Dateianfang und Dateiende sollten selbstverständlich sein. Schön wären Sprünge an die Stelle, an der eine Variable deklariert wird. Oder im Falle von Programmiersprachen mit Header-Dateien ein Hin- und Herspringen zwischen der Datei und ihrer Header-Datei oder auch zwischen der Datei und der dazugehörigen Testdatei - weil man ja doch ab und zu an Code arbeitet und parallel an den dazugehörigen Tests.
&lt;/p&gt;

&lt;p&gt;
Zusätzlich möchte ich im Dateibaum navigieren können, entweder indem ich mir die Datei direkt aufrufe oder durch sinnvolle Abkürzungen in passende Ordner springe.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 class="collapsible" id="org668fae1"&gt;Editieren&lt;/h2&gt;
&lt;div id="outline-container-org668fae1" class="outline-2 collapsme"&gt;
&lt;div class="outline-text-2" id="text-org668fae1"&gt;
&lt;p&gt;
Beim Editieren geht es mir um Kleinigkeiten, die den Arbeitsfluss erleichtern: Beim Schreiben einer öffnenden Klammer soll automatisch eine schließende gesetzt werden. Verschiedene Klammer-Ebenen sollten farblich unterschiedlich angezeigt werden, damit ich sie sofort optisch unterscheiden kann. Ich bin der Typ, der Tabs beim Editieren nutzt - aber Tabs im Code sind für andere einfach hässlich. Daher ist es wichtig, dass ich Tabs beim Editieren verwenden kann, diese aber beim Speichern automatisch in Leerzeichen umgewandelt werden. Besonders in Sprachen wie Python, wo die Einrückung eine semantische Bedeutung hat, muss das sauber funktionieren.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 class="collapsible" id="org1199db7"&gt;Autocompletion / Intelligente Unterstützung&lt;/h2&gt;
&lt;div id="outline-container-org1199db7" class="outline-2 collapsme"&gt;
&lt;div class="outline-text-2" id="text-org1199db7"&gt;
&lt;p&gt;
Autocompletion ist ein weiteres spannendes Thema. Was ich bisher immer benutzt habe, ist so etwas wie IntelliSense: Sobald ich den Beginn einer bereits benutzten Variable oder Funktion tippe, wird mir die vollständige Bezeichnung vorgeschlagen. Wichtig ist dabei, weder zu viele Möglichkeiten zur Auswahl zu haben, noch wichtige Dinge nicht auswählen zu können. Eine präzise und kontextbezogene Autocompletion unterstützt mich, ohne mich zu überfordern.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 class="collapsible" id="orgf5c9025"&gt;Snippets&lt;/h2&gt;
&lt;div id="outline-container-orgf5c9025" class="outline-2 collapsme"&gt;
&lt;div class="outline-text-2" id="text-orgf5c9025"&gt;
&lt;p&gt;
Hier lebe ich immer noch den Traum von einer universellen Snippet-Sprache. Ich möchte Textblöcke einfügen können, in denen ich Variablen einsetze, ähnlich wie es Cookie Cutter erlaubt. Außerdem möchte ich beim Schreiben durch eine zwei- oder dreibuchstabenkombination kurze Textschnipsel wie einen If-Block oder einen Select-Case-Block in Visual Basic oder vergleichbare Strukturen in anderen Sprachen erstellen können. Am liebsten hätten all diese Blöcke, die das Gleiche in verschiedenen Sprachen tun, die gleiche Abkürzung. Deswegen nenne ich das &lt;i&gt;Universal Snippets&lt;/i&gt; . Diese Flexibilität würde mir helfen, meine Arbeit zu beschleunigen, ohne mich um Sprachspezifika kümmern zu müssen.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 class="collapsible" id="org2eda847"&gt;Probelauf&lt;/h2&gt;
&lt;div id="outline-container-org2eda847" class="outline-2 collapsme"&gt;
&lt;div class="outline-text-2" id="text-org2eda847"&gt;
&lt;p&gt;
Der Probelauf ist eigentlich ganz simpel: Ich möchte das Programm aus meinem Editor heraus kompilieren und starten können - und damit herumspielen. Je nach Programmiersprache sind dazu noch einige Zwischenschritte nötig. Diese sollen unter der Haube automatisch erfolgen, damit ich mich auf das Wesentliche konzentrieren kann: das Testen und Ausprobieren meines Codes.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 class="collapsible" id="org50561b3"&gt;Debugging&lt;/h2&gt;
&lt;div id="outline-container-org50561b3" class="outline-2 collapsme"&gt;
&lt;div class="outline-text-2" id="text-org50561b3"&gt;
&lt;p&gt;
Beim Debugging habe ich schon so ziemlich alles erlebt. Die allerspartanischste Art zu debuggen ist es wohl, irgendwo im Programmcode ein &lt;code&gt;Beep&lt;/code&gt; einzufügen und zu schauen, ob es beim Programmlauf irgendwo piept. Konsolenausgaben, die ich direkt in den Code schreibe, sind nur ein wenig komfortabler. Aber was ich eigentlich möchte, ist es, sinnvoll im Code steppen zu können: &lt;i&gt;Step In&lt;/i&gt;, &lt;i&gt;Step Over&lt;/i&gt;, &lt;i&gt;Step Out&lt;/i&gt; . Dabei möchte ich mir den Status diverser Variablen anzeigen lassen können.
&lt;/p&gt;

&lt;p&gt;
Breakpoints zu setzen ist für mich essenziell - und zwar nicht nur an festen Stellen im Code, sondern auch abhängig von Ausdrücken. Zum Beispiel: Ein Breakpoint, wenn ein Ausdruck wahr ist, oder ein Breakpoint, wenn sich der Wert einer Variablen ändert. Ich möchte also nicht stoppen, wenn der Wert der Variablen &lt;code&gt;a&lt;/code&gt; gleich 7 ist, sondern immer dann, wenn er sich vom aktuellen Wert in irgendeinen anderen Wert verändert. Das ist etwas, das mein uraltes Visual Basic 6 konnte, aber in vielen modernen Entwicklungsumgebungen fehlt.
&lt;/p&gt;

&lt;p&gt;
Ebenso wichtig ist für mich, dass ich Fehlermeldungen des Compilers oder Parsers direkt sehe und durch einen Klick in die entsprechende Datei und Zeile springen kann.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 class="collapsible" id="orgf12cd43"&gt;Testen&lt;/h2&gt;
&lt;div id="outline-container-orgf12cd43" class="outline-2 collapsme"&gt;
&lt;div class="outline-text-2" id="text-orgf12cd43"&gt;
&lt;p&gt;
Beim Testen kommen ja mittlerweile fast alle modernen Programmiersprachen mit einem integrierten Testframework daher. Und ich finde, das sollte auch genutzt werden. Ich möchte diese Testframeworks direkt aus dem Editor heraus nutzen können, damit ich meine Tests schnell und effizient ausführen kann. Dabei wäre es schön, wenn ich nicht jedes Mal die gesamte Testsuite durchlaufen muss, sondern auch nur die aktuelle Datei und die dazugehörigen Tests ausführen könnte. So kann ich gezielt und ohne unnötigen Zeitverlust arbeiten.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 class="collapsible" id="org7e10834"&gt;Git Integration&lt;/h2&gt;
&lt;div id="outline-container-org7e10834" class="outline-2 collapsme"&gt;
&lt;div class="outline-text-2" id="text-org7e10834"&gt;
&lt;p&gt;
Für die Git-Integration gibt es &lt;i&gt;Magit&lt;/i&gt; - muss ich mehr sagen? Das Ding funktioniert einfach und ist rund. Einzig beim Diffing bin ich noch ein bisschen verwöhnt: Da nutze ich, egal auf welcher Maschine, die Software &lt;i&gt;Beyond Compare&lt;/i&gt;  von Scooter Software. Für mich das ultimative Diffing-Tool. Wenn ich etwas Vergleichbares in Emacs herstellen könnte, wäre das super. Das ist mir bisher aber noch nicht gelungen.
&lt;/p&gt;

&lt;p&gt;
Eine coole Funktion der Git-Integration wäre, wenn ich jedes Mal beim Speichern einen internen Git-Commit im Entwicklungsbranch erzeuge, in dem ich gerade arbeite. Wenn ich dann 27 Mal gesichert habe und der Tag zu Ende ist, und ich beschließe, diesen Stand zu behalten, kann ich diese Commits squashen und habe dann einen einzigen sauberen Commit.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 class="collapsible" id="orgf9f5a8e"&gt;Deployment&lt;/h2&gt;
&lt;div id="outline-container-orgf9f5a8e" class="outline-2 collapsme"&gt;
&lt;div class="outline-text-2" id="text-orgf9f5a8e"&gt;
&lt;p&gt;
Beim Deployment ist es ja so: Manchmal ist es Teil der Git-Integration durch irgendwelche Hooks wie bei GitHub. Oder es muss manuell gemacht werden. Wenn ich es manuell machen sollte, dann würde ich gerne Targets auswählen können. Und das Ganze sollte eng mit Git verzahnt sein.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 class="collapsible" id="org20ea2fd"&gt;Refactoring&lt;/h2&gt;
&lt;div id="outline-container-org20ea2fd" class="outline-2 collapsme"&gt;
&lt;div class="outline-text-2" id="text-org20ea2fd"&gt;
&lt;p&gt;
Refactoring habe ich hier nochmal getrennt aufgeführt. Obwohl ich es manchmal bereits direkt während des Code-Editierens mache, ist es sinnvoller, sich in regelmäßigen Abständen hinzusetzen und nichts anderes als Refactoring zu machen. Wenn ich dabei strukturell etwas umbauen möchte, dann ist das meiste Cut, Paste und Neuschreiben. Was mir dabei aber schon ungeheuer helfen würde, ist, wenn ich mir sicher sein könnte, dass ich Variablen- oder Klassennamen &lt;i&gt;projektübergreifend suchen und ersetzen&lt;/i&gt;  könnte - ohne dass mir das Projekt dabei um die Ohren fliegt.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 class="collapsible" id="orgf4cfc84"&gt;Mein Fazit&lt;/h2&gt;
&lt;div id="outline-container-orgf4cfc84" class="outline-2 collapsme"&gt;
&lt;div class="outline-text-2" id="text-orgf4cfc84"&gt;
&lt;p&gt;
Am Ende geht es nicht darum, den "perfekten" Editor zu finden - den gibt es nicht. Aber es geht darum, einen Editor zu haben, der mich unterstützt, statt mich zu behindern. Ein Tool, das mir hilft, schneller und effizienter zu arbeiten, ohne dass ich mich ständig mit ihm herumschlagen muss. Mit Emacs habe ich die Möglichkeit, mir genau diese Umgebung zu schaffen.
&lt;/p&gt;

&lt;p&gt;
Und ja, ich weiß, dass ich anspruchsvoll bin. Aber wenn ich schon acht Stunden am Tag vor einem Bildschirm verbringe, dann will ich wenigstens ein Werkzeug, das mich nicht in den Wahnsinn treibt.
&lt;/p&gt;

&lt;p&gt;
In weiteren Artikeln möchte ich mich mit jedem dieser Abschnitte einzeln befassen und konkret schauen, welche Lösungen Emacs dabei bietet, welche kleinen Funktionen ich mir vielleicht selbst schreiben kann oder wo sich noch tricksen lässt.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;</description><category>Carnival</category><category>emacs</category><category>progammieren</category><guid>https://plaindrops.de/de/blog/2026/programming/</guid><pubDate>Mon, 06 Jul 2026 16:00:00 GMT</pubDate></item><item><title>EmacsWiki Blog Karneval "Programmieren"</title><link>https://plaindrops.de/de/blog/2026/emacscarnival2607/</link><dc:creator>Andy Drop</dc:creator><description>&lt;p&gt;
Emacs ist nicht nur ein Texteditor - es ist eine vollwertige Programmierumgebung, die sich perfekt an deine Bedürfnisse anpassen lässt. Ob Python, C++, Lisp, Rust oder JavaScript: Mit der richtigen Konfiguration wird Emacs zur mächtigen IDE, die dir alles bietet, was du für effizientes Coden brauchst: Syntax-Highlighting, Debugging, Version Control, REPL-Integration und vieles mehr.
&lt;/p&gt;

&lt;!-- TEASER_END --&gt;

&lt;p&gt;
Doch wie nutzt du Emacs als Programmierwerkzeug? Welche Pakete, Einstellungen oder Workflows machen deinen Code-Alltag produktiver?
&lt;/p&gt;

&lt;p&gt;
Mögliche Themen – oder bringe deine eigenen Ideen ein:
&lt;/p&gt;

&lt;p&gt;
Sprach-spezifische Einrichtungen: Wie konfigurierst du Emacs für deine Lieblingssprache? Welche Pakete (z. B. lsp-mode, flycheck, company) sind für dich unverzichtbar?
&lt;/p&gt;

&lt;p&gt;
Debugging &amp;amp; Testing: Wie integrierst du Debugger (z. B. realgud, dap-mode) oder Test-Frameworks direkt in Emacs?
&lt;/p&gt;

&lt;p&gt;
Projektmanagement: Wie organisierst du große Codebasen in Emacs? Nutze du Tools wie projectile, magit oder forge für Git-Workflows?
&lt;/p&gt;

&lt;p&gt;
REPLs &amp;amp; Interaktive Entwicklung: Wie arbeitest du mit REPLs (z. B. für Python, Clojure oder Haskell) direkt in Emacs?
&lt;/p&gt;

&lt;p&gt;
Performance &amp;amp; Skalierbarkeit: Wie hältst du Emacs auch bei großen Projekten schnell und responsiv? Welche Optimierungen hast du vorgenommen?
&lt;/p&gt;
&lt;h2 class="collapsible" id="orgc3065da"&gt;Was ist eigentlich ein Blog-Karneval?&lt;/h2&gt;
&lt;div id="outline-container-orgc3065da" class="outline-2 collapsme"&gt;
&lt;div class="outline-text-2" id="text-orgc3065da"&gt;
&lt;p&gt;
&lt;small&gt;(Kopiert aus Christian Tietzes Einführungspost)&lt;/small&gt;
&lt;/p&gt;

&lt;p&gt;
Dies ist schon unser zweiter Emacs-Karneval, aber möglicherweise daher kennst du das Format noch nicht. Ein Blog-Karneval ist eine unterhaltsame Möglichkeit, eine Community durch gemeinsame Schreibimpulse zu verbinden – und sich über all die kreativen Interpretationen des Monatsthemas zu freuen. Ich habe oben ein paar Deutungen vorgeschlagen, aber dir fällt vielleicht etwas völlig anderes ein. Großartig, mach das! Genau das macht den Spaß aus.
&lt;/p&gt;

&lt;p&gt;
Für zukünftige Karnevals sieh dir die &lt;a href="https://www.emacswiki.org/emacs/Carnival"&gt;„Carnival“&lt;/a&gt;-Seite an.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 class="collapsible" id="orgd4018c0"&gt;Beiträge einreichen&lt;/h2&gt;
&lt;div id="outline-container-orgd4018c0" class="outline-2 collapsme"&gt;
&lt;div class="outline-text-2" id="text-orgd4018c0"&gt;
&lt;p&gt;
Schick mir deine Beiträge per &lt;a href="https://chaos.social/@spacecadet"&gt;DM&lt;/a&gt; / &lt;a href="mailto:carnival@plaindrops.de"&gt;E-Mail&lt;/a&gt;! Wenn ich irgendwo anders einen Beitrag finde, verlinke ich ihn hier ebenfalls. Ich sammle Einreichungen bis einschließlich 1. August (Mitteleuropäische Zeit), damit jede Zeitzone die Chance hatte, die Frist am 31. Juli einzuhalten :)
&lt;/p&gt;

&lt;p&gt;
Folgende Beiträge sind eingegangen:
&lt;/p&gt;

&lt;ul class="org-ul"&gt;
&lt;li&gt;&lt;a href="https://plaindrops.de/de/blog/2026/programming/"&gt;Was ich von einem Editor als Programmierer erwarte&lt;/a&gt; (Andy Drop)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ray-on-emacs.blogspot.com/2026/07/emacs-carnival-july-2026-programming.html"&gt;Emacs Carnival July 2026 – Programming&lt;/a&gt; (Raymond Zeitler)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://mike.hostetlerhome.com/how-emacs-uses-nix"&gt;How Emacs Uses Nix&lt;/a&gt; (Mike Hostetler)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://bonthron.com/"&gt;Emacs Carnival&lt;/a&gt; (Jason Bonthron)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.chiply.dev/post-july-emacs-carnival"&gt;A Tree and a Server Walk Into a Core…&lt;/a&gt; (Charlie Holland)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://sachachua.com/blog/2026/07/mon-flux-de-travail-de-programmation/"&gt;Mon flux de travail de programmation&lt;/a&gt; (Sacha Chua)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.winny.tech/posts/comfy_text_editing_line_spacing/"&gt;Comfy text editing with line spacing™&lt;/a&gt; (Winston Weinert)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://tusharhero.codeberg.page/guix-shell-in-emacs.html"&gt;Guix shell now inside Emacs!&lt;/a&gt; (tusharhero)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://cosmicflow.space/yes_i_am_hooked_to_metaprogramming_in_emacs/"&gt;Yes, I am hooked to Metaprogramming in Emacs&lt;/a&gt; (Dibyashanu Pati)&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;
Vielen Dank für eure Teilnahme  
&lt;/p&gt;

&lt;p&gt;
Im August wird Charlie Holland unser Gastgebersein,  mit dem Thema "&lt;a href="https://www.chiply.dev/post-august-emacs-carnival"&gt;The Search for Knowledge&lt;/a&gt;".
Auch du kannst Gastgeber eines zukünftigen Karnevals werden – keine Scheu :) 
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;</description><category>Carnival</category><category>emacs</category><category>progammieren</category><guid>https://plaindrops.de/de/blog/2026/emacscarnival2607/</guid><pubDate>Sun, 28 Jun 2026 12:00:00 GMT</pubDate></item><item><title>Meine 10 Jahre mit Emacs</title><link>https://plaindrops.de/de/blog/2025/tenyearsofemacs/</link><dc:creator>Andy Drop</dc:creator><description>&lt;p&gt;
Heute vor 10 Jahren hatte ich meinen ersten Kontakt mit Emacs, und dieser Tag hat auf jeden Fall die Art und Weise verändert, wie ich mit dem Computer arbeite, wenn nicht sogar mein Leben.
&lt;/p&gt;
&lt;!-- TEASER_END --&gt;

&lt;p&gt;
Der Tag ist mir deshalb so genau in Erinnerung, weil es der Tag nach dem allerersten Treffen des "Warpzonista Coding Clubs" war. Die Warpzone war zu der Zeit mein lokaler Hackerspace, und der Schwerpunkt lag dort damals auf Hardwarebasteleien. Ich hatte Lust mehr Leute kennenzulernen, die - wie ich - programmieren, und bei tollstem Sonnenschein, und leichter &lt;a href="https://www.youtube.com/watch?v=d_siG4dY6qs"&gt;Son Cubano&lt;/a&gt; Musik kam mir die Idee den Coding Club zu gründen. Das erste Treffen fand also am 27. Februar 2015 statt. Nach kurzem kennenlernen, kam das Gespräch dann zu dem Thema, das jeder Programmierer eines Tages für sich entscheidet. Die Wahl des persönlichen Editors.
&lt;/p&gt;

&lt;p&gt;
Da ich damals im wesentlichen beruflich programmiert habe, nutzte ich die integrierte Entwicklungsumgebung die Microsoft mit Visual Basic 6 ausliefert. Aber ich wollte gerne unter Linux mit Python programmieren, und war auf der Suche nach einem Editor. Außerdem hatte ich schon mal Vim ausprobiert, und irgendetwas daran lag mir nicht. Im Laufe des Abends habe ich dann &lt;a href="https://wwwtech.de/about"&gt;Christian Kruse&lt;/a&gt; kennengelernt, und wir haben uns darüber unterhalten, wie mein Kopf funktioniert, und dass ich im Prinzip in Hierarchien denke. Bäume sind mein Ding, Wenn ich Probleme behandele, backtracke mich durch verschiedene Lösungsansätze für Probleme, und Projekte teile ich in Aufgaben und Unteraufgaben auf.
&lt;/p&gt;

&lt;p&gt;
Daraufhin meinte er: "Dann wird Orgmode dein Ding sein", und gab mir eine kurze Übersicht auf seinem Laptop. Am nächsten Tag hab ich mir Emacs installiert, und ausprobiert, wie ich selber mit der Bedienung klarkomme. Um es abzukürzen: Orgmode war toll, aber ich kam überhaupt nicht mit der Bedienung klar. Christian hatte mich schon vorgewarnt, und ich wusste, dass ich etwas namens CUA haben möchte, und ein wenig googlen brachte mich in die ersten Config Dateien, die andere Menschen im Internet veröffentlicht hatten.
&lt;/p&gt;
&lt;h2 class="collapsible" id="org6c0f708"&gt;Die ersten Configs&lt;/h2&gt;
&lt;div id="outline-container-org6c0f708" class="outline-2 collapsme"&gt;
&lt;div class="outline-text-2" id="text-org6c0f708"&gt;
&lt;p&gt;
Ich hab dann ein paar Wochen lang einiges an Zeit investiert, um mir eine brauchbare Config zu erstellen. Ein paar Schnipsel hatte ich mir an verschiedenen Stellen im Netz zusammengeklaubt. CUA war dabei, YASnippet, und ich hatte herausgefunden, das ich mir eigene Keybindings machen kann. Dass ich die je nach Mode getrennt machen kann, wusste ich damals noch nicht, also alles schön global, und so dauerte es auch nicht lang bis zu meiner ersten Config Bankruptcy, einem Ausdruck, den ich damals noch nicht kannte. Die Ursache dafür war im Wesentlichen, dass meine von überall kopierten Config-Schnipsel oft eigene Namespaces mitbrachten, die ich überhaupt nicht als solche erkannte..
&lt;/p&gt;

&lt;p&gt;
Mein zweiter Config Ansatz war schon relativ nah an dem, was ich bis heute verwende. Ich hatte viel im Emacs Manual gelesen, und mitlerweile Keybindings mit den einzelnen Layern verstanden, und auch gemerkt, das es beim kopieren fremder Configs darauf ankommt die an das verwendete Package Tool anzupassen. Meine zweite Config war also viel geplanter.
&lt;/p&gt;

&lt;p&gt;
Ich verwendete eine minimale ini.cfg, die nichts weiter macht als drei andere configs zu laden
&lt;/p&gt;

&lt;ul class="org-ul"&gt;
&lt;li&gt;Eine Basis Config, bei denen ich für jedes installierte Paket die von mir bevorzugten Einstellungen mache (außer den Keybindigs)&lt;/li&gt;
&lt;li&gt;Eine Config die alle Keybindings enthält. Wenn ich die alle an einem Ort habe, dachte ich mir, passieren mir nicht so viele versehentliche Doppelbelegungen&lt;/li&gt;
&lt;li&gt;Eine Datei in der alle Anpassungen landen, die durch die benutzung des Config Tools in Emacs entstehen.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
Damit konnte ich für die nächsten 1-2 Jahre ganz gut arbeiten. Ich habe Emacs immer besser kennengelernt. Habe verstanden, wie CTRL-X und CTRL-C quasi als einstiegspunkte in die komplette Tastaturbelegung dienen, und das es dort Muster gibt, die wohlüberlegt sind, und sinnvoll, und nicht mit meinem Kopf funktionieren. Ein großer Schritt vorwärts war es als ich das Hydra Paket entdeckte.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 class="collapsible" id="org4c2d698"&gt;Ledger&lt;/h2&gt;
&lt;div id="outline-container-org4c2d698" class="outline-2 collapsme"&gt;
&lt;div class="outline-text-2" id="text-org4c2d698"&gt;
&lt;p&gt;
Eine der ersten Pakete, das einen Einfluss auf mein reales Leben hatte war der Ledger Mode. Ledger ist eine doppelte Buchführung in einer einzigen Textdatei. Und so begann ich recht schnell damit, meine Bankbuchungen in eine Datei zu schreiben. Mit ein wenig Nachdenken, liess sich auch das Briefumschlag-Budget-System meiner Oma implementieren, und das hat mir finanziell echt den Arsh gerettet, indem es mir den kompletten Durchblick über meine Finanzen geliefert hat
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 class="collapsible" id="org7c8d29e"&gt;Hydra&lt;/h2&gt;
&lt;div id="outline-container-org7c8d29e" class="outline-2 collapsme"&gt;
&lt;div class="outline-text-2" id="text-org7c8d29e"&gt;
&lt;p&gt;
Bis dahin ga es zwei Arten, wie ich eine Funktion aufgerufen habe: Entweder mit einem Keybinding, oder ich habe gegoogelt, wie eine Funktion heißt, und  habe sie dann via M-X mit ihrem Namen aufgerufen. Mit Hydra konnte ich mir plötzlich all die Funktionen, die ich für wichtig für mich hielt in Hydras ablegen, und sinnvoll gruppieren, und dann auch nur in den jeweiligen Modi zur Verfügung stellen. Ich bin bis heute ein großer Hydra-Fan. Nach und nach habe ich alle meine Hydras in einer Datei zusammengefasst. Diese bilden heute das Projekt Medusa und wurden als vierte Datei meiner Config hinzugefügt.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 class="collapsible" id="orgcdc3f3e"&gt;Helm&lt;/h2&gt;
&lt;div id="outline-container-orgcdc3f3e" class="outline-2 collapsme"&gt;
&lt;div class="outline-text-2" id="text-orgcdc3f3e"&gt;
&lt;p&gt;
Der nächste größere Schritt war Helm. Das aussuchen der verschiedenen möglichkeiten war vor allem bei M-x im Minibuffer eine Qual. Mit Helm gab es nun eine komfortable Ansicht. Diese konnte ich in einen eigenen Buffer packen, der entweder im aktuellen Fenster, oder in einem benachbarten Fenster dargestellt wurde.
Obwohl sich das nun alles schon deutlich besser anfühlte, hat mich ein &lt;a href="https://protesilaos.com/codelog/2020-01-07-emacs-display-buffer/"&gt;Video&lt;/a&gt; von Prot dazu gebracht mein bevorzugtes Window Handling noch einmal komplett zu durchdenken. Seither benutze ich statt Helm den VOCEM-Stack. 
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 class="collapsible" id="org9249820"&gt;VOCEM&lt;/h2&gt;
&lt;div id="outline-container-org9249820" class="outline-2 collapsme"&gt;
&lt;div class="outline-text-2" id="text-org9249820"&gt;
&lt;p&gt;
Vocem ist meine Abkürzung für *V*ertico, *O*rderless, *C*onsult, *E*mbark &amp;amp; *M*arginalia. Diese 5 Pakete gemeinsam zu benutzen hat sich bei vielen Emacs-Nutzern durchgesetzt, auch wenn man jedes davon für sich alleine benutzen kann
&lt;/p&gt;

&lt;dl class="org-dl"&gt;
&lt;dt&gt;Vertico&lt;/dt&gt;&lt;dd&gt;Vertico bietet eine performante und minimalistische vertikale Completion-UI, die auf dem standardmäßigen Completion-System basiert. Der Fokus von Vertico liegt darauf, eine UI bereitzustellen, die unter allen Umständen korrekt funktioniert. Es ist also der eigentliche Ersatz für Helm&lt;/dd&gt;
&lt;dt&gt;Orderless&lt;/dt&gt;&lt;dd&gt;Dieses Paket stellt einen orderlosen Completion-Stil bereit, der das Muster in durch Leerzeichen getrennte Komponenten unterteilt und Kandidaten findet, die alle Komponenten in beliebiger Reihenfolge enthalten. Orderless ist für mein Hirn unabdingbar, da ich oft denke "Der Befehl begann irgendwie mit list" dabei kam "list" nur irgendwo in der Mitte vor.&lt;/dd&gt;

&lt;dt&gt;Consult&lt;/dt&gt;&lt;dd&gt;Consult bietet Such- und Navigationsbefehle auf Basis der Emacs-Completion-Funktion completing-read. Die Completion ermöglicht es, schnell ein Element aus einer Liste von Kandidaten auszuwählen. Es verbindet also Quasi Vertico mit den gängigen Stellen, an denen man eine Completion haben möchte&lt;/dd&gt;

&lt;dt&gt;Embark&lt;/dt&gt;&lt;dd&gt;Embark erleichtert die Auswahl eines Befehls basierend auf dem, was sich in der Nähe des Cursors befindet – sowohl während einer Minibuffer-Completion-Sitzung (in einer Art, die Helm- oder Counsel-Nutzern vertraut ist) als auch in normalen Buffern. Embark ist so etwas wie ein frei konfigurierbares Kontext-Menü, und macht sich daher auch hervorragend auf der rechten Maustaste.&lt;/dd&gt;

&lt;dt&gt;Marginalia&lt;/dt&gt;&lt;dd&gt;Dieses Paket stellt marginalia-mode bereit, das Marginalien zu den Minibuffer-Completionen hinzufügt. Marginalien sind Markierungen oder Anmerkungen, die am Rand einer Buchseite platziert werden – oder in diesem Fall hilfreiche, farbige Anmerkungen am Rand des Minibuffers für deine Completion-Kandidaten. Marginalia liefert zu vielen Dingen, die nur mit einem Wort in einer Liste auftauchen etwas Kontext.&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 class="collapsible" id="orgd19d31e"&gt;Denote&lt;/h2&gt;
&lt;div id="outline-container-orgd19d31e" class="outline-2 collapsme"&gt;
&lt;div class="outline-text-2" id="text-orgd19d31e"&gt;
&lt;p&gt;
Denote hatte auf mich einen ebenso großen Einfluss wie Orgmode. Ich hatte schon vor Emacs ewig versucht all die losen Gedanken, Ideen, Quellen, die ich sonst im Kopf mit mir herumtrage, im Rechner zu organisieren. Ähnlich wie es Luhmann hier in der Nähe mit seinem legendären Zettelkasten gemacht hat. Entweder hatten die Ansätze für mich überhaupt nicht funktioniert, oder das Ablagesystem (das immer irgendeine Art externen Index auf das Wissen pflegte) hat nach einiger Zeit den Sync zwischen Wissen und Index verloren. Denote macht alle Metadaten dierekt an der Datei fest, und daher habe ich es selbst beim Teilen über alle meine Geräte noch nicht geschafft mein mentales Exoskelett aus dem Sync zu bringen. Ein größartiges gut durchdachtes Stück Software.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 class="collapsible" id="orgedf8047"&gt;Dinge die ich gewollt nicht mache&lt;/h2&gt;
&lt;div id="outline-container-orgedf8047" class="outline-2 collapsme"&gt;
&lt;div class="outline-text-2" id="text-orgedf8047"&gt;
&lt;ul class="org-ul"&gt;
&lt;li&gt;Ich habe zum Beispiel kein Paket-Tool im Einsatz, bei dem mir dir gesamte Konfiguration für das Paket an einer Stelle habe. Ich möchte bewusst alle Tastenkombinatinen für alle Pakete an einem Ort haben, und genau so ergeht es mir mit den Hydras. Diese bauen aufeinander auf, und es ist praktisch sie alle ohne sonstige Dinge in einer Datei zu haben.&lt;/li&gt;
&lt;li&gt;Zettelkasten. Ich kenne die Software nicht, habe aber eine stark negative Meinung zur digitalisierung des Luhmannschen Konzepts. Wir schreiben das Jahr 2025, der Hyperlink ist erfunden.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 class="collapsible" id="orgcb60525"&gt;Fazit&lt;/h2&gt;
&lt;div id="outline-container-orgcb60525" class="outline-2 collapsme"&gt;
&lt;div class="outline-text-2" id="text-orgcb60525"&gt;
&lt;p&gt;
Dieser Weg den ich in den 10 Jahren gegangen bin ist auf jeden Fall nur einer von tausenden möglichen Wegen. Jeder nutzt Emacs für andere Dinge, und jedes Hirn funktioniert anders. Ich kann auf jeden Fall empfehlen, die eigenen Ansprüche an die Emacs Umgebung in Ruhe zu durchdenken:
&lt;/p&gt;

&lt;ol class="org-ol"&gt;
&lt;li&gt;macht euch eine kurze Notiz, wenn sich etwas "falsch" für euch anfühlt. Beseitigt diese Dinge von Zeit zu Zeit.&lt;/li&gt;
&lt;li&gt;Versucht herauszufinden, mit welchen Dingen ihr in Emacs arbeiten wollt: Configs? Romantexte? Buchhaltungsdateien? Addressen? Mails? Webseiten? Zitate? Orte? diese Liste ließe sich beliebig fortsetzen&lt;/li&gt;
&lt;li&gt;Macht für jedes dieser Dinge eine Liste, welche Aktionen ihr gängigerweise auf diesen Dingen machen müsst. Z.B Weblinks: Im Browser aufrufen, im externen Browser aufrufen, speichern, im Blog publizieren, über alle Geräte synchronisieren, etc&lt;/li&gt;
&lt;li&gt;Baut daraus nach und nach euren persönlichen Workflow zusammen&lt;/li&gt;
&lt;li&gt;macht das nicht direkt am Rechner sondern schreibt diese Gedanken auf Papier, und bewahrt diesen Workflow als Schlachtplan für euch auf&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 class="collapsible" id="org9e19d3f"&gt;Danke&lt;/h2&gt;
&lt;div id="outline-container-org9e19d3f" class="outline-2 collapsme"&gt;
&lt;div class="outline-text-2" id="text-org9e19d3f"&gt;
&lt;p&gt;
Natürlich möchte ich vor allem &lt;a href="https://wwwtech.de/about"&gt;Christian Kruse&lt;/a&gt; danken, der mich vor 10 Jahren in die richtige Richtung geschubst hat. Aber auch ein paar anderen Menschen (und ich werde bestimmt am Ende ein paar vergessen haben). Als Bonus erfahrt ihr, wie ich diese Menschen in meinem Kopf nenne.
&lt;/p&gt;

&lt;ol class="org-ol"&gt;
&lt;li&gt;&lt;a href="https://sachachua.com/blog/"&gt;Sacha Chua&lt;/a&gt;, die "Mutter der Kompanie" für ihre unermüdliche Arbeit, die Emacs Community mit ihren Emacs News und der jährlichen Emacs Conference zusammen zu halten. Ausserdem dokumentiert sie immer wieder welche Probleme in der realen Welt, sie mit welchen Methoden löst, und warum.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://protesilaos.com/"&gt;Protesilaos "Prot" Stavrou&lt;/a&gt;, "Der Philosoph", für Denote und vor allem dafür, das er seine Gedanken rund um den Entwurf seiner Emacs Pakete öffentlich in seinem Blog darlegt. So lässt sich wunderbar nachvollziehen, ob seine Pakete zum persönlichen Arbeitsstil passen&lt;/li&gt;
&lt;li&gt;&lt;a href="https://karl-voit.at/"&gt;Karl Voit&lt;/a&gt;, "Mr. PIM" für seinen großartigen Orgmode Vortrag, und die Idee, das eigene Arbeiten mit den persönlichen Informationen einmal von Grund auf zu durchdenken. Ich bin dabei zu anderen Ergebnissen gekommen als er, aber ich habe dadurch gelernt, wie mein Hirn denkt, und dass es sinnvoll ist dieses "anders" zu nutzen.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://fosstodon.org/@daviwil"&gt;David Wilson&lt;/a&gt;,"Der Erklärbär" für seine unzähligen System Crafters Videos, die immer gut sind, wenn man mal etwas sehr genau erklärt haben will&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;
Viele andere, von denen man hier und da mal Ideen lesen kann, sind mir ebenso ans Herz gewachsen
Auf die nächsten 10 Jahre mit euch allen.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;</description><category>emacs</category><category>orgmode</category><guid>https://plaindrops.de/de/blog/2025/tenyearsofemacs/</guid><pubDate>Tue, 16 Dec 2025 08:13:00 GMT</pubDate></item><item><title>EmacsWiki Blog Karneval "Wartung"</title><link>https://plaindrops.de/de/blog/2025/emacscarnival/</link><dc:creator>Andy Drop</dc:creator><description>&lt;p&gt;
Im Oktober, wenn die Tage kürzer und die Luft frischer wird, verlagern viele Menschen ganz natürlich ihren Fokus von der kreativen Energie des Sommers hin zur ruhigeren Arbeit zu Hause. Es ist die Jahreszeit, in der man Regenrinnen reinigt, Ecken des Hauses gründlich putzt, die man lange ignoriert hat, und kleine Reparaturen erledigt, die den Alltag reibungslos am Laufen halten. So wie sich manche dem Haushalten und dem Herbstputz widmen, kümmern sich andere um digitale Pflege – Notizen durchsehen, alte Dateien ausmisten oder die Emacs-Konfiguration so feinjustieren, dass sie angenehm und verlässlich arbeitet. „Wartung“ – in welcher Bedeutung auch immer – ist das Thema des EmacsWiki Blog-Karnevals im Oktober.
&lt;/p&gt;
&lt;!-- TEASER_END --&gt;
&lt;h2 class="collapsible" id="org7a096ac"&gt;Was ist eigentlich ein Blog-Karneval?&lt;/h2&gt;
&lt;div id="outline-container-org7a096ac" class="outline-2 collapsme"&gt;
&lt;div class="outline-text-2" id="text-org7a096ac"&gt;
&lt;p&gt;
&lt;small&gt;(Kopiert aus Christian Tietzes Einführungspost)&lt;/small&gt;
&lt;/p&gt;

&lt;p&gt;
Dies ist unser erster Emacs-Karneval, daher kennst du das Format vielleicht noch nicht. Ein Blog-Karneval ist eine unterhaltsame Möglichkeit, eine Community durch gemeinsame Schreibimpulse zu verbinden – und sich über all die kreativen Interpretationen des Monatsthemas zu freuen. Ich habe oben ein paar Deutungen vorgeschlagen, aber dir fällt vielleicht etwas völlig anderes ein. Großartig, mach das! Genau das macht den Spaß aus.
&lt;/p&gt;

&lt;p&gt;
Für zukünftige Karnevals sieh dir die [[&lt;a href="https://www.emacswiki.org/emacs/Carnival"&gt;https://www.emacswiki.org/emacs/Carnival&lt;/a&gt;][„Carnival“-Seite
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 class="collapsible" id="org7f018c3"&gt;Beiträge einreichen&lt;/h2&gt;
&lt;div id="outline-container-org7f018c3" class="outline-2 collapsme"&gt;
&lt;div class="outline-text-2" id="text-org7f018c3"&gt;
&lt;p&gt;
Schick mir deine Beiträge per &lt;a href="https://masto.plaindrops.de/@spacecadet"&gt;DM&lt;/a&gt;/ &lt;a href="mailto:carnival@plaindrops.de"&gt;E-Mail&lt;/a&gt;! Wenn ich irgendwo anders einen Beitrag finde, verlinke ich ihn hier ebenfalls. Ich sammle Einreichungen bis einschließlich 1. November (Mitteleuropäische Zeit), damit jede Zeitzone die Chance hatte, die Frist am 30. Oktober einzuhalten :)
&lt;/p&gt;


&lt;p&gt;
Folgende Beiträge sind bis zum 30.10.2025 eingegangen:
&lt;/p&gt;


&lt;ul class="org-ul"&gt;
&lt;li&gt;&lt;a href="https://www.finaprosadigital.com/2025-10-12-maintenance-(mantenimiento).html"&gt;Maintenance (Mantenimiento)&lt;/a&gt; von Carlos Pajuelo&lt;/li&gt;
&lt;li&gt;&lt;a href="https://macadie.info/2025/10/08/emacs-carnival-maintenance/"&gt;Emacs Carnival: Maintenance&lt;/a&gt; von Eric MacAdie&lt;/li&gt;
&lt;li&gt;&lt;a href="https://mike.hostetlerhome.com/emacs-maintenance"&gt;Emacs Maintenance&lt;/a&gt; von Mike Hostetler&lt;/li&gt;
&lt;li&gt;&lt;a href="https://kyo.iroiro.party/en/posts/emacs-maintains-my-arch/"&gt;Using Emacs Org-mode As My Package Manager&lt;/a&gt; von Kana&lt;/li&gt;
&lt;li&gt;&lt;a href="https://christiantietze.de/posts/2025/10/sharpening-the-saw-with-emacs/"&gt;Sharpening the Saw with Emacs&lt;/a&gt; von Christian Tietze&lt;/li&gt;
&lt;li&gt;&lt;a href="https://curious.port111.com/2025/10/30/its-fall-time-to-clean.html"&gt;It's Fall. Time to clean up my emacs clutter.&lt;/a&gt; von George Jones&lt;/li&gt;
&lt;li&gt;&lt;a href="https://quijotelibre.net/blog/sharpening-axe-preparing-soil-harvest/"&gt;Sharpening the axe (or preparing the soil for the harvest)&lt;/a&gt; von Quijote Libre (auch auf &lt;a href="https://quijotelibre.net/blog/afilar-hacha-preparar-tierra-cosecha/"&gt;spanisch&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://commonplace.doubleloop.net/emacs-carnival-praise-the-patchers"&gt;Emacs Carnival: Praise the patchers&lt;/a&gt; von Neil&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
Vielen Dank an alle fürs Mitmachen!
&lt;/p&gt;

&lt;p&gt;
Im November ist  &lt;a href="https://donaldh.wtf/about/"&gt;Donald Hunter&lt;/a&gt; Gastgeber: „&lt;a href="https://donaldh.wtf/2025/10/emacs-carnival-2025-11-an-ode-to-org-babel/"&gt;An ode to org-babel&lt;/a&gt;“.
&lt;/p&gt;

&lt;p&gt;
Auch du kannst Gastgeber eines zukünftigen Karnevals werden – keine Scheu :)
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;</description><category>Carnival</category><category>emacs</category><category>Maintenance</category><guid>https://plaindrops.de/de/blog/2025/emacscarnival/</guid><pubDate>Mon, 29 Sep 2025 00:00:00 GMT</pubDate></item><item><title>Sammeln und kategorisieren von Weblinks in Orgmode</title><link>https://plaindrops.de/de/blog/2025/tagwood/</link><dc:creator>Andy Drop</dc:creator><description>&lt;p&gt;
Ob sie nun Lesezeichen, Favoriten oder Weblinks heissen. jeder von uns sammelt im Laufe der Zeit eine ganze Menge von ihnen an. Irgendwann kommt der Tag wo das ganze unübersichtlich wird. und aufgeräumt werden muss. Ich hab mir ein Python Tool dafyr geschrieben. 
&lt;/p&gt;
&lt;!-- TEASER_END --&gt;
&lt;h2 class="collapsible" id="org692eb17"&gt;Was bisher geschah&lt;/h2&gt;
&lt;div id="outline-container-org692eb17" class="outline-2 collapsme"&gt;
&lt;div class="outline-text-2" id="text-org692eb17"&gt;
&lt;p&gt;
Neu Weblinks entstehen bei mir immer aus meinem Browser heraus. Sei es der Firefox auf Desktop und Laptop oder auf meinem Handy. Ich könnte sie also einfach nur innerhalb von Firefox lassen. Damit kann ich sie zwischen den Browsern synchronisieren, und sie aufrufen. Was will man mehr?
Nun ich habe in diesem Blog z.B eine &lt;a href="https://plaindrops.de/page/links/"&gt;Seite mit Links&lt;/a&gt;, die ich gerne öffentlich teilen möchte. Wäre doch schön, wenn ich das nicht getrennt machen müsste. Und so hab ich mich schon vor Jahren entschlossen keine der eingebauten. oder online verfügbaren Tools zu nutzen, um Weblinks zu verwalten. Stattdessen speichere ich alle meine Weblinks als &lt;a href="https://plaindrops.de/blog/2020/why-I-like-plaintext/"&gt;Plaintext&lt;/a&gt; im Orgmode Format. Jeder Link ist dort eine Überschrift mit dem Titel der Seite die mit der entsprechenden Seite verlinkt ist.
Falls ich Lust habe, schreibe ich mir noch eine kleine Anmerkung dazu, oder füge ein Zitat aus der Seite ein.
Wenn ich auf Laptop oder Desktop arbeite erledigt das ein kleines AddOn (&lt;a href="https://github.com/Stebalien/org-capture-extension"&gt;Org Capture&lt;/a&gt;) welches neue Links an meine &lt;b&gt;Links.org&lt;/b&gt; Datei dranhängt. Dazu benutzt es das org-capture Protokoll das Emacs für Links zur Verfügung stellt.
Auf dem Handy funktioniert dieses AddOn leider nicht, daher teile ich die Webseite dort einfach mit der Orgzly-revived App. mit der sich Orgmode Dateien auf Android bearbeiten lassen. Der Link landet dann ebenfalls in der &lt;b&gt;Links.org&lt;/b&gt; Datei. Ich synchronisiere mein gesamtes &lt;i&gt;org&lt;/i&gt; Verzeichnii zwischen allen meinen Geräten.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 class="collapsible" id="orgfd9e3f1"&gt;Die Links.org Datei im Detail&lt;/h2&gt;
&lt;div id="outline-container-orgfd9e3f1" class="outline-2 collapsme"&gt;
&lt;div class="outline-text-2" id="text-orgfd9e3f1"&gt;
&lt;p&gt;
Zunächst einmal beginnt diese Datei mit einem Satz von Metadaten-Zeilen, die mein Webseiten Generator braucht, um aus der Datei direkt die Linkseite zu erstellen, die man hier im Blog sieht. Das sieht dann so aus
&lt;/p&gt;
&lt;pre class="example" id="orgf81467b"&gt;
#+BEGIN_COMMENT
.. title: Links
.. description: All the links I can recommend
.. slug: links
.. date: 2019-01-01 00:00:00 UTC+01:00
.. tags: links, emacs, orgmode, qutebrowser, plaintext, pim
.. previewimage: qrcodebus.png
#+END_COMMENT
#+OPTIONS: tags:nil
&lt;/pre&gt;
&lt;p&gt;
Die letzte Zeile sorgt dafür, dass die Tags, die ich den einzelnen Links gebe nicht nach HTML exportiert werden
&lt;/p&gt;

&lt;p&gt;
In dieser Datei sind alle neuen Links zunächst mal eine Überschrifft der Stufe 2. In der obesten Stufe 1 gibt es genau vier Überschriften:
&lt;/p&gt;
&lt;/div&gt;
&lt;h3 class="collapsible" id="org7a38a0a"&gt;1. Quicklinks&lt;/h3&gt;
&lt;div id="outline-container-org7a38a0a" class="outline-3 collapsme"&gt;
&lt;div class="outline-text-3" id="text-org7a38a0a"&gt;
&lt;p&gt;
Wie man sieht sind diese Links mit &lt;code&gt;:noexport:&lt;/code&gt; getaggt, und tauchen daher nicht in der öffentlichen Linkliste auf. Es sind Links. die ich selbst häüfig aufrufe. Deher stehen sie in der Datei ganz oben. und sind bereits sichtbar, wenn ich die Datei öffne
&lt;/p&gt;
&lt;pre class="example" id="orgffc8cb7"&gt;
* ------ Quick Links ----- :noexport:
 :PROPERTIES:
 :VISIBILITY: children
 :END:
&lt;/pre&gt;
&lt;table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides"&gt;


&lt;colgroup&gt;
&lt;col class="org-left"&gt;

&lt;col class="org-left"&gt;

&lt;col class="org-left"&gt;

&lt;col class="org-left"&gt;

&lt;col class="org-left"&gt;

&lt;col class="org-left"&gt;

&lt;col class="org-left"&gt;
&lt;/colgroup&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th scope="col" class="org-left"&gt;Social Media&lt;/th&gt;
&lt;th scope="col" class="org-left"&gt;Shopping&lt;/th&gt;
&lt;th scope="col" class="org-left"&gt;News&lt;/th&gt;
&lt;th scope="col" class="org-left"&gt;Finanzen&lt;/th&gt;
&lt;th scope="col" class="org-left"&gt;Haustechnik&lt;/th&gt;
&lt;th scope="col" class="org-left"&gt;Konten&lt;/th&gt;
&lt;th scope="col" class="org-left"&gt;Other&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td class="org-left"&gt;&lt;a href="https://chaos.social"&gt;Mastodon&lt;/a&gt;&lt;/td&gt;
&lt;td class="org-left"&gt;&lt;a href="https://idealo.de"&gt;Idealo&lt;/a&gt;&lt;/td&gt;
&lt;td class="org-left"&gt;&lt;a href="https://tagesschau.de"&gt;Tagesschau&lt;/a&gt;&lt;/td&gt;
&lt;td class="org-left"&gt;&lt;a href="https://www.volksbank-eg.de/services_cloud/portal/"&gt;Volksbank&lt;/a&gt;&lt;/td&gt;
&lt;td class="org-left"&gt;&lt;a href="http://fritz.box/"&gt;FritzBox&lt;/a&gt;&lt;/td&gt;
&lt;td class="org-left"&gt;&lt;a href="https://bibload.onleihe.de/"&gt;BibLoad&lt;/a&gt;&lt;/td&gt;
&lt;td class="org-left"&gt;&lt;a href="https://www.thingiverse.com/"&gt;Thingiverse&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class="org-left"&gt;&lt;a href="https://feddit.de"&gt;Feddit&lt;/a&gt;&lt;/td&gt;
&lt;td class="org-left"&gt;&lt;a href="https://www.amazon.de/"&gt;Amazon&lt;/a&gt;&lt;/td&gt;
&lt;td class="org-left"&gt;&lt;a href="https://www.theguardian.com/europe"&gt;The Guardian&lt;/a&gt;&lt;/td&gt;
&lt;td class="org-left"&gt;&lt;a href="https://banking.barclays.de/Login"&gt;Barclays&lt;/a&gt;&lt;/td&gt;
&lt;td class="org-left"&gt;&lt;a href="http://192.168.9.32"&gt;Wechselrichter&lt;/a&gt;&lt;/td&gt;
&lt;td class="org-left"&gt;&lt;a href="https://sb-warendorf.lmscloud.net/"&gt;Stadtbücherei&lt;/a&gt;&lt;/td&gt;
&lt;td class="org-left"&gt;&lt;a href="https://cults3d.com/de"&gt;Cults&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt;&lt;a href="https://www.ebay.de/"&gt;eBay&lt;/a&gt;&lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt;&lt;a href="https://www.schwaebisch-hall.de/meinkonto/login-mein-konto.html"&gt;Schw. Hall&lt;/a&gt;&lt;/td&gt;
&lt;td class="org-left"&gt;&lt;a href="http://192.168.9.38/"&gt;Stromzähler&lt;/a&gt;&lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class="org-left"&gt;&lt;a href="https://codeberg.org/user/login"&gt;Codeberg&lt;/a&gt;&lt;/td&gt;
&lt;td class="org-left"&gt;&lt;a href="https://www.otto.de/"&gt;Otto&lt;/a&gt;&lt;/td&gt;
&lt;td class="org-left"&gt;&lt;a href="https://kachelmannwetter.com/de/wetter/2814127-warendorf"&gt;Wetter WAF&lt;/a&gt;&lt;/td&gt;
&lt;td class="org-left"&gt;&lt;a href="https://www.paypal.com/signin"&gt;Paypal&lt;/a&gt;&lt;/td&gt;
&lt;td class="org-left"&gt;&lt;a href="http://192.168.9.25:8123"&gt;Home Assistant&lt;/a&gt;&lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt;&lt;a href="https://configure.zsa.io/my_layouts"&gt;Oryx&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class="org-left"&gt;&lt;a href="https://app.wallabag.it/"&gt;Wallabag&lt;/a&gt;&lt;/td&gt;
&lt;td class="org-left"&gt;&lt;a href="https://www.kaufland.de/"&gt;Kaufland&lt;/a&gt;&lt;/td&gt;
&lt;td class="org-left"&gt;&lt;a href="https://www.destatis.de/DE/Home/_inhalt.html"&gt;Stat. Bundesamt&lt;/a&gt;&lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt;&lt;a href="http://127.0.0.1:631/"&gt;CUPS&lt;/a&gt;&lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt;&lt;a href="https://www.dashboard-deutschland.de/"&gt;Dashboard DE&lt;/a&gt;&lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt;&lt;a href="http://127.0.0.1:8081/"&gt;Syncthing&lt;/a&gt;&lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class="org-left"&gt;&lt;a href="https://chat.openai.com"&gt;ChatGPT&lt;/a&gt;&lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt;&lt;a href="https://de.statista.com/"&gt;Statista&lt;/a&gt;&lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt;&lt;a href="http://localhost:8080/"&gt;Jenkins&lt;/a&gt;&lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class="org-left"&gt;Wiki&lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 class="collapsible" id="org98fbc80"&gt;2. Öffentliche Links&lt;/h3&gt;
&lt;div id="outline-container-org98fbc80" class="outline-3 collapsme"&gt;
&lt;div class="outline-text-3" id="text-org98fbc80"&gt;
&lt;p&gt;
Dies sind alle Links, die im Blog sichtbar sind. Aus den Hierarchie-Ebenen generiert mein Layout mit ein wenig CSS-Magie dann eine dynamische Liste. Mein Python Tool lässt alles bis zum Ende dieses Abschnitts in Ruhe.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 class="collapsible" id="orgd009797"&gt;3. Private Links&lt;/h3&gt;
&lt;div id="outline-container-orgd009797" class="outline-3 collapsme"&gt;
&lt;div class="outline-text-3" id="text-orgd009797"&gt;
&lt;p&gt;
Hier wird es nun interessant. Heute (2025-03-04) befinden sich hier etwa 450 Links. Diese Links sind mit bis zu vier Tags versehen, und wurden bisher einigermassen sortiert und kategoriesiert gehalten. Wobei man schon an das "einigermassen" nur niedrige Massstäbe anlegen darf. Ach wen lüg ich da an - es war ein Dumpster-Fire.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 class="collapsible" id="org461d405"&gt;4. Die INBOX&lt;/h3&gt;
&lt;div id="outline-container-org461d405" class="outline-3 collapsme"&gt;
&lt;div class="outline-text-3" id="text-org461d405"&gt;
&lt;p&gt;
Im Prinzip das gleiche Durcheinander, wie bei den privaten Links, nur, dass ich hier noch nicht einmal Tags vergeben habe.
&lt;/p&gt;

&lt;p&gt;
Es sind also die Abschnitte 3 und 4 um die sich mein Tool kümmern soll,
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 class="collapsible" id="org6a25f28"&gt;Was ist das Ziel des Tools?&lt;/h2&gt;
&lt;div id="outline-container-org6a25f28" class="outline-2 collapsme"&gt;
&lt;div class="outline-text-2" id="text-org6a25f28"&gt;
&lt;p&gt;
Es soll sich alle Weblinks aus den Abschnitten 3 und 4 schnappen, und sie anhand ihrer Tags in eine logische Baumstruktur bringen.
Die Fallstricke im letzten Satz befinden sich in den Wörtern &lt;b&gt;eine&lt;/b&gt; und &lt;b&gt;logische&lt;/b&gt;.
&lt;/p&gt;
&lt;/div&gt;
&lt;h3 class="collapsible" id="org7792176"&gt;Gibt es denn mehrere Bäume?&lt;/h3&gt;
&lt;div id="outline-container-org7792176" class="outline-3 collapsme"&gt;
&lt;div class="outline-text-3" id="text-org7792176"&gt;
&lt;p&gt;
Natürlich alles andere wära ja auch zu einfach. Tags sind ihrer Natur entsprechend alle gleichwertig. Sie enthalten keine Information über eine Hierarchie. Mal angenommen ich habe den folgenden Link mit den Tags a and b:
&lt;/p&gt;
&lt;pre class="example" id="orgba1a775"&gt;
* Link :a:b:
&lt;/pre&gt;

&lt;p&gt;
Dann kann ich daraus schon 2 mögliche Bäume bauen
&lt;/p&gt;
&lt;pre class="example" id="org25e5f6c"&gt;
├── a
│   └── b
│       └── Link
└── b
    └── a
        └── Link
&lt;/pre&gt;

&lt;p&gt;
Sobald ich 3 Tags habe. kann ich das zusätzlich Tag in 3 möglichen Ebenen einfügen - in jeden der beiden Bäume - und erhalte damit schon 6 mögliche Bäume.
die mathemathische Darstellung wäre &lt;code&gt;3!&lt;/code&gt; (sprich: 3 zur Fakultät) Falls jemand noch exponentielles Wachstum aus der Covid Zeit kennt. Das ist gegen fakutatives Wachstum auf Kindergarten Nivau. Nehmen wir 6 Tags sind wir bereits bei 720 möglichen Bäumen und nur 8 Tags reichen für 40320 Bäume.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 class="collapsible" id="orgaa006e1"&gt;Und was mach ich nun mit den ganzen Bäumen&lt;/h3&gt;
&lt;div id="outline-container-orgaa006e1" class="outline-3 collapsme"&gt;
&lt;div class="outline-text-3" id="text-orgaa006e1"&gt;
&lt;p&gt;
Der gängige Ansatz wäre, sie alle zu nutzen, Dann taucht ein Link mit 4 Tags eben 24 Mal in der Linkliste auf, aber es gibt eben auch 24 Wege ihn zu finden. Grob Überschlagen würde das bei meinen 450 Links etwa 3000 Links in der Ausgabedatei ergeben. Und das ist mir zu viel. Eine Menge der Pfade ergeben dabei nicht wirklich einen Sinn. Mal angenommen ich verlinke den Ort, an dem ich mein Auto zuletzt geparkt habe:
&lt;/p&gt;
&lt;pre class="example" id="org9b536e3"&gt;
* Auto :germany:munic:mainstreet:
&lt;/pre&gt;
&lt;p&gt;
Dann denke ich ja nicht "Hmm ich weiss noch, das ich in der Mainstreet geparkt habe, also zeig mir mal alle Länder in denen es Städte mit einer Mainstreet gibt. damit ich mir daraus die passende aussuchen kann"
&lt;/p&gt;

&lt;p&gt;
Also muss ich diejengen Bäume abholzen die keinen Sinn ergeben. Hier kommt das zweite entscheidende Wort hinzu. Es soll eine &lt;b&gt;logische&lt;/b&gt; Baumstruktur werden. Aber nicht erst seit Trump sollte klar sein. das es die seltsamsten Varianten von Logik gibt. und da ist alternative Logik noch nicht mal berücksichtigt.
Und bei der Suche noch etwas sinnvollen sind Computer nicht wirklich gut. Also behelfe ich mir mit einem anderen Kriterium, der Häufigkeit. Zählen können Computer nämlich recht gut.
&lt;/p&gt;

&lt;p&gt;
Wenn ich in meiner Datei 200 mal das Tag &lt;b&gt;emacs&lt;/b&gt; habe aber nur 100 mal das Tag &lt;b&gt;orgmode&lt;/b&gt;, Dann sieht der Baum so aus
&lt;/p&gt;
&lt;pre class="example" id="org5d076ac"&gt;
└── emacs
    └── orgmode
        └── Link
&lt;/pre&gt;

&lt;p&gt;
Das klappt dann schon ganz gut, Aber hin und wieder gibt es noch ein paar seltsame Hierarchien, besonders wenn es sich um Tags handelt die insgesamt selten genutzt werden. da kommt es dan auf eine Nutzung mehr oder weniger schon an, wenn es um die Sortierung geht
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 class="collapsible" id="org47f18b5"&gt;Und nun mogle ich auch noch&lt;/h3&gt;
&lt;div id="outline-container-org47f18b5" class="outline-3 collapsme"&gt;
&lt;div class="outline-text-3" id="text-org47f18b5"&gt;
&lt;p&gt;
In den meisten Fällen kommt es bei den seltenen Tags sowieso nicht darauf an. Aber wenn mir das mit großen (häufigen) Tags passiert ist dass schon ärgerlich. Und deshalb mogle ich ein wenig. Um mal be dem Auto Beispiel zu bleiben - das würde ich in Wirklichkeit so schreiben:
&lt;/p&gt;
&lt;pre class="example" id="org0ec4228"&gt;
* Auto :Germany:Munic:mainstreet:
&lt;/pre&gt;
&lt;p&gt;
Siehst du den Unterschied? Die ersten beiden Tags sind nun gross geschrieben. Für mein Tool ist das der Hinweis, dass Land und Ort hierarchisch wichtiger sind als die Straße. Es gibt damit immer noch 2 mögliche Bäume, aber 4 Bäume sind damit sicher verhindert. Ich kann damit nur ein zwingende Hierarchiestufe bestimmen, aber damit die Zweifelsfälle, die Auftreten könnten, ganz brauchbar abfangen. 
&lt;/p&gt;

&lt;p&gt;
Warum ist das gemogelt? Nun Tags tragen laut Lehrbuch nun mal keine hierarchische Information, und mein Pogrammiererherz fühlt sich auch ein wenig schmutzig an.
Nun aber zum technischen Teil, falls das jemand in einer anderen Sprache nachbauen möchte:
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 class="collapsible" id="org57e0576"&gt;Der Algorithmus&lt;/h2&gt;
&lt;div id="outline-container-org57e0576" class="outline-2 collapsme"&gt;
&lt;div class="outline-text-2" id="text-org57e0576"&gt;
&lt;ul class="org-ul"&gt;
&lt;li&gt;Als allerstes sammle ich alle Links ein. die ich verarbeiten möchte und werfe sie in ein Dictionary. Der Key ist dabei ein Hashwert des eigentlichen Links. Damit elimimiere ich bereits versehentliche doppelte Links.&lt;/li&gt;
&lt;li&gt;Dann werden alle Permutationen der Tags gebildet. Dabei werden alle Permutationen. die laut meiner gemogelter Tag-Hierarchie verboten sind ausgelassen.&lt;/li&gt;
&lt;li&gt;Die Liste aller Links werfe ich nun in die eigentlich Funktion. die den Baum aufbaut. Weil es bei Bäumen einfach unglaublich praktisch ist, ist diese Funktion rekursiv. Das bedeutet sie erledigt die Aufgaben für ihre Ebene der Baumstruktur, und ruft sich dann für die tieferliegende Hierarchieebene einfach sebst auf. Jede Rekursion braucht eine Abbruchbedingung. Hier ist das "Es gibt keine weiteren Links die noch nicht an einem Tag hängen".&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
Was passiert in dieser Funktion nun?
&lt;/p&gt;
&lt;ul class="org-ul"&gt;
&lt;li&gt;Der eigentlich Tag wird als Knoten in den Baum eingefügt.&lt;/li&gt;
&lt;li&gt;Zunächst einmal werden alle Links in den Baum gehängt, deren Tags exakt an diese Stelle im Baum passen, An Ebene 2 z.B also nur Links mit exakt 2 Tags die genau den Tags aus Ebene 1 und 2 entsprechen müssen&lt;/li&gt;
&lt;li&gt;Wenn das erledigt ist, und noch Links übrig sind geht es ins Voting.
&lt;ul class="org-ul"&gt;
&lt;li&gt;Hier geben alle Links Stimmen dafür ab welchen Tag sie in dieser Ebene des (Teil-)baums noch gebrauchen können.&lt;/li&gt;
&lt;li&gt;Dar Tag mit den meisten Stimmen gewinnt&lt;/li&gt;
&lt;li&gt;Es wird eine Liste aller Links erstellt. die für diesen Tag gevoted haben&lt;/li&gt;
&lt;li&gt;Mit dieser Liste und den Namen des Gewinner-Tags ruft sich die Funktion selbst auf, und baut somit den kompletten Baum unterhalb auf.&lt;/li&gt;
&lt;li&gt;Die Liste wird von den ursprüglichen Links abgezogen, und sollten dann noch Links übrig sein,  geht es in eine weitere Abstimmungsrunde. Andernfalls ist die Ebene fertig und die Funktion wird beendet&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
Am Ende wird der ganze Baum als Orgmode Struktur wieder in die Datei geschrieben und fertig ist die Laube.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 class="collapsible" id="org13835a4"&gt;Das Ergebnis&lt;/h2&gt;
&lt;div id="outline-container-org13835a4" class="outline-2 collapsme"&gt;
&lt;div class="outline-text-2" id="text-org13835a4"&gt;
&lt;p&gt;
In der Ausgabedatei sind die Tags nun hierarchisch und sortiert
&lt;/p&gt;
&lt;ul class="org-ul"&gt;
&lt;li&gt;Die häufigsten Tags kommen zuerst&lt;/li&gt;
&lt;li&gt;Bei gleicher Häufigkeit alphabetisch&lt;/li&gt;
&lt;li&gt;Alle Links sind im Baum&lt;/li&gt;
&lt;li&gt;kein Link ist doppelt&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
Und ich habe damit bereits einen Link-Baum mit dem ich gut arbeiten kann. Natürlich entsteht damit niemals der ideala Baum der mit dem übereinstimmt. wie ich das per Han sortieren würde aber ich bin schon recht nah dran. Vor allem gibt es in dem Algoritmus noch reichlich Potential für Optimierungen.
&lt;/p&gt;
&lt;/div&gt;
&lt;h3 class="collapsible" id="org003bda5"&gt;Das Voting tweaken&lt;/h3&gt;
&lt;div id="outline-container-org003bda5" class="outline-3 collapsme"&gt;
&lt;div class="outline-text-3" id="text-org003bda5"&gt;
&lt;p&gt;
Wer sich für Wahlrecht interresiert wird festgesteiit haben, dass es dutzende, wenn nicht hunderte verschiedene Wahlverfahren gibt. die  alle zu leicht unterschiedlichen Ergebnissen führen,und auf verschiedene Ziele (feste Sitzanzahl, Gewichtung nach Aktienanteil, Minimierung der zu reitenden Tage bis zur Hauptstadt) optimiert sind.
&lt;/p&gt;

&lt;p&gt;
Das gilt auch für das Voting in diesem Algorithmus. Aktuell voted bei mir jeder Link für jeden Tag der ihm irgendwie nutzt mit einer Stimme. Ebenso wären aber auch andere Varianten denkbar:
&lt;/p&gt;

&lt;ul class="org-ul"&gt;
&lt;li&gt;Wenn ein Link 3 mögliche Bäume für Tag A sieht und 2 mögliche für Tag B, könnte er mit 3 bzw. 2 Stimmen für die jeweiligen Tags stimmen.&lt;/li&gt;
&lt;li&gt;Die Votes könnten danach gewichtet werden ob ein Tag unmittelbar in dieser Ebene nötig ist, oder möglicherweise erst tiefer im Baum.&lt;/li&gt;
&lt;li&gt;etc.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
Alles in allem bin ich mit dem Ergebniss aber schon sehr zufrieden. Mein Repo mit dem aktuellen Stand des Tools befindet sich &lt;a href="https://codeberg.org/dr.ops/tagwood"&gt;hier&lt;/a&gt;   
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;</description><category>emacs</category><category>orgmode</category><category>python</category><guid>https://plaindrops.de/de/blog/2025/tagwood/</guid><pubDate>Tue, 04 Mar 2025 09:00:00 GMT</pubDate></item><item><title>Lisp Code schreiben mit ChatGPT</title><link>https://plaindrops.de/de/blog/2024/CodingLispWithChatGPT/</link><dc:creator>Andy Drop</dc:creator><description>&lt;p&gt;
Ich bin gerade dabei, den Besuch eines großen Festivals zu organisieren, mehr als 175 Bands spielen an 4 Tagen und etwa einem Dutzend verschiedener Orte, die quer über die Stadt verteilt sind. Das ganze ist eine logistische Herausforderung. Welche Bands möchte ich sehen und spielen die mit ausreichend zeitlichem Abstand um von Location A in Halle B zu kommen?
&lt;/p&gt;
&lt;!-- TEASER_END --&gt;

&lt;p&gt;
Also habe ich mir von der Seite des Veranstalters alle Daten in ein Org Dokument kopiert und mir eine Übersicht generieren lassen. in Org sieht das so aus:
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;* Bands  
   :PROPERTIES:
   :COLUMNS: %ITEM %Ort %Datum %Uhrzeit %Link1 %Link2 %Genre
   :END:

#+BEGIN: columnview :id local :skip-empty-rows t
| ITEM             | Ort                     |      Datum | Uhrzeit | Link1 | Link2 | Genre |
|------------------+-------------------------+------------+---------+-------+-------+-------|
| 12 Illusions (D) | Moritzbastei            | 17.05.2024 |   21.00 | [[https://www.youtube.com/watch?v=MOPkUBQbCzA][Song1]] | [[https://www.youtube.com/watch?v=_CUVz7neaRM][Song2]] | o     |
| A Projection (S) | Volkspalast Kuppelhalle | 19.05.2024 |   17.40 | [[https://www.youtube.com/watch?v=W7CndC-CQrw][Song1]] | [[https://www.youtube.com/watch?v=D1C5KpP3Hic][Song2]] | o     |
#+END:   

** 12 Illusions (D)
   :PROPERTIES:
   :Datum: 17.05.2024
   :Uhrzeit: 21.00
   :Ort: Moritzbastei
   :Adresse: Universitätsstraße 9
   :Strassenbahn: 9 (Roßplatz)
   :Strassenbahn+: 8, 9, 11, 14, 16, 32 (Wilhelm-Leuschner-Platz)
   :Bus: 412 (Roßplatz)
   :Bus+: N8 (Roßplatz)
   :S-Bahn: S1, S2, S3, S4, S5, S5X, S6 (Wilhelm-Leuscher-Platz)
   :Link1: [[https://www.youtube.com/watch?v=MOPkUBQbCzA][Song1]]
   :Link2: [[https://www.youtube.com/watch?v=_CUVz7neaRM][Song2]]
   :Genre: o 
   :END:

12 ILLUSIONS is a newly-launched German dark electro pop band.

** A Projection (S)
   :PROPERTIES:
   :Datum: 19.05.2024
   :Uhrzeit: 17.40
   :Ort: Volkspalast Kuppelhalle
   :Adresse: Messehalle 16 / Puschstraße 10
   :Strassenbahn: 16 (An den Tierkliniken)
   :Link1: [[https://www.youtube.com/watch?v=W7CndC-CQrw][Song1]]
   :Link2: [[https://www.youtube.com/watch?v=D1C5KpP3Hic][Song2]]
   :Genre: o 
   :END: 
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;
Die Tabelle oben ist meine Übersicht, und da dort mittlerweile knapp 200 Zeilen drin sind ist es mühsam, wenn man zu einer dieser Bands in den Teil mit den Details scrollen möchte. Wenn der Veranstalter die nicht schon alphabetisch aufgelistet hätte wäre es kaum machbar.
&lt;/p&gt;

&lt;p&gt;
Die Übersichtstabelle generiert sich, dank Org Magie, immer neu wenn ich C-c C-c auf der Kopfzeile drücke. Die erste Spalte ist also buchstäblich identisch mit der Überschrift der einzelnen Bands, Wenn diese Überschrift einen Link auf sich selbst enthalten würde, dann wären in der ersten Spalte lauter Links auf die Details zu den Bands.
&lt;/p&gt;

&lt;p&gt;
Um diese Links zu erzeugen muss ich mehrere Funktionen aufrufen:
&lt;/p&gt;
&lt;ul class="org-ul"&gt;
&lt;li&gt;Erzeugen einer Custom ID für die Überschrift&lt;/li&gt;
&lt;li&gt;Kopieren dieser ID ins Clipboard&lt;/li&gt;
&lt;li&gt;Markieren der Überschrift&lt;/li&gt;
&lt;li&gt;Einfügen des Links&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
und das knapp 200 mal
&lt;/p&gt;

&lt;p&gt;
Da wäre es zumindest schön, eine Funktion zu haben, die diese Schritte durchführt, und die ich dann an eine Taste binden kann.
&lt;/p&gt;

&lt;p&gt;
Eine Nachfrage via Social Medie ergab, das zwar ähnliche Dinge schon erstellt wurden, aber alle hatten dann doch etwas leicht anderes zum Ziel. Und dann dachte ich mir,ich schaue mal ob ChatGPT mir das Problem lösen kann.
&lt;/p&gt;
&lt;h2 class="collapsible" id="orgff86223"&gt;Der erste Versuch&lt;/h2&gt;
&lt;div id="outline-container-orgff86223" class="outline-2 collapsme"&gt;
&lt;div class="outline-text-2" id="text-orgff86223"&gt;
&lt;p&gt;
Ich: Can you write a emacs lisp function, to link an orgmode Heading at point with its own id, creating one if it does not already exist?
&lt;/p&gt;

&lt;p&gt;
ChatGPT: Certainly! Below is a simple Emacs Lisp function that links an Org mode heading at point with its own ID, creating one if it does not already exist:
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;defun&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;link-heading-with-id&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="s"&gt;"Link an Org mode heading at point with its own ID, creating one if it does not already exist."&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;interactive&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;org-back-to-heading&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;let*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nf"&gt;heading&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;nth&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;org-heading-components&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;id&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;org-entry-get&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;nil&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"CUSTOM_ID"&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;not&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;progn&lt;/span&gt;
&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;setq&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;concat&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"id-"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;md5&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;heading&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;org-set-property&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"CUSTOM_ID"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;insert&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;format&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"[[#%s][%s]]"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;heading&lt;/span&gt;&lt;span class="p"&gt;))))&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;
Nicht schlecht für den ersten Versuch. Die Funktion bewegt zuerst den Cursor an den Anfang der aktuellen Überschrift, ruft dann den Text der Überschrift und deren vorhandene ID ab, falls eine vorhanden ist. Falls die Überschrift keine ID hat, generiert sie eine mittels des &lt;code&gt;md5&lt;/code&gt;-Hashes des Überschriftentextes. Schließlich fügt sie einen Link zur Überschrift mit ihrer ID ein.
&lt;/p&gt;

&lt;p&gt;
Leider wird der Cursor an den Anfang der Überschrift bewegt, wodurch der neue Link vor der '** Überschrift' eingefügt wird, und sie somit keine Überschrift mehr ist. Aber vielleicht kann ChatGPF das korrigieren.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 class="collapsible" id="orgbf3ce26"&gt;Can you alter it, so it replaces the original Heading?&lt;/h2&gt;
&lt;div id="outline-container-orgbf3ce26" class="outline-2 collapsme"&gt;
&lt;div class="outline-text-2" id="text-orgbf3ce26"&gt;
&lt;p&gt;
ChatGPT: Certainly! Here's the modified function that replaces the original heading with the linked version:
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;defun&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;link-heading-with-id&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="s"&gt;"Replace an Org mode heading at point with a linked version using its own ID, creating one if it does not already exist."&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;interactive&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;org-back-to-heading&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;let*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nf"&gt;heading-start&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;point&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;heading-end&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;line-end-position&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;heading&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;nth&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;org-heading-components&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;id&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;org-entry-get&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;nil&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"CUSTOM_ID"&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;not&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;progn&lt;/span&gt;
&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;setq&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;concat&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"id-"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;md5&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;heading&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;org-set-property&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"CUSTOM_ID"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;delete-region&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;heading-start&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;heading-end&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;insert&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;format&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"* [[#%s][%s]]"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;heading&lt;/span&gt;&lt;span class="p"&gt;))))&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;
Diese Version der Funktion löscht die originale Überschrift und fügt die verlinkte Version an ihrer Stelle ein. Aber sie hat immer noch ein Problem, das man in der letzten Zeile sehen kann. Es fügt immer eine Überschrift der Ebene 1 ein (es fügt ein Sternchen voran, immer nur eines). Mach das weg, ChatGPT!
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 class="collapsible" id="orgfc9f312"&gt;Alter it, so that it preserves the Heading-Level&lt;/h2&gt;
&lt;div id="outline-container-orgfc9f312" class="outline-2 collapsme"&gt;
&lt;div class="outline-text-2" id="text-orgfc9f312"&gt;
&lt;p&gt;
ChatGPT: Sure! Here's the modified function that preserves the heading level while replacing the original heading with the linked version:
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;defun&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;link-heading-with-id&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="s"&gt;"Replace an Org mode heading at point&lt;/span&gt;
&lt;span class="s"&gt;   with a linked version using its own ID,&lt;/span&gt;
&lt;span class="s"&gt;   preserving the heading level&lt;/span&gt;
&lt;span class="s"&gt;   and creating one if it does not already exist."&lt;/span&gt;
&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;interactive&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;org-back-to-heading&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;let*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nf"&gt;heading-level&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;org-outline-level&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="w"&gt;                 &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;heading-start&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;point&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="w"&gt;                 &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;heading-end&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;line-end-position&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="w"&gt;                 &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;heading&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;nth&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;org-heading-components&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;span class="w"&gt;                 &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;id&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;org-entry-get&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;nil&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"CUSTOM_ID"&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;not&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;progn&lt;/span&gt;
&lt;span class="w"&gt;                  &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;setq&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;concat&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"id-"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;md5&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;heading&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;span class="w"&gt;                  &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;org-set-property&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"CUSTOM_ID"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;delete-region&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;heading-start&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;heading-end&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;insert&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;format&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"%s [[#%s][%s]]"&lt;/span&gt;
&lt;span class="w"&gt;                            &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;make-string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;heading-level&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;?*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;                            &lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;heading&lt;/span&gt;&lt;span class="p"&gt;))))&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;
Diese Version der Funktion ruft zunächst die Überschriftsebene mit &lt;code&gt;org-outline-level&lt;/code&gt; ab. Dann löscht sie die ursprüngliche Überschrift und fügt die verlinkte Version mit derselben Überschriftsebene ein. Ich habe es ausprobiert, und es hat wie beabsichtigt funktioniert.
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;* Bands  
   :PROPERTIES:
   :COLUMNS: %ITEM %Ort %Datum %Uhrzeit %Link1 %Link2 %Genre
   :END:

#+BEGIN: columnview :id local :skip-empty-rows t
| ITEM                                                       | Ort          |      Datum | Uhrzeit | Link1 | Link2 | Genre |
|------------------------------------------------------------+--------------+------------+---------+-------+-------+-------|
| [[#id-e9884ccd6b1210ce39f04bc2eb7f108a][12 Illusions (D)]] | Moritzbastei | 17.05.2024 |   21.00 | Song1 | Song2 | o     |
#+END:   

** [[#id-e9884ccd6b1210ce39f04bc2eb7f108a][12 Illusions (D)]]
   :PROPERTIES:
   :Datum: 17.05.2024
   :Uhrzeit: 21.00
   :Ort: Moritzbastei
   :Adresse: Universitätsstraße 9
   :Strassenbahn: 9 (Roßplatz)
   :Strassenbahn+: 8, 9, 11, 14, 16, 32 (Wilhelm-Leuschner-Platz)
   :Bus: 412 (Roßplatz)
   :Bus+: N8 (Roßplatz)
   :S-Bahn: S1, S2, S3, S4, S5, S5X, S6 (Wilhelm-Leuscher-Platz)
   :Link1: [[https://www.youtube.com/watch?v=MOPkUBQbCzA][Song1]]
   :Link2: [[https://www.youtube.com/watch?v=_CUVz7neaRM][Song2]]
   :Genre: o
   :CUSTOM_ID: id-e9884ccd6b1210ce39f04bc2eb7f108a
   :END:

12 ILLUSIONS is a newly-launched German dark electro pop band.
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 class="collapsible" id="org5461660"&gt;Es funktioniert&lt;/h2&gt;
&lt;div id="outline-container-org5461660" class="outline-2 collapsme"&gt;
&lt;div class="outline-text-2" id="text-org5461660"&gt;
&lt;p&gt;
Das Einzige, was noch zu tun ist, ist das Kopieren in die Konfiguration und das Binden an eine Taste.
Ach ja, und ChatGPT kann das auch erledigen.
&lt;/p&gt;

&lt;p&gt;
Ich: Please make a keybinding that binds M-. to this function
&lt;/p&gt;

&lt;p&gt;
ChatGPT: Sure! You can bind the &lt;code&gt;link-heading-with-id&lt;/code&gt; function to a keybinding of your choice, such as &lt;code&gt;M-.&lt;/code&gt; . Here's how you can do it:
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;global-set-key&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;kbd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"M-."&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;'link-heading-with-id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;</description><category>chatgpt</category><category>emacs</category><category>llm</category><category>orgmode</category><guid>https://plaindrops.de/de/blog/2024/CodingLispWithChatGPT/</guid><pubDate>Thu, 09 May 2024 08:00:00 GMT</pubDate></item><item><title>Projekt Medusa: Denote</title><link>https://plaindrops.de/de/blog/2024/MedusaDenote/</link><dc:creator>Andy Drop</dc:creator><description>&lt;p&gt;
Wer schon mal &lt;a href="https://plaindrops.de/page/project/dremacs/"&gt;durch meine Projekte&lt;/a&gt; geschaut hat wird feststellen, dass es dort ein Projekt &lt;i&gt;Medusa&lt;/i&gt; gibt, dass ich für mich angelegt habe. In Emacs gibt es immer wieder Funktionen die ich nur sehr selten brauche, und dann komme ich oft nicht direkt auf den notwendigen Befehl. Da ist es dann ganz hilfreich eine Hydra für diese Situation zu haben, und das Projekt unter dem ich all diese Hydras zusammenfasse, heißt bei mir Medusa. Neulich wollte ich für Denote eine Hydra anlegen, und habe festgestellt, dass es da ein paar Probleme gibt.
&lt;/p&gt;
&lt;!-- TEASER_END --&gt;
&lt;p&gt;
Generell halte ich es mit den Hydras so: Ich habe zwei Daumentasten über die ich auf meiner Tastatur die Hydras ansteuere. Auf dem linken Daumen liegt eine eher generelle Hydra die für alle Funktionen gedacht ist die nicht nur in einem speziellen Mode gebraucht werden. Hier kann man es sich etwa so vorstellen, dass dort die Funktion liegen die man normalerweise mit dem Präfix CTRL-x erreicht
&lt;/p&gt;

&lt;p&gt;
Auf dem rechten Daumen liegt eine Art Kontextmenü, also die Hydra, die zu dem jeweiligen Mode gehört, in dem ich mich gerade befinde. Das kann man sich etwa so vorstellen, als wären dort alle Funktionen die über CRTL-c als Prefix zu erreichen sind. Dass ich das ganze wie ein Kontextmenü behandle, sieht man auch daran, dass ich diese Hydras gleichzeitig auf der rechten Maustaste liegen habe.
&lt;/p&gt;
&lt;h2 class="collapsible" id="org9b41ea3"&gt;Modelose Kunst&lt;/h2&gt;
&lt;div id="outline-container-org9b41ea3" class="outline-2 collapsme"&gt;
&lt;div class="outline-text-2" id="text-org9b41ea3"&gt;
&lt;p&gt;
Und hier beginnt auch schon das Problem. &lt;a href="https://protesilaos.com/emacs/denote"&gt;Denote&lt;/a&gt; ist eine Anwendung, die viele Befehle zur Verfügung stellt, um lose geschriebene Notizen miteinander zu verknüpfen. Da diese Notizen jedoch in allen möglichen Formaten geschrieben sein können, gilt natürlich immer der jeweilige Major Mode des Formats. Ich schreibe dieses Blog z.B im Org-Mode das heißt der Major Mode ist in dem Moment nicht Denote sondern Org-Mode. Das Package Major Mode Hydra, funktioniert deswegen schon mal nicht
&lt;/p&gt;

&lt;p&gt;
Denote ist aber auch kein Minor Mode, den man beliebig bei allen möglichen Dokumenten ein- oder ausschalten kann. Ein Dokument ist genau dann ein Denote Dokument wenn es sich in einem bestimmten Verzeichnis (&lt;a href="https://protesilaos.com/emacs/denote#h:15719799-a5ff-4e9a-9f10-4ca03ef8f6c5"&gt;Silo&lt;/a&gt;) befindet und einer Namenskonvention folgt. Und da Denote kein Minor Mode ist, hat es auch keine eigene Keymap. Aber Emacs wäre nicht Emacs, wenn man da nicht etwas machen könnte.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 class="collapsible" id="orge566754"&gt;Wir bauen uns einen Minor-Mode&lt;/h2&gt;
&lt;div id="outline-container-orge566754" class="outline-2 collapsme"&gt;
&lt;div class="outline-text-2" id="text-orge566754"&gt;
&lt;p&gt;
Es wäre gut, wenn Denote ein Minor Mode hätte, der immer dann aktiv wäre, wenn sich das aktive Dokument in einem Denote-Silo befindet. Da ein Silo immer auch ein Verzeichnis ist, hat Emacs ein Werkzeug an Bord: &lt;code&gt;Verzeichnisspezifische Variablen&lt;/code&gt;
&lt;/p&gt;

&lt;p&gt;
Das Handbuch sagt
&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;
Der übliche Weg, verzeichnisspezifische Variablen zu definieren, besteht darin, eine Datei mit dem Namen .dir-locals.el in einem Verzeichnis zu platzieren. Wenn Emacs eine Datei in diesem Verzeichnis oder einem seiner Unterverzeichnisse öffnet, werden die verzeichnisspezifischen Variablen, die in .dir-locals.el angegeben sind, angewendet, als ob sie als dateispezifische Variablen für diese Datei definiert worden wären. Emacs sucht nach .dir-locals.el, beginnend im Verzeichnis der geöffneten Datei, und bewegt sich dabei aufwärts im Verzeichnisbaum.
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;
Meine Datei &lt;code&gt;.dir-locals.el&lt;/code&gt; liegt im obersten Verzeichnis meines Silos, und sieht so aus
&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nf"&gt;nil&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nf"&gt;denote-mode&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;t&lt;/span&gt;&lt;span class="p"&gt;))))&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;
Diese Zeile sorgt dafür, das bei allen Dateien in diesem Verzeichnis der denote-mode eingeschaltet wird. Das ist ein Minor Mode, den Denote nicht von Hause aus mitbringt, sondern den wir zuvor selbst erzeugen müssen. Das passiert im entsprechenden Teil meiner Emacs Konfiguration.
&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;define-minor-mode&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;denote-mode&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="s"&gt;"Denote is a simple note-taking tool for Emacs."&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nv"&gt;:lighter&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;" Note"&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nv"&gt;:keymap&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;let&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nb"&gt;map&lt;/span&gt;
&lt;span class="w"&gt;                   &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;make-sparse-keymap&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;span class="w"&gt;              &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;define-key&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;map&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;kbd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"C-l"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;'denote-link-or-create&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;              &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;define-key&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;map&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;kbd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"C-n"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;'denote-link-after-creating&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;              &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;define-key&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;map&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;kbd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"&amp;lt;f6&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;)(&lt;/span&gt;&lt;span class="k"&gt;lambda&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;interactive&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;find-file&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"~/wiki"&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;span class="w"&gt;              &lt;/span&gt;&lt;span class="nb"&gt;map&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;
&lt;code&gt;:lighter&lt;/code&gt; gibt an, was in die Mode-Line geschrieben wrd, wenn der Minor-Mode aktiv ist, und &lt;code&gt;:keymap&lt;/code&gt; gibt an welche Keymap genutzt werden soll. In diesem Fall wird über &lt;code&gt;make-sparse-keymap&lt;/code&gt; eine leere Keymap erzeugt, und mit den gängigsten Befehlen die ich so brauche gefüllt. Vermutlich könnte ich diese Erstbefüllung auch weglassen, da ich die endgültigen Keybindings sowieso später mache, aber ich habe kein Beispiel gefunden in dem eine leere Keymap angelegt wurde.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 class="collapsible" id="org61f7307"&gt;Die eigentliche Hydra&lt;/h2&gt;
&lt;div id="outline-container-org61f7307" class="outline-2 collapsme"&gt;
&lt;div class="outline-text-2" id="text-org61f7307"&gt;
&lt;p&gt;
Ich bestücke meine frisch erzeugte Keymap dann noch mit den einzig entscheidenden Tasten. &lt;code&gt;&amp;lt;menu&amp;gt;&lt;/code&gt; ist der KeyCode den meine rechte Daumentaste sendet.
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;define-key&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;denote-mode-map&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;kbd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"&amp;lt;menu&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;#&lt;/span&gt;&lt;span class="ss"&gt;'medusa/denote/body&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;define-key&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;denote-mode-map&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;kbd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"&amp;lt;mouse-3&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;#&lt;/span&gt;&lt;span class="ss"&gt;'medusa/denote/body&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;
Wenn ich dann in einem Denote Silo die rechte Maustaste click erscheint folgende Hydra
&lt;/p&gt;

&lt;p&gt;
&lt;img src="https://plaindrops.de/images/MedusaDenote.png" alt="nil"&gt;
&lt;/p&gt;

&lt;p&gt;
Erzeugt wird das Ganze durch folgenden Code.
ich nutze dabei die etwas kürzere und hübschere Syntax die mir das Package &lt;code&gt;Pretty Hydra&lt;/code&gt; zur Verfügung stellt.
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;pretty-hydra-define&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;medusa/denote&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;:color&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;blue&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;:quit-key&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"&amp;lt;escape&amp;gt;"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;:title&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"Denote"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Create"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"n"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;denote&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"_n_ew note"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"t"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;denote-type&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"other _t_ype"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"d"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;denote-date&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="s"&gt;"other _d_ate"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"s"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;denote-subdirectory&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="s"&gt;"other _s_ubdir"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"T"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;denote-template&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="s"&gt;"with _T_emplate"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"S"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;denote-signature&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="s"&gt;"with _S_ignature"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="s"&gt;"Link"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"l"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;denote-link-or-create&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"_l_ink"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"L"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;denote-link-or-create-with-command&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"_L_ink with command"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"h"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;denote-org-extras-link-to-heading&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="s"&gt;"specific _h_eader"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"r"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;denote-add-links&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"by _r_egexp"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"d"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;denote-add-links&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"by _d_ired"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"b"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;denote-backlinks&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"_b_acklinks"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="s"&gt;"Rename"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"RF"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;denote-rename-file&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"Rename File"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"FT"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;denote-change-file-type-and-front-matter&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="s"&gt;"only FileType"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"UF"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;denote-rename-file-using-front-matter&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"use Frontmatter"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="s"&gt;"Dyn. Block"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"DL"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;denote-org-extras-dblock-insert-links&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"dyn. Links"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"DB"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;denote-org-extras-dblock-insert-backlinks&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"dyn. Backlinks"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="s"&gt;"Convert links"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"CF"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;denote-org-extras-convert-links-to-file-type&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"to File Type"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"CD"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;denote-org-extras-convert-links-to-denote-type&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"to Denote Type"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="s"&gt;"Other"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"?"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;info&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"denote"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"Help"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"&amp;lt;menu&amp;gt;"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;major-mode-hydra&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"Major Mode Hydra"&lt;/span&gt;&lt;span class="p"&gt;))))&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;</description><category>denote</category><category>emacs</category><category>hydra</category><category>medusa</category><guid>https://plaindrops.de/de/blog/2024/MedusaDenote/</guid><pubDate>Fri, 03 May 2024 08:00:00 GMT</pubDate></item><item><title>Keymacs, ein Programm um Emacs Keybindings zu erzeugen </title><link>https://plaindrops.de/de/blog/2024/keymacs/</link><dc:creator>Andy Drop</dc:creator><description>&lt;p&gt;
Offensichtlich gibt es ein Menge Emacs-Puristen in der Welt, die im Laufe der Jahre gelernt haben so komplizerte Tastenfolgen wie C-x r t M-. C-c C-p fliessend zu tippen
Ich gehöre nicht dazu. Und als ich versucht habe heraus zu finden wie ich das für mich anpassen kann, waren die Webforen voll von Kommentaren, dass das keine gute Idee sei.
&lt;/p&gt;
&lt;!-- TEASER_END --&gt;
&lt;p&gt;
Im wesentlichen aus folgenden Gründen:
&lt;/p&gt;

&lt;ol class="org-ol"&gt;
&lt;li&gt;&lt;b&gt;Portabilität:&lt;/b&gt; Wenn man seine Emacs-Tastenbelegung stark anpasst, könntest man Schwierigkeiten haben, Emacs auf einem anderen System zu verwenden, auf dem seine Anpassungen nicht verfügbar sind. Das könnte problematisch sein, wenn man häufig zwischen verschiedenen Rechnern wechselt oder wenn man Emacs auf einem entfernten Server verwenden muss.&lt;/li&gt;

&lt;li&gt;&lt;b&gt;Lernkurve:&lt;/b&gt; Emacs hat bereits eine steile Lernkurve für Anfänger, und wenn man die Tastenbelegung stark anpasst, kann das die Sache für andere noch schwieriger machen, seine Konfiguration zu verstehen. Das könnte ein Problem sein, wenn man mit anderen zusammenarbeitet oder wenn man seine Konfiguration mit jemand anderem teilen muss.&lt;/li&gt;

&lt;li&gt;&lt;b&gt;Konflikte:&lt;/b&gt; Wenn man nicht vorsichtig ist, können stark angepasste Tastenbelegungen zu Konflikten zwischen verschiedenen Paketen oder Modi in Emacs führen. Dies kann zu unerwartetem Verhalten führen und es schwieriger machen, Probleme zu diagnostizieren und zu beheben.&lt;/li&gt;

&lt;li&gt;&lt;b&gt;Abhängigkeit von Anpassungen:&lt;/b&gt; Wenn man zu sehr auf seine individuellen Tastenbelegungen angewiesen ist, könnte man feststellen, dass es schwierig ist, Emacs ohne sie zu verwenden. Das könnte ein Problem sein, wenn man einmal auf einem System arbeiten muss, auf dem man seine individuelle Konfiguration nicht nutzen kann.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;
Ich muss allerdings nie meine &lt;a href="https://plaindrops.de/page/project/Emacs-Config/"&gt;Emacs Konfiguration&lt;/a&gt; mit anden Menschen teilen, oder Emacs woanders benutzen, als auf meinen beiden Rechnern. Daher fallen die Punkte 1 und 4 schon mal weg. Was die Lernkurve angeht, habe ich ja nicht vor mir noch kompliziertere Tastenkombinationen auszudenken. Ich möchte einfach mit dem weiterarbeiten können, das sich seit Jahrzehnten in mein Gedächtnis gebrannt hat. Punkt 2 hat sich damit auch erledigt.
&lt;/p&gt;

&lt;p&gt;
Bleibt noch Punkt 3, und es stimmt: Wenn man nicht vorsichtig ist, können stark angepasste Tastenbelegungen zu Konflikten zwischen verschiedenen Paketen oder Modi in Emacs führen.
&lt;/p&gt;

&lt;p&gt;
Ich bin dem bisher aus dem Weg gegangen, indem ich in hübschen Tabellen (Org-Mode sei Dank) Buch darüber geführt habe, welche Anpassung ich vorgenommen habe, um zu erkennen wo es evtl. zu Konflikten kommen kann. Dieses Vorgehen ist natürlich recht anfällig für Fehler. Die Tabellen müssen immer konsistent sein zu den Keybindings an dutzenden von Stellen in der Config. Da braucht man schon sehr viel Disziplin, und es wird schwierig, mal eben etwas auszuprobieren.
&lt;/p&gt;

&lt;p&gt;
Etwas besser wurde es, als ich begonnen habe, alle Keybindings in einer Datei zusammenzufassen. Diese Datei wird am Ende der init.el geladen, und nigrgendwo anders werden Keybindings gemacht. Damit hat es lange funktioniert. Keine Tabellen mehr. Im Code steckt die Wahrheit. Leider war es nicht so einfach im Code nach potentiellen Konflikten zu suchen. Man kann nicht mal eben die Sortierung im Code von "Keymap Name" auf "verwendete Taste" ändern. Da waren Tabellen schon besser.
&lt;/p&gt;

&lt;p&gt;
Also habe ich mich hingesetzt, und mir ein Tool in Python geschrieben, bei dem ich meine gewünschten Keybindings wieder in Org-Tabellen verwalten kann, und das Tool erzeugt mir daraus automatisch die gewünschten Keybindings. Es heisst
&lt;/p&gt;
&lt;h2 class="collapsible" id="orgafc85e5"&gt;Keymacs&lt;/h2&gt;
&lt;div id="outline-container-orgafc85e5" class="outline-2 collapsme"&gt;
&lt;div class="outline-text-2" id="text-orgafc85e5"&gt;
&lt;p&gt;
Das Programm ist ganz simpel. Es geht über eine Datei (default: keymap.org im aktuellen Verzeichnis), sucht sich alle Tabellenzeilen zusammen, und geht davon aus, dass es sich dann dabei 
um Beschreibungen von Keybindings handelt. Dabei werden Headerzeilen und Trennzeilen ignoriert, sowie fast aller anderer umgebender Text auch. Man kann in der Datei also auch beschreiben, was man sich bei den einzelnen Bindings gedacht hat.
&lt;/p&gt;

&lt;p&gt;
Es gibt zwei leicht unterschiedliche Tabellen
&lt;/p&gt;
&lt;/div&gt;
&lt;h3 class="collapsible" id="orgbc21b98"&gt;Die explizite Tabelle&lt;/h3&gt;
&lt;div id="outline-container-orgbc21b98" class="outline-3 collapsme"&gt;
&lt;div class="outline-text-3" id="text-orgbc21b98"&gt;
&lt;table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides"&gt;


&lt;colgroup&gt;
&lt;col class="org-left"&gt;

&lt;col class="org-left"&gt;

&lt;col class="org-left"&gt;

&lt;col class="org-left"&gt;

&lt;col class="org-left"&gt;

&lt;col class="org-left"&gt;

&lt;col class="org-left"&gt;

&lt;col class="org-left"&gt;
&lt;/colgroup&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th scope="col" class="org-left"&gt;Key&lt;/th&gt;
&lt;th scope="col" class="org-left"&gt;Mode&lt;/th&gt;
&lt;th scope="col" class="org-left"&gt;Ctrl&lt;/th&gt;
&lt;th scope="col" class="org-left"&gt;Super&lt;/th&gt;
&lt;th scope="col" class="org-left"&gt;Meta&lt;/th&gt;
&lt;th scope="col" class="org-left"&gt;Shift&lt;/th&gt;
&lt;th scope="col" class="org-left"&gt;Function&lt;/th&gt;
&lt;th scope="col" class="org-left"&gt;Remark&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td class="org-left"&gt;c&lt;/td&gt;
&lt;td class="org-left"&gt;treemacs-mode&lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt;'treemacs-copy-file&lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class="org-left"&gt;c&lt;/td&gt;
&lt;td class="org-left"&gt;treemacs-node-visit&lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt;'treemacs-visit-node-close-treemacs&lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class="org-left"&gt;c&lt;/td&gt;
&lt;td class="org-left"&gt;treemacs-toggle&lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt;'treemacs-indicate-top-scroll-mode&lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class="org-left"&gt;d&lt;/td&gt;
&lt;td class="org-left"&gt;treemacs-copy&lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt;'treemacs-paste-dir-at-point-to-minibuffer&lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class="org-left"&gt;l&lt;/td&gt;
&lt;td class="org-left"&gt;treemacs-mode&lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt;treemacs-copy-map&lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class="org-left"&gt;p&lt;/td&gt;
&lt;td class="org-left"&gt;treemacs-copy&lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt;'treemacs-copy-project-path-at-point&lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class="org-left"&gt;r&lt;/td&gt;
&lt;td class="org-left"&gt;treemacs-copy&lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt;'treemacs-copy-relative-path-at-point&lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class="org-left"&gt;n&lt;/td&gt;
&lt;td class="org-left"&gt;treemacs-mode&lt;/td&gt;
&lt;td class="org-left"&gt;X&lt;/td&gt;
&lt;td class="org-left"&gt;X&lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt;'treemacs-create-dir&lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class="org-left"&gt;n&lt;/td&gt;
&lt;td class="org-left"&gt;treemacs-mode&lt;/td&gt;
&lt;td class="org-left"&gt;X&lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt;'treemacs-create-file&lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;
Ich habe hier mal mit &lt;code&gt;Treemacs&lt;/code&gt; ein Beispiel herausgesucht, and dem sich einige Dinge gut zeigen lassen. &lt;code&gt;Treemacs&lt;/code&gt; hat die Besonderheit, dass ich im Fenster keine Eingaben machen musss. Es gibt also keinen Grund nicht einfach Buchstaben zu benutzen, ohne den kleinen Finger ständig auf der Ctrl Taste zu haben. Zunächst mal die ersten 3 Zeilen
&lt;/p&gt;

&lt;table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides"&gt;


&lt;colgroup&gt;
&lt;col class="org-left"&gt;

&lt;col class="org-left"&gt;

&lt;col class="org-left"&gt;

&lt;col class="org-left"&gt;

&lt;col class="org-left"&gt;

&lt;col class="org-left"&gt;

&lt;col class="org-left"&gt;

&lt;col class="org-left"&gt;
&lt;/colgroup&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th scope="col" class="org-left"&gt;Key&lt;/th&gt;
&lt;th scope="col" class="org-left"&gt;Mode&lt;/th&gt;
&lt;th scope="col" class="org-left"&gt;Ctrl&lt;/th&gt;
&lt;th scope="col" class="org-left"&gt;Super&lt;/th&gt;
&lt;th scope="col" class="org-left"&gt;Meta&lt;/th&gt;
&lt;th scope="col" class="org-left"&gt;Shift&lt;/th&gt;
&lt;th scope="col" class="org-left"&gt;Function&lt;/th&gt;
&lt;th scope="col" class="org-left"&gt;Remark&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td class="org-left"&gt;c&lt;/td&gt;
&lt;td class="org-left"&gt;treemacs-mode&lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt;'treemacs-copy-file&lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class="org-left"&gt;c&lt;/td&gt;
&lt;td class="org-left"&gt;treemacs-node-visit&lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt;'treemacs-visit-node-close-treemacs&lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class="org-left"&gt;c&lt;/td&gt;
&lt;td class="org-left"&gt;treemacs-toggle&lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt;'treemacs-indicate-top-scroll-mode&lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;
Es gibt 3 verschiedene Stellen. an denen ich einfach &lt;code&gt;c&lt;/code&gt; drücken kann, die jedoch nicht im Konflikt miteinander sind, weil sie sich in verschiedenen Keymaps befinden. Um den namen der keymap zu erhalten, hängt das Programm einfach &lt;code&gt;-map&lt;/code&gt; an den Mode.
&lt;/p&gt;

&lt;p&gt;
Aber moment mal, es gibt doch keinen &lt;code&gt;treemacs-toggle&lt;/code&gt; Mode? Stimmt, aber es gibt eine Keymap dazu und ein Prefix, an das diese gebunden ist. Ich zeige das mal and der &lt;code&gt;treemacs-copy-map&lt;/code&gt;:
&lt;/p&gt;

&lt;table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides"&gt;


&lt;colgroup&gt;
&lt;col class="org-left"&gt;

&lt;col class="org-left"&gt;

&lt;col class="org-left"&gt;

&lt;col class="org-left"&gt;

&lt;col class="org-left"&gt;

&lt;col class="org-left"&gt;

&lt;col class="org-left"&gt;

&lt;col class="org-left"&gt;
&lt;/colgroup&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th scope="col" class="org-left"&gt;Key&lt;/th&gt;
&lt;th scope="col" class="org-left"&gt;Mode&lt;/th&gt;
&lt;th scope="col" class="org-left"&gt;Ctrl&lt;/th&gt;
&lt;th scope="col" class="org-left"&gt;Super&lt;/th&gt;
&lt;th scope="col" class="org-left"&gt;Meta&lt;/th&gt;
&lt;th scope="col" class="org-left"&gt;Shift&lt;/th&gt;
&lt;th scope="col" class="org-left"&gt;Function&lt;/th&gt;
&lt;th scope="col" class="org-left"&gt;Remark&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td class="org-left"&gt;l&lt;/td&gt;
&lt;td class="org-left"&gt;treemacs-mode&lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt;treemacs-copy-map&lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class="org-left"&gt;d&lt;/td&gt;
&lt;td class="org-left"&gt;treemacs-copy&lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt;'treemacs-paste-dir-at-point-to-minibuffer&lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class="org-left"&gt;p&lt;/td&gt;
&lt;td class="org-left"&gt;treemacs-copy&lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt;'treemacs-copy-project-path-at-point&lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class="org-left"&gt;r&lt;/td&gt;
&lt;td class="org-left"&gt;treemacs-copy&lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt;'treemacs-copy-relative-path-at-point&lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class="org-left"&gt;a&lt;/td&gt;
&lt;td class="org-left"&gt;treemacs-copy&lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt;'treemacs-copy-absolute-path-at-point&lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;
Diese Map heist originellerweise &lt;code&gt;treemacs-copy-map&lt;/code&gt; obwohl ursprünglich nur eine Funktion darin die aktuelle Datei kopiert (und die habe ich mir kürzer auf &lt;code&gt;c&lt;/code&gt; gelegt. Alle anderen legen mir nur diverse Links ins Clipboard, daher habe ich als Taste auch &lt;code&gt;l&lt;/code&gt; gewählt um in die &lt;code&gt;treemacs-copy-map&lt;/code&gt; zu gelangen, dia nachfolgende Taste wählt dann welch Art Link ich haben möchte (absolut, relativ oder doch zum Project-Root?) &lt;code&gt;l a&lt;/code&gt; gibt mir also den Link als absoluten Pfad.
&lt;/p&gt;

&lt;p&gt;
Und natürlich kann ich auch, wenn ich will, trotzdem &lt;code&gt;Ctrl&lt;/code&gt; Kombinationen verwenden. Zum Beispiel verwenden viele Programme &lt;code&gt;Ctrl-n&lt;/code&gt; um eine Neue Datei, ein neues Object, oder sonst etwas neues zu erzeugen. Warum sollte ich das ignorieren? Also:
&lt;/p&gt;

&lt;table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides"&gt;


&lt;colgroup&gt;
&lt;col class="org-left"&gt;

&lt;col class="org-left"&gt;

&lt;col class="org-left"&gt;

&lt;col class="org-left"&gt;

&lt;col class="org-left"&gt;

&lt;col class="org-left"&gt;

&lt;col class="org-left"&gt;

&lt;col class="org-left"&gt;
&lt;/colgroup&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th scope="col" class="org-left"&gt;Key&lt;/th&gt;
&lt;th scope="col" class="org-left"&gt;Mode&lt;/th&gt;
&lt;th scope="col" class="org-left"&gt;Ctrl&lt;/th&gt;
&lt;th scope="col" class="org-left"&gt;Super&lt;/th&gt;
&lt;th scope="col" class="org-left"&gt;Meta&lt;/th&gt;
&lt;th scope="col" class="org-left"&gt;Shift&lt;/th&gt;
&lt;th scope="col" class="org-left"&gt;Function&lt;/th&gt;
&lt;th scope="col" class="org-left"&gt;Remark&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td class="org-left"&gt;n&lt;/td&gt;
&lt;td class="org-left"&gt;treemacs-mode&lt;/td&gt;
&lt;td class="org-left"&gt;X&lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt;'treemacs-create-file&lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class="org-left"&gt;n&lt;/td&gt;
&lt;td class="org-left"&gt;treemacs-mode&lt;/td&gt;
&lt;td class="org-left"&gt;X&lt;/td&gt;
&lt;td class="org-left"&gt;X&lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt;'treemacs-create-dir&lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;
So kann ich mit &lt;code&gt;Ctrl-n&lt;/code&gt; eine neue Datei anlegen und mit &lt;code&gt;Ctrl-Super-n&lt;/code&gt; auch ein neues Verzeichnis.
&lt;/p&gt;

&lt;p&gt;
Gerade die gängigen &lt;code&gt;Ctrl&lt;/code&gt; Kombinationen sind aber natürlich in vielen verschiedenen Modi sinnvoll, und man muss ein wenig aufpassen, das sich die Keybindings nicht gegenseitig stören, Vor allem wenn minor-modes ins Spiel kommen. Dazu benutzt man dann besser: 
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 class="collapsible" id="orge743be6"&gt;Die implizite Tabelle&lt;/h3&gt;
&lt;div id="outline-container-orge743be6" class="outline-3 collapsme"&gt;
&lt;div class="outline-text-3" id="text-orge743be6"&gt;
&lt;p&gt;
Auf Anhieb sieht die Tabelle gleich aus, es fehlt jedoch die Key Spalte links
&lt;/p&gt;

&lt;table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides"&gt;


&lt;colgroup&gt;
&lt;col class="org-left"&gt;

&lt;col class="org-left"&gt;

&lt;col class="org-left"&gt;

&lt;col class="org-left"&gt;

&lt;col class="org-left"&gt;

&lt;col class="org-left"&gt;

&lt;col class="org-left"&gt;
&lt;/colgroup&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th scope="col" class="org-left"&gt;Mode&lt;/th&gt;
&lt;th scope="col" class="org-left"&gt;Ctrl&lt;/th&gt;
&lt;th scope="col" class="org-left"&gt;Super&lt;/th&gt;
&lt;th scope="col" class="org-left"&gt;Meta&lt;/th&gt;
&lt;th scope="col" class="org-left"&gt;Shift&lt;/th&gt;
&lt;th scope="col" class="org-left"&gt;Function&lt;/th&gt;
&lt;th scope="col" class="org-left"&gt;Remark&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td class="org-left"&gt;Global&lt;/td&gt;
&lt;td class="org-left"&gt;X&lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt;'org-insert-link-global&lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class="org-left"&gt;org-mode&lt;/td&gt;
&lt;td class="org-left"&gt;X&lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt;'org-insert-link&lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class="org-left"&gt;org-mode&lt;/td&gt;
&lt;td class="org-left"&gt;X&lt;/td&gt;
&lt;td class="org-left"&gt;X&lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt;'org-super-links-insert-link&lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class="org-left"&gt;org-mode&lt;/td&gt;
&lt;td class="org-left"&gt;X&lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt;X&lt;/td&gt;
&lt;td class="org-left"&gt;'org-super-links-link&lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;
Doch woher weiss &lt;code&gt;keymacs&lt;/code&gt; nun an welche Taste es binden soll? Ich hatte zu Beginn geschrieben, dass &lt;code&gt;keymacs&lt;/code&gt; Headerzeilen und Trennzeilen ignoriert, sowie &lt;b&gt;fast&lt;/b&gt; allen anderen umgebenden Text auch. Nun hier ist der Grund für das "fast", und duzu müssen wir in den Org-mode schauen
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;** N New
 | Mode       | Ctrl | Super | Meta | Shift | Function                 | Remark |
 |------------+------+-------+------+-------+--------------------------+--------|
 | Global     | X    |       |      |       | 'find-file               |        |
 | org-mode   | X    |       |      |       | 'find-file               |        |
 | dired-mode | X    |       |      |       | 'dired-create-empty-file |        |
 | dired-mode | X    | X     |      |       | 'dired-create-directory  |        |
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;
&lt;code&gt;Keymacs&lt;/code&gt; liest nämlich von allen Org Header Zeilen das erste Wort (hier 'N') und verwendet es für die darauf folgenden impliziten Tabellen. Ein neuer Header setzt wieder eine andere Taste z.B.
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;** F9 Treemacs - a tree layout file explorer for Emacs
 | Mode   | Ctrl | Super | Meta | Shift | Function                | Remark |
 |--------+------+-------+------+-------+-------------------------+--------|
 | Global |      |       |      |       | 'treemacs-select-window |        |
 | Global |      |       |      | X     | 'treemacs-find-file     |        |
 | Global | X    |       |      |       | 'treemacs-find-tag      |        |
 |        |      |       |      |       |                         |        |
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;
Ausser für das erste Wort interessiert sich &lt;code&gt;keymacs&lt;/code&gt; für nichts. Nebenbei sieht man hier auch, das die global-map mit Global gefüllt wird (mit großem G). Bei den Spalten muss die Reihenfolge passen, die Überschriften sind nur für den Leser und werden ignoriert.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 class="collapsible" id="orge77bc0e"&gt;Das Programm&lt;/h2&gt;
&lt;div id="outline-container-orge77bc0e" class="outline-2 collapsme"&gt;
&lt;div class="outline-text-2" id="text-orge77bc0e"&gt;
&lt;p&gt;
Geschrieben habe ich das ganze ursprünglich um mein Problem zu lösen, und später dann auch um den kompletten Enwicklungsprozess mittels Hatch zu testen. Daher gibt es das ganze auch auf (Test-)PyPi zum Download. Da ich diesen ganzen Python Workflow gerne verinnerlichen möchte, werde ich auch weiter an diesem Tool arbeiten, auch wenn es bisher schon alle meine Probleme löst. Aber der Code ist hässlich und hat bisher nur einen "happy Path" ohne Error Handling.
&lt;/p&gt;

&lt;p&gt;
Der Sourcecode liegt &lt;a href="https://codeberg.org/dr.ops/keymacs"&gt;hier&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;
Wenn man es nur installieren möchte empfehle ich &lt;code&gt;pipx&lt;/code&gt; zu nutzen. Dann geht das einfach so:
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;pipx install -i https://test.pypi.org/simple/ keymacs
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;
Das Programm liest die keymap.org Datei nur, und schreibt dann eine keymap.el die man dann am Ende seiner init.el einbindet
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;(load (concat user-emacs-directory "config.el"))
;;(load (concat user-emacs-directory "sanekeys.el"))
(load (concat user-emacs-directory "medusa.el"))
(org-babel-load-file (concat user-emacs-directory "elgato.org"))
(org-babel-load-file (concat user-emacs-directory "skeletons.org"))
(load (concat user-emacs-directory "keymap.el"))

(setq custom-file (concat user-emacs-directory "custom.el"))
;; (load (concat user-emacs-directory "custom.el"))
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;</description><category>emacs</category><category>keybindings</category><guid>https://plaindrops.de/de/blog/2024/keymacs/</guid><pubDate>Tue, 23 Apr 2024 08:00:00 GMT</pubDate></item><item><title>Mal eben schnell drucken in Emacs</title><link>https://plaindrops.de/de/blog/2024/PrintingInEmacs/</link><dc:creator>Andy Drop</dc:creator><description>&lt;p&gt;
In Emacs gibt es eine ganze Reihe von Wegen, hübsche Ausdrucke zu erzeugen. Die meisten erzeugen am Ende PDFs. Aber wenn man einfach mal schnell einen Ausdruck des Buffers haben will, um darin mit Bleistift und Textmarker zu arbeiten, dann kann das schon mal ein Problem werden. Ich hab einen Abend lang versucht, das zu lösen, und es schliesslich auch geschafft. Damit ich mich daran erinnere gibt es diesen Blogeintrag.
&lt;/p&gt;
&lt;!-- TEASER_END --&gt;
&lt;p&gt;
Im Prinzip gibt es den befehl &lt;code&gt;print-buffer&lt;/code&gt;, der bei mir aus Gewohnheit mit &lt;i&gt;CTRL-p&lt;/i&gt; aufgerufen wird. Ich erwarte dann, dass aus dem Drucker Papier kommt, das unformatiert einfach das enthält, was ich im Buffer auf dem Bildschirm sehe. 
&lt;/p&gt;

&lt;p&gt;
Leider funktionierte das bei mir überhaupt nicht.
Emacs benutzt für diese Art Ausdrucke den Linux Kommandozeilenbefehl &lt;code&gt;lpr&lt;/code&gt;, und schnell war klar, das mit dem auch auf der Kommanduzeile kein Blumentopf zu gewinnen ist. Jeder Versuch irgendetwas damit zu drucken endete mit der Meldung, dass der lpr Daemon nicht laufen würde. Jeder Versuch diesen zu starten schlug fehl. Irgenwann dämmerte es mir, das lpr als Tool zum drucken vielleicht einfach zu alt ist.
&lt;/p&gt;
&lt;h2 class="collapsible" id="org33ca1eb"&gt;Zurück in die Zukunft&lt;/h2&gt;
&lt;div id="outline-container-org33ca1eb" class="outline-2 collapsme"&gt;
&lt;div class="outline-text-2" id="text-org33ca1eb"&gt;
&lt;p&gt;
&lt;code&gt;lpr&lt;/code&gt; ist nämlich ein älterer Befehl, der aus den Zeiten stammt, als Drucker häufig direkt an Unix-Systeme angeschlossen waren. Inzwischen begab es sich aber, das das "Common Unix Printing System" (CUPS) entwickelt wurde, das eine moderne Druckverwaltung auf Unix-Systemen bietet. Und ein wenig Websuche ergab, dass es seinen eigenen Kommandozeilenbefehl mitbringt &lt;code&gt;lp&lt;/code&gt;.
&lt;/p&gt;

&lt;p&gt;
Die Syntax der beiden Befehle kann leicht variieren. &lt;code&gt;lpr&lt;/code&gt; akzeptiert normalerweise einfach den Dateinamen, den ich drucken möchte, während &lt;code&gt;lp&lt;/code&gt; eine Reihe von Optionen akzeptiert, die es mir ermöglichen, verschiedene Aspekte des Druckauftrags zu steuern, wie z.B. die Anzahl der Kopien, den Drucker, das Papierformat usw.
&lt;/p&gt;

&lt;p&gt;
In Emacs gibt es dafür netterweise die Möglichkeit den Befehl, den es unter der Decke nutzt zu konfigurieren.
Wir sagen also, das wir statt &lt;code&gt;lpr&lt;/code&gt; lieber &lt;code&gt;lp&lt;/code&gt; vervenden wollen
&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;setq&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;lpr-command&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"lp"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;
Da &lt;code&gt;lp&lt;/code&gt; und &lt;code&gt;lpr&lt;/code&gt; unterschiedliche Parameter auf der Kommandozeile mitgeben, macht es auch keinen Sinn, für &lt;code&gt;lp&lt;/code&gt; weiterhin die &lt;code&gt;lpr&lt;/code&gt; Standard Switches zu nutzen. Die schalten wir also ab 
&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;setq&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;lpr-add-switches&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;nil&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;
Und Zack funktionierte alles wie erwartet, also habe ich es in meiner &lt;a href="https://plaindrops.de/page/project/Emacs-Config/#org286df2f"&gt;Config&lt;/a&gt; verewigt
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 class="collapsible" id="org16dcd28"&gt;Fazit&lt;/h2&gt;
&lt;div id="outline-container-org16dcd28" class="outline-2 collapsme"&gt;
&lt;div class="outline-text-2" id="text-org16dcd28"&gt;
&lt;p&gt;
Wenn man nicht gerade ein antikes Linux System nutzt macht &lt;code&gt;lpr&lt;/code&gt; keinen Sinn mehr, und sollte durch &lt;code&gt;lp&lt;/code&gt; ersetzt werden. IMHO wäre das mittlerweile auch ein guter Default.
&lt;/p&gt;

&lt;p&gt;
In der Konfiguration kann man übrigens auch eigene Parameter einstellen, die an &lt;code&gt;lp&lt;/code&gt; übergeben werden, ich denke damit bekomme ich dann auch den doppelseitigen Druck hin.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;</description><category>emacs</category><category>printing</category><guid>https://plaindrops.de/de/blog/2024/PrintingInEmacs/</guid><pubDate>Fri, 19 Apr 2024 08:00:00 GMT</pubDate></item><item><title>Browser Lesezeichen in Org-Mode speichern</title><link>https://plaindrops.de/de/blog/2021/MyBookmarks/</link><dc:creator>Andy Drop</dc:creator><description>&lt;p&gt;
Das Problem begann eigentlich schon vor &lt;a href="https://de.wikipedia.org/wiki/Lynx_(Browser)"&gt;knapp 30 Jahren&lt;/a&gt;. Es war sehr einfach im Browser ein Lesezeichen zu einer Seite zu speichern, und genau so einfach war es auch die Seiten danach wieder damit aufzurufen. So sammelten sich im Laufe der Zeit mehr und mehr Lesezeichen an, und wenn dann eine neue Version des Browsers erschien, war es eine mühsame Arbeit die Datei mit den Lesezeichen in das passende Verzeichnis des neuen Browsers zu kopieren.
&lt;/p&gt;
&lt;!-- TEASER_END --&gt;

&lt;p&gt;
Immerhin hatten die Hersteller schnell begriffen, dass dies ein Problem war, und boten bald dann eine Möglichkeit an die Lesezeichen automatisiert von einer Vorgängerversion zu übernehmen.  Nun arbeiten Menschen aber durchaus mit mehr als einem Browser, und es wurde immer klarer, das es sehr praktisch ist wenn man sowohl auf dem Rechner zu Hause, als auch auf dem Laptop, oder dem Firmen-Rechner die gleichen Lesezeichen zur Verfügung hat.
&lt;/p&gt;

&lt;p&gt;
Damit begann zu erst die Zeit der Online- Lesezeichen Speicherdienste, die über ein Browser-Plugin die Favoriten in ihre Verzeichnisse aufnahmen, später bauten auch alle großen Browserhersteller eine Funktion ein um die Lesezeichen zwischen verschiedenen Browsern zu synchronisieren, was wiederum den Niedergang der Online-Speicherdienste einläutete.
&lt;/p&gt;

&lt;p&gt;
Ich habe damals auch so einen Dienst benutzt, auch weil es praktisch war, seine eigenen Lesezeichen für andere Personen freizugeben. Dennoch sind mir immer wieder Lesezeichen abhanden gekommen, wenn mal das Plugin nicht richtig funktionierte, und Unmengen von Dubletten waren an der Tagesordnung.
&lt;/p&gt;

&lt;p&gt;
So kam es, das ich mich entschied meine Lesezeichen ab jetzt an einem zentralen Ort zu sammeln, der unabhängig von Browser und Internet sein sollte. Seit damals, bis heute ist das eine reine Textdatei, und das Format ist auch nur wenig geändert wurden. Ich habe schon immer den Link gespeichert, und zu Anfang einfach noch ein paar Stichworte dazu geschrieben. Seit einigen Jahren bin ich beim jetzigen Format einem Org-Mode Link inklusive dem Seitentitel, plus einem Zeitstempel, wann ich das Lesezeichen erzeugt habe, angekommen.
&lt;/p&gt;

&lt;p&gt;
Dadurch ist das aufrufen von Seiten ein Kinderspiel. Im Org-Mode von Emacs sind Links einfach anklickbar, und rufen das konfigurierte Programm, also am besten einen Browser, auf.
&lt;/p&gt;

&lt;p&gt;
Das Abspeichern der Links war schon immer eine eigene Baustelle und läuft bei mir mittlerweile in der dritten Fassung
&lt;/p&gt;
&lt;h2 class="collapsible" id="org8b03d25"&gt;Die Emacs Seite&lt;/h2&gt;
&lt;div id="outline-container-org8b03d25" class="outline-2 collapsme"&gt;
&lt;div class="outline-text-2" id="text-org8b03d25"&gt;
&lt;p&gt;
Auf der Empfängerseite, also in Emacs war die Lösung von Anfang an sehr einfach. Hier gibt es einen Mechanismus der sich &lt;a href="https://orgmode.org/manual/Capture.html"&gt;Org-Capture&lt;/a&gt; nennt. Dieser ist eigentlich dazu gedacht, um neben der normalen Arbeit an einem Text mal eben eine Information zu einem Anruf, oder einem Gespräch mit dem Kollegen, der gerade ins Büro kam festzuhalten. Neben dem normalen Fenster geht ein weiteres Fenster auf, in das man seine Notiz eintragen kann, und diese wird dann an einem festgelegten Ort gespeichert. Dabei lassen sich &lt;a href="https://orgmode.org/manual/Capture-templates.html"&gt;Templates&lt;/a&gt; nutzen, die z.B. bereits Datum und Uhrzeit des Eintrags hinzugefügt haben, noch bevor man los tippt.
&lt;/p&gt;

&lt;p&gt;
Passend zu diesem Mechanismus gibt es das &lt;a href="https://orgmode.org/manual/The-capture-protocol.html#index-capture-protocol"&gt;Capture-Protocol&lt;/a&gt;. Dadurch wird es möglich Emacs von aussen her aufzurufen, und als Aufrufparameter Informationen mitzugeben, die dann in ein solches Template eingetragen werden, und in die entsprechende Datei eingetragen.
&lt;/p&gt;

&lt;p&gt;
Wer dieses Protokoll nutzen möchte stößt allerdings schnell auf zwei Probleme, die sich allerdings beide lösen lassen:
&lt;/p&gt;

&lt;ul class="org-ul"&gt;
&lt;li&gt;Da es sich um ein neues Protokoll handelt wird dieses vom Betriebssystem behandelt, und muss diesem zunächst mal bekannt gemacht werden. Das bedeutet unter Windows das &lt;a href="https://www.reddit.com/r/emacs/comments/gssl86/question_setting_up_orgcapture_on_windows/"&gt;anlegen von Registry Einträgen&lt;/a&gt;, und unter Linux das schreiben (wenn auch sehr kleiner) Konfigurationsdateien. Ohne diese Bekanntgabe passiert absolut nichts. Das Betriebssystem muss wissen, das es jedes mal den Emacsclient aufruft, wenn jemand das org-capture-protocol verwendet.&lt;/li&gt;
&lt;/ul&gt;


&lt;ul class="org-ul"&gt;
&lt;li&gt;Die Syntax des Aufrufs hat sich im Verlauf der Emacs Versionen einmal geändert, so das es quasi zwei verschiedene Versionen gibt, wie es richtig funktioniert, und auch wenn mittlerweile wohl nur noch Emacs Versionen mit der neuen Syntax in Gebrauch sein sollten, stammen sehr viele Erklärungen im Internet noch aus der Zeit der alten Syntax, die umständlicher, und dazu noch weniger flexibel war. Leider wird fast nirgendwo darauf hingewiesen, dass es mittlerweile eine neuere, bessere Syntax gibt. Selbst Anleitungen, die die neue Syntax zeigen, erwähnen selten, dass es auch mal eine alte Syntax gab, und so geraten Anfänger schnell in die Falle beide Versionen für die Wahrheit zu halten, und sie munter zu mixen, was dann dazu führt, das es überhaupt nicht mehr funktioniert.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
Hat man diese beidem Probleme aber einmal erkannt, lässt sich das ganze schnell korrekt konfigurieren (und so schwer ist das dann auch nicht mehr). Ein Tipp: Die aktuelle Syntax findet sich in der Dokumentation, die man sowohl online, als auch innerhalb von in der Hilfe findet.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 class="collapsible" id="orgf2406e0"&gt;Die Browser-Seite&lt;/h2&gt;
&lt;div id="outline-container-orgf2406e0" class="outline-2 collapsme"&gt;
&lt;div class="outline-text-2" id="text-orgf2406e0"&gt;
&lt;p&gt;
Um in Emacs ein Lesezeichen abzuspeichern reicht also ein Aufruf von 
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;emacsclient "org-protocol://capture?template=L&amp;amp;url=%%TAB-URL%%&amp;amp;title=%%TAB-TITLE%%"
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;
Der Browser muss also einfach nur diesen Aufruf hinbekommen, und der Drops ist gelutscht. Leider ist der Aufruf von ausführbaren Programmen von der Platte des Benutzers auch eine riesige Sicherheitslücke, denn wenn ein Angreifer das von einer Internetseite aus tun kann, kann er auch Schadcode dort ausführen. Entsprechend haten die Browser Hersteller keinen einfachen Weg dafür in ihre Browser eingebaut.
&lt;/p&gt;
&lt;/div&gt;
&lt;h3 class="collapsible" id="org0630268"&gt;Iteration 1&lt;/h3&gt;
&lt;div id="outline-container-org0630268" class="outline-3 collapsme"&gt;
&lt;div class="outline-text-3" id="text-org0630268"&gt;
&lt;p&gt;
Mein erster Weg damit umzugehen, war es mir einen anderen Browser zuzulegen. Ich hab mir damals Qutebrowser ausgesucht, weil er eine Funktion bot, jede Funktion des Browsers mit einer Tastenkombination zu verbinden. Dazu war noch eine sehr wichtige Funktion eingebaut, mit der man beliebige Programme aufrufen konnte, und der Browser konnte dazu die URL, den Namen der Seite, oder den markierten Text als Aufrufparameter einsteuern. Der Ansatz war also trivial: einfach Ctrl-D mit dem Aufruf eines kleinen Python-Scripts verbunden, das die URL passend formatiert, und dann den Emacsclient aufruft.
&lt;/p&gt;

&lt;p&gt;
Es war ein Traum. … bis zu Debian 10. Dann stellte sich heraus, dass die Versionen von Python, und die von Debian installierten Qt-Bibliotheken für Python unterschiedliche Abhängigkeiten hatten, die sich widersprachen, kurz es knallte an allen Ecken und Enden, und die Lösung wäre es gewesen eine isolierte Python umgebung zu schaffen, mit gepinten Versionen der einzelnen Pakete, und das wollte ich mir dann doch nicht antun.
&lt;/p&gt;

&lt;p&gt;
Es wurde also Zeit für 
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 class="collapsible" id="org2a315cc"&gt;Iteration 2&lt;/h3&gt;
&lt;div id="outline-container-org2a315cc" class="outline-3 collapsme"&gt;
&lt;div class="outline-text-3" id="text-org2a315cc"&gt;
&lt;p&gt;
Wenn ich den Qutebrowser sowieso nicht mehr nutzen konnte bin ich also wieder zurück zu einem der Standardbrowser gewechselt - Firefox
&lt;/p&gt;

&lt;p&gt;
Hier gab es also wieder das bekannte Problem, dass Firefox nicht besonders gewillt ist externe Programme aufzurufen, und ich habe ein wenig gegrübelt, wie sich das am besten umgehen lässt, ohne die Sicherheit von Firefox auszuhebeln. Die Lösung lieferte dann meine Freundin quasi frei Haus. Wir unterhielten uns eines Tages darüber, das Ihr Arbeitskollege unter Windows sehr virtuos Standard-eMails schreibt, indem er alle wichtigen
Textbausteine in einer Software namens Klavier hat, und auf Knopfdruck abrufen kann, verbunden mit der Frage, ob sie das nicht auch irgendwie installieren kann. Nun, für die Software hatte ihr Kollege wohl eine Lizenz gekauft, und das Geld wollte sie nicht ausgeben, aber ich hab eine Software namens AutoHotKey gefunden, die quasi das gleiche kann, und mit der sie seither arbeitet.
&lt;/p&gt;

&lt;p&gt;
Neugierig geworden wollte ich sehen, ob es so etwas auch für Linux gibt (ich hab es nie gebraucht, da Emacs ein paar eingebaute Wege hat mit Textbausteinen zu arbeiten).
&lt;/p&gt;

&lt;p&gt;
Und ich fand ein Programm namens Autokey, und schon die ersten Beispiele, die ich sah zeigten auch, das es auch mit dem Clipboard umgehen kann, und auch externe Programme aufrufen. BINGO!
&lt;/p&gt;

&lt;p&gt;
Von da an ging es ganz schnell. Ich hab Autokey installiert, und CTRL-D mit einen Script belegt das den Cursor in die URL-Zeile setzt, alles markiert, und die URL ins Clipboard kopiert. Mit dieser URL wurde dann mein altes Python-Script aus Iteration 1 aufgerufen, und Voila, die URL landete wieder in meinem Emacs, und damit in der Link-Datei.
&lt;/p&gt;

&lt;p&gt;
Es waren wieder friedliche Zeiten. So einigermaßen.
&lt;/p&gt;

&lt;p&gt;
Denn leider konnte ich so den Seitentitel nicht übernehmen, und musste im Nachgang nochmal ein Skript über meine Links laufen lassen, welches zu jedem Link den Seitetntitel holte, und den Org-Link entsprechend anpasste. Es funktionierte, aber meine Nerd-Seele litt. Ich wollte EINEN EINZIGEN SCHRITT mit EINEM Tastendruck.
&lt;/p&gt;

&lt;p&gt;
Ich begann also die Suche nach 
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 class="collapsible" id="orgb6779b1"&gt;Iteration 3&lt;/h3&gt;
&lt;div id="outline-container-orgb6779b1" class="outline-3 collapsme"&gt;
&lt;div class="outline-text-3" id="text-orgb6779b1"&gt;
&lt;p&gt;
Ich hab dann angefangen die Firefox AddOns nach Erweiterungen zu durchsuchen, die es irgendwie doch ermöglichen ein externes Skript aus dem Browser zu starten. Die ersten Ergebnisse trieben mir eine Gänsehaut nach der anderen über den Rücken, viele davon verlangten, einen nicht näher  beschriebenen Code aus dem Internet zu laden, bei dem der Autor versprach, das er das Problem löst, aber nicht wie, oder ob damit die Browser Sicherheit ausgehebelt wird. Viele dieser Erweiterungen sind mittlerweile aus den AddOns verschwunden, und ich habe mich auch nie getraut, eine davon zu installieren.
&lt;/p&gt;

&lt;p&gt;
Bis ich auf &lt;a href="https://github.com/waldner/Firefox-RunWith"&gt;RunWith&lt;/a&gt; stieß. Auch hier muss man zwei weitere Dateien auf seinem System installieren, und eventuell war das auch genau der gleiche Mechanismus, wie die anderen AddOns die ich so ignoriert hatte, allerdings machte der Autor zwei entscheidende Dinge anders, als die Pakete, die mir so dubios erschienen. Er zeigte die beiden Dateien &lt;a href="https://github.com/waldner/Firefox-RunWith#configuration-example"&gt;ganz offen&lt;/a&gt;, und erklärte ihre Funktion Stück für Stück, so dass ich nachvollziehen konnte, wozu ich diese brauche und er stellte &lt;a href="https://github.com/waldner/Firefox-RunWith#detailed-explanation"&gt;ihre Funktion&lt;/a&gt; dar, in einen Framework, das sich &lt;a href="https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/Native_messaging"&gt;Native Messaging&lt;/a&gt; nennt, und das die von den Browserherstellern bevorzugte sichere Methode ist externe Programme aus einem Browser aufzurufen, und mit Parametern zu versehen. Also exakt das, wonach ich gesucht habe.
&lt;/p&gt;

&lt;p&gt;
URL, Seitentitel und markierter Text gehören auch hier zu den Standard Parametern, die übergeben werden können, aber darüber hinauch auch Bild-URLs oder die Art der Objekts von wo das Skript aufgerufen wurde, denn im Standard enthalten ist auch, das ich beim Klick nur Scripte angezeigt bekomme, die in der jeweiligen Situation sinnvoll sind. Wenn ich also einfach irgendwo auf der Seite dieses AddOn aufrufe bietet es mir an ein Script für
ein Lesezeichen auszuführen. Habe ich hingegen einen Teil der Seite markiert, wird zusätzlich ein Script angeboten, das mir den markierten Text als Zitat speichert, und die URL als Quelle darunter schreibt.
&lt;/p&gt;

&lt;p&gt;
Die zentrale Datei der Native Messaging Host ist hier in Python geschrieben, und damit schon mal auf seinen Inhalt überprüfbar. Darüber hinaus beschreibt der Autor auf der Homepage noch sehr schön wie die Schnittstelle aussieht, die ein Skript zur Verfügung stellen muss, um als NM Host fungieren zu können, und welche Aufgaben die einzelnen Teile des Skripts dabei übernehmen. Das ist nicht nur genug um mein Vertrauen zu gewinnen,
sondern geradezu vorbildlich.
&lt;/p&gt;

&lt;p&gt;
Ich hoffe daher, dass Iteration 3 damit die letzte Station auf der Reise zur perfekten Bookmark Lösung für mich war. Dabei bleibt wieder einmal eine Erkenntnis zurück. Obwohl alle 3 Iterationen technologisch vollständig unterschiedliche Ansätze waren, konnten alle perfekt mit einer Textdatei arbeiten, und ich möchte mir nicht ausmalen wie es gelaufen wäre, wenn diese auch noch in einem proprietären Dateiformat abgelegt wären.
&lt;/p&gt;

&lt;p&gt;
Dazu kommt noch, das ich diese Textdatei einfach in HTML exportieren kann, und das Ergebnis ist dann unmittelbar die &lt;a href="https://plaindrops.de/page/links/"&gt;LINKS Seite&lt;/a&gt; dieses Blogs, bei der einfach alle privaten Links nicht exportiert wurden.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;</description><category>bookmarks</category><category>browser</category><category>emacs</category><category>orgmode</category><guid>https://plaindrops.de/de/blog/2021/MyBookmarks/</guid><pubDate>Tue, 02 Nov 2021 02:00:00 GMT</pubDate></item><item><title>Finanzen im Griff mit Ledger (2) - Der Emacs Ledger-Mode</title><link>https://plaindrops.de/de/blog/2020/finance-under-control-2/</link><dc:creator>Andy Drop</dc:creator><description>&lt;p&gt;
Im letzten Teil hatte ich darüber geschrieben, wie Buchungen in Ledger
funktionieren, und wie sie geschrieben werden. Dadurch, dass es sich
um einfache Textdateien handelt, braucht man dazu nicht mehr als einen
beliebigen Texteditor. Wählt man dazu Emacs macht die Arbeit allerdings
schon deutlich mehr Spass.
&lt;/p&gt;
&lt;!-- TEASER_END --&gt;

&lt;p&gt;
Naja zugegeben Spass ist was anderes, aber wenn man seine Finanzen mal
im Griff hat, und nicht mehr jeden Januar von der Welle der
"unerwartbaren" Buchung überrascht wird hinterlässt das schon ein sehr
gutes Gefühl. Und Emacs macht es mit dem Ledger Mode schon recht
einfach schnell einwandfreie Buchungssätze zu schreiben
&lt;/p&gt;
&lt;h2 class="collapsible" id="org8a26ed5"&gt;Automatische Namensergänzung&lt;/h2&gt;
&lt;div id="outline-container-org8a26ed5" class="outline-2 collapsme"&gt;
&lt;div class="outline-text-2" id="text-org8a26ed5"&gt;
&lt;p&gt;
Eine grosse Fehlerquelle besteht darin, dass die Kontonamen (die ja in
der Regel auch noch innerhalb von Kategorien liegen) schnell sehr lang
werden können. Ausgaben:Wohnen:Nebenkosten:GasWasser ist durchaus ein
ganz gewöhnlicher Kontenname. Der Ledger Mode liest beim laden der
Datei alle Konten ein und es reicht ab dann die einzelnen Teile der
Bezeichnung zu beginnen, und dann einfach per Tab-Completion
automatisch ergänzen zu lassen. Neben der eingesparten Zeit beim
Tippen können so auch keine Tippfehler mehr entstehen.
&lt;/p&gt;

&lt;p&gt;
Apropos Tippfehler in Kontennamen. Ledger bietet die Möglichkeit bei
unbekannten Konten in einer Buchung, dieses Konto einfach nebenbei zu
erzeugen. So verführerisch diese Option auch ist sollte davon Abstand
genommen werden, und stattdessen lieber die gegenteilige Einstellung
zur Norm werden. 
&lt;/p&gt;

&lt;p&gt;
Dann weigert sich Ledger zu arbeiten sobald ein Konto bebucht werden
soll, dass vorher nicht explizit eingerichtet wurde. Diese Weigerung
mag anfangs lästig erscheinen, aber wenigstens gibt Ledger dann genau
an welches Konto falsch geschrieben wurde, wenn man sich doch mal
vertippt. Ohne dies Meldung staht man ansonsten vor der
Herausforderung einfach nur falsche Werte in seinen Konten zu haben,
und die Ursache aus hunderten Buchungen herauslesen zu müssen.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 class="collapsible" id="org81c8469"&gt;Unterstützter Realitätsabgleich.&lt;/h2&gt;
&lt;div id="outline-container-org81c8469" class="outline-2 collapsme"&gt;
&lt;div class="outline-text-2" id="text-org81c8469"&gt;
&lt;p&gt;
Eine weitere Hilfe, damit die Buchführung nicht von der Realität
abweicht, ist ein regelmmässiger Kontenabgleich ich mache das für mein
Girokonto, und die Kreditkarte anhand der Kontoauszüge und für das
Bargeld indem ich einfach den Inhalt meines Portemonaies auf den
Schreibtisch entleere. 
&lt;/p&gt;

&lt;p&gt;
In jedem Fall erhalte ich so den Kontostand, den auch meine
Buchführung aufweisen &lt;b&gt;sollte&lt;/b&gt;. Die Reconcile Funktion des Ledger Modes
fragt mich beim Aufruf nach diesem Wert, und gibt mir anschliessend
eine Auflisteung aller Buchungen, die ich noch nicht abgeglichen
habe. Nun kann ich mich mit meinem Kontoauszug in der Hand hinsetzen
und alle Buchungen markieren, die ich in Ledger ebenfalls sehe. Dabei
bekomme ich ständig die Differenz meiner bestätigten Buchungen zur
Realität angezeigt. Sobald diese Differenz 0 beträgt ist der Abgleich
erledigt, und aus den temporären markierungen werden endgültige.
Um diese so markierten Buchungen muss ich mich danach nie wieder kümmern.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 class="collapsible" id="org6d48976"&gt;Automatische Reportupdates&lt;/h2&gt;
&lt;div id="outline-container-org6d48976" class="outline-2 collapsme"&gt;
&lt;div class="outline-text-2" id="text-org6d48976"&gt;
&lt;p&gt;
Gerade beim Bargeld ist so ein Realitätsabgleich manchmal schwierig,
denn er setzt voraus, dass man jeden Cent den man irgendwo für einen
Schkoriegel ausgegeben hat, irgendwie in die Buchführung bekommt. Aus
diesem Grund empfehle ich für den Anfang die BArgeldums"tze einfach zu
minimieren und vieles mit der Karte zu bezahlen. Das Geld was man dann
noch am Geldautomaten abholt kann man dann entweder einem allgemeinen
Konto zuordnen, oder nach Gefühl aufteilen. Nur wer es hier genauer
wissen will und entsprechen diszipliniert bucht wird Spass damit
haben.
&lt;/p&gt;

&lt;p&gt;
Ich nutze sowieso für kleine Notizen ein USB Diktiergerät und so
klappt auch die Bargeldbuchführung recht gut. Falls ich mal ein wenig
mehr Arbeit damit habe meine Ausgaben nachzuvollziehen, ist es sehr
hilfreich das Emacs mir in einem zweiten Fenster den Verlauf meiner
Ausgaben und Einnahmen (wenn ich am Geldautomaten war) im Portmonai zu
zeigen, und sofort zu aktualisieren, wenn ich Buchungen hinzufüge.
&lt;/p&gt;

&lt;p&gt;
Angenommen ich dachte, das ich vor zwei Wochen mal 15 Euro beim
Chinamann ausgegeben habe, sehe ich beim eintragen so sofort, dass da
irgendetwas nicht stimmen kann, weil zwar die Endsumme meines
Bargeldkontos dem entspricht, was ich im Portemonaie habe (und somit
die 15 Euro tatsächlich ausgegeben wurden) aber der Zeitpunkt nicht
stimmen kann, weil mein Portemonaie ansonsten zwischenzeitlich im
Minus gewesen wäre, was bei Bargeld einfach nicht möglich ist.
&lt;/p&gt;

&lt;p&gt;
Offensichtlich war es also nicht vor 2 sondern vor einer Woche,
&lt;b&gt;nachdem&lt;/b&gt; ich zwischendurch am Geldautomaten war. Ich kann meine Buchung
durch die Zeit schieben, und sehe im Report sofort live, ob eine
Buchung evtl so nicht möglich gewesen sein kann.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 class="collapsible" id="org0557c8d"&gt;Automatisches Grossreinemachen&lt;/h2&gt;
&lt;div id="outline-container-org0557c8d" class="outline-2 collapsme"&gt;
&lt;div class="outline-text-2" id="text-org0557c8d"&gt;
&lt;p&gt;
Auch wenn dies Funktion eigentlich nichts umwerfendes ist, ist es doch
ungeheuer praktisch wenn man bei der Erfassung von Buchungen nicht
darauf achten muss wohin in der Datei man seine Buchng schreibt, oder
ob man auch alle Dezimalpunkte untereinander schreibt. Der Ledger
Mode hat sowohl für die lesbare Formatierung, wie auch die zeitliche
Sortierung von Buchungen Funktionen. Ich habe es mir besonders
einfach gemacht und rufe dieses "hübsch machen" einfach per Hook bei
jedem Speichern meiner Ledger Datei auf. So sind immer alle Daten
lesefreundlich formatiert
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;</description><category>emacs</category><category>ledger</category><guid>https://plaindrops.de/de/blog/2020/finance-under-control-2/</guid><pubDate>Fri, 21 Feb 2020 12:00:00 GMT</pubDate></item><item><title>Finanzen im Griff mit Ledger (1) - Grundlagen</title><link>https://plaindrops.de/de/blog/2019/finance-under-control-1/</link><dc:creator>Andy Drop</dc:creator><description>&lt;p&gt;
Wer von uns kennt das nicht. Am Ende des Geldes ist noch eine ganze Menge Monat übrig, und die Zeit nutzen dann das Gaswerk und der Goldfischzüchterverein, Ihren Jahresbeitrag (inklusive der Preiserhöhung) vom Konto einzuziehen.
&lt;/p&gt;

&lt;p&gt;
Ich hatte auch mal eine Zeit, in der ich nur mit einer Menge Finanzjonglage von Monat zu Monat kam, obwohl ich genau so viel Geld zur Verfügung hatte wie heute. Ich hatte es nur nicht so gut unter Kontrolle. Das Kernproblem war eigentlich, das ich fast nie wusste, wie viel von dem Geld, das auf meinem Konto war nun wirklich zu meiner freien Verfügung stand, und welche Rechnungen in der nächsten Zeit auf mich zu kommen sollten.
&lt;/p&gt;

&lt;p&gt;
Und dann habe ich mich irgendwann hingesetzt und beschlossen das zu ändern. Zunächst mit Bleistift und Papier, später dann mit Unterstützung des PCs. Dabei habe ich diverse Systeme versucht, Hängengeblieben bin ich schlussendlich bei Ledger. Im vergangenen Jahr habe ich immer mal wieder kleine Tests gemacht, wie ich meinen Umgang mit Geld damit abbilden kann, und da es dabei keine größeren Schwierigkeiten gab, habe ich zum Jahresbeginn 2019 komplett auf Ledger umgestellt.
&lt;/p&gt;
&lt;!-- TEASER_END --&gt;
&lt;h2 class="collapsible" id="orgb33c6d7"&gt;Was kann Ledger (Buchungen &amp;amp; Transaktionen))&lt;/h2&gt;
&lt;div id="outline-container-orgb33c6d7" class="outline-2 collapsme"&gt;
&lt;div class="outline-text-2" id="text-orgb33c6d7"&gt;
&lt;p&gt;
Eigentlich kann ledger nur sehr wenige Dinge, aber bei denen ist es sehr flexibel, so dass sich eine Menge Anwendungsfälle damit abdecken lassen.
&lt;/p&gt;

&lt;ol class="org-ol"&gt;
&lt;li&gt;Es liest eine oder mehrere Textdateien mit Buchungen&lt;/li&gt;
&lt;li&gt;Es summiert diese Buchungen (und unterscheidet dabei die Konten auf denen gebucht wird)&lt;/li&gt;
&lt;li&gt;Es gibt entweder den Buchungsverlauf, oder die Summen auf dem Bildschirm aus&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;
Vor allem fällt auf, das Ledger auf keinen Fall in den Buchungen in meinen Dateien rumschreibt. &lt;b&gt;Ich&lt;/b&gt; schreibe meine Buchungen, und Ledger wertet sie lediglich aus. Darin ist es sehr schnell und präzise.
&lt;/p&gt;

&lt;p&gt;
Mal ein Beispiel:
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;2019-03-10  Tankstelle
   Benzin        50.00 
   Girokonto   -50.00
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;
Was wir hier sehen, ist eine Transaktion. Das ist der Baustein, mit dem wir in Ledger am häufigsten zu tun haben. Er besteht aus dem Kopf, der angibt, wann die Transaktion stattgefunden hat und wer der Partner dabei war (hier die Tankstelle), sowie aus einer Anzahl Buchungen (diese sind jeweils etwas eingerückt).
Buchungen sind der kleinste Baustein, mit dem wir in Ledger zu tun haben. Eine Buchung nennt ein Konto, und einen Betrag, der dem Konto hinzugefügt (oder abgezogen falls der Betrag negativ ist) wird . Mehrere dieser Buchungen bilden eine Transaktion.
&lt;/p&gt;

&lt;p&gt;
Das wesentliche Merkmal einer Transaktion ist, dass sich die Buchungen IMMER  auf 0 aufsummieren müssen. Andernfalls ist die Transaktion nicht gültig, und erzeugt einen Abbruch mit einem Fehler in Ledger.
&lt;/p&gt;

&lt;p&gt;
In der Konsequenz bedeutet dass, dass es zu jeder Buchung mindestens eine Gegenbuchung geben muss. Eine Transaktion besteht also aus immer mindestens zwei Buchungen, und wird daher landläufig auch "doppelte Buchführung " genannt. Jeder Euro, der von einem Konto kommt, muss auf einem anderen Konto landen.
&lt;/p&gt;

&lt;p&gt;
Wenn ich Ledger das obige Beispiel auswerte und mir die Summen anzeigen lasse sagt es mir beipielsweise, das sich auf dem Konto Benzin nun 50.00 befinden, und mein Girokonto nun mit 50.00 in den Miesen ist.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 class="collapsible" id="orgd27329a"&gt;Konten&lt;/h2&gt;
&lt;div id="outline-container-orgd27329a" class="outline-2 collapsme"&gt;
&lt;div class="outline-text-2" id="text-orgd27329a"&gt;
&lt;p&gt;
"Ist doch super", wirst du nun sagen, "wenn ich die 50.00 Euro noch mal brauche, dann buche ich sie einfach vom Benzinkonto wieder ab, und…". Aber so funktioniert das offensichtlich nicht. Die Tankstelle wird es nicht mögen wenn du bei Ihr wieder abbuchst. Auch wenn du das von der reinen Buchhaltung her einfach machen könntest.
&lt;/p&gt;

&lt;p&gt;
In der Realitat benutzt man daher ein paar Kategorien von Konten, die man dann im Verlauf nur für bestimmte Arten von Buchungen benutzt.  Das nennt sich dann Kontenrahmen, und kann theoretisch von jedem so gemacht werden, wie er Lust und Laune hat. In der Praxis haben sich aber eine Handvoll Kontenrahmen bewährt, die sogar teilweise soweit standardisiert wurden, das unterschiedliche Firmen mit gleichen Kontenrahmen arbeiten.
&lt;/p&gt;

&lt;p&gt;
Fur mich als Privatanwender hat sich ein Kontenrahmen bewährt, der aus 6 Kategorien besteht
&lt;/p&gt;
&lt;/div&gt;
&lt;h3 class="collapsible" id="org5cd7997"&gt;Einnahmen&lt;/h3&gt;
&lt;div id="outline-container-org5cd7997" class="outline-3 collapsme"&gt;
&lt;div class="outline-text-3" id="text-org5cd7997"&gt;
&lt;p&gt;
Irgendwoher muss das Geld ja kommen, und hier finden sich alle Konten wieder, auf denen das Geld quasi " entsteht".  Wir erinnern uns: Wenn mein Gehalt auf meinem Girokonto ankommt braucht es ja eine entsprechende Gegenbuchung.
&lt;/p&gt;

&lt;p&gt;
Daher sieht die Buchung dann so aus
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;2019-03-01 Firma Baumeister
   Einnahmen:Gehalt   -2000.00
   Haben:Girokonto  2000.00
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;
Während mein Girokonto immer voller wird laufen die Einnahmekonten immer mehr ins negative. Was ja auch der Realität entspricht. Wenn ich Gehalt bekomme, wird meine Firma etwas ärmer.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 class="collapsible" id="orgc06d108"&gt;Ausgaben&lt;/h3&gt;
&lt;div id="outline-container-orgc06d108" class="outline-3 collapsme"&gt;
&lt;div class="outline-text-3" id="text-orgc06d108"&gt;
&lt;p&gt;
Das Gegenteil ist der Fall wenn ich Geld ausgebe
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;2019-03-10  Tankstelle
   Ausgaben:Benzin    50.00 
   Haben:Girokonto   -50.00
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;
Wenn ich von meinem Girokonto eine Rechnung bezahle, dann muss das Geld ja irgendwo "verschwinden", und das tut es ausschliesslich auf Konten der Kategorie "Ausgaben". In Ledger sprich man eigentlich nicht von Kategorien, sondern nur von Konten. Konten können auch Unterkonten enthalten (z.B.) Ausgaben:Nebenkosten:Gas und Ausgaben:Nebenkosten:Wasser. Wenn ich mit diesen Konten nun so etwas buche:
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;2019-03-09 Stadtwerke
   Haben: Girokonto  -100.00
   Ausgaben:Nebenkosten:Gas  50.00
   Ausgaben:Nebenkosten:Wasser 40.00
   Ausgaben:Nebenkosten: 10.00
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;
Dann sieht man das hier vom Girokonto eine Rechnung von 100 Euro der Stadtwerke bezahlt wurden, die komplett auf dem Konto Nebenkosten gelandet sind. Davon 50.00 auf dem Konto für Gas und 40.00 auf dem Konto für Wasser. Ausserdem hat die Stadtwerke mir noch eine Allgemeine Gebühr von 10.00 berechnet, die ich nicht direkt dem Gas oder Wasser zuordnen kann, die aber doch zu den Nebenkosten gehören. Hier sieht man auch, das eine Transaktion &lt;b&gt;mindestens&lt;/b&gt; zwei Buchungen enthalten muss, es dürfen aber auch mehr sein. Sie &lt;b&gt;müssen&lt;/b&gt; sich nur zu 0 summieren.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 class="collapsible" id="org2993d69"&gt;Haben&lt;/h3&gt;
&lt;div id="outline-container-org2993d69" class="outline-3 collapsme"&gt;
&lt;div class="outline-text-3" id="text-org2993d69"&gt;
&lt;p&gt;
Ist eigentlich ganz einfach. Hierunter fallen alle Konten auf denen sich üblicherweise Geld befindet, also das Girokonto,das Sparbuch, das Portemonaie. Es ist Geld (oder Werte) das ich habe. Wenn mir ein Konto Zinsen abwirft, handelt es sich sehr wahrscheinlich um ein Haben-Konto
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 class="collapsible" id="org9b2447e"&gt;Soll&lt;/h3&gt;
&lt;div id="outline-container-org9b2447e" class="outline-3 collapsme"&gt;
&lt;div class="outline-text-3" id="text-org9b2447e"&gt;
&lt;p&gt;
Das sind quasi Schulden die ich irgendwo habe. In der Regel erkenne ich Soll-Konten daran, das ich Zinsen dafür zahle, denn irgendjemand hat mir hier Geld zur Verfügung gestellt. Typischerweise sind das Baukredite oder die Kreditkarte. 
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 class="collapsible" id="orgf1622ee"&gt;Ausgleich&lt;/h3&gt;
&lt;div id="outline-container-orgf1622ee" class="outline-3 collapsme"&gt;
&lt;div class="outline-text-3" id="text-orgf1622ee"&gt;
&lt;p&gt;
Ausgleichskonten sind Konten, die es in einer perfekten Buchhaltungswelt eigentlich nicht geben sollte. Leider ist die Welt aber nicht perfekt, Und daher habe ich mir zwei Unterkonten fur Ausgleichsbuchungen angwöhnt
&lt;/p&gt;

&lt;ol class="org-ol"&gt;
&lt;li&gt;&lt;p&gt;
Ausgleich:Einstandsbuchung
&lt;/p&gt;

&lt;p&gt;
Dieses Konto benutze ich genau 1 mal am Anfang der Buchführung, und danach &lt;b&gt;nie wieder&lt;/b&gt;. Wenn ich irgendwann heute mit der Buchführung anfange, dann ist ja auf meinem Girokonto bereits Geld, und meine Kreditkarte ist bereits im Minus. Ich buche also auf mein Girokonto das Geld drauf, das heute drauf sein soll, und die Gegenbuchung geht dann halt gegen das Konto Einstandsbuchung.
&lt;/p&gt;

&lt;p&gt;
Hier wird also tatsächlich Geld aus sehr dünner Luft erzeugt. Damit das nicht zum schummeln benutzt wird, Habe ich genau eine Buchung ganz am Anfang, und danach nie wieder.
&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;
Ausgleich:Ausgleichskonto.
&lt;/p&gt;

&lt;p&gt;
Da ich auch mein Bargeld (also das Portemonaie) mitverwalte kann es natürlich auch mal passieren, dass ich einfach weniger Geld im Portemonaie habe, als eigentlich laut meiner Buchhaltung drin sein sollte. Mal verliere ich Geld in der Waschmaschine, oder sonstwo, Manchmal taucht Geld unverhofft im Flusensieb wieder auf.
&lt;/p&gt;

&lt;p&gt;
Für all sowas gibt es dieses Konto als Gegenkonto zum Portemonaie. Das Konto sollte so selten wie möglich verwendet werden, und es sollte möglichst wenig von 0 abweichen. Wenn das nicht mehr gewährleistet ist, ist das ein sicheres Zeichen für ein generelles Problem mit der Disziplin beim Buchen, oder beim Ausgeben von Bargeld.
&lt;/p&gt;

&lt;p&gt;
Wenn ich z.B weiss, das ich am Abend vorher 50.00 bei einem feuchtfröhlichen Zug durch die Gemeinde ausgegeben habe, und das auch so buche, mir aber irgendwie 51.00 in meinem Portemonaie fehlen, dann buche ich einfach 51.00 Euro auf das Freizeitkonto, und benutze für den verschwundenen Euro nicht extra das Ausgleichskonto. Erst wenn ich mir das Verschwinden absolut nicht mehr sinnvoll erklären kann, ist das ein Fall fur dieses Konto.
&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 class="collapsible" id="orgf7155d4"&gt;Budget&lt;/h3&gt;
&lt;div id="outline-container-orgf7155d4" class="outline-3 collapsme"&gt;
&lt;div class="outline-text-3" id="text-orgf7155d4"&gt;
&lt;p&gt;
Eigentlich bringt Ledger von Hause aus eine Funktionalität mit, mit der ich Budgets (also Geld, das für bestimmte Ausgaben reserviert ist) verwalten kann. Leider ist diese etwas beschränkt, was die Flexibilität angeht. Ich simuliere also mittels des Kontos Budget und seiner Unterkonten ein Verfahren, das sich schon bei meiner Großmutter bewährt hat, um Geld fur später an die Seite zu legen: Briefumschläge.
&lt;/p&gt;

&lt;p&gt;
Immer wenn mein Gehalt kommt packe ich In jeden dieser Briefumschläge ein wenig Geld. Und wenn dann die Autoversicherung abbucht, mache ich diesen Umschlag auf, und er enthält genau die Summe, die ich erwartungsgemäss zu zahlen habe.
Natürlich fülle ich diese Umschläge nicht wörtlich. Sie existieren nicht einmal. Sie sind lediglich virtuelle Briefumschläge, und das Konto Budget ist ein Unterkonto meines Girokontos. Die Bank kennt dieses Unterkonto nicht. Aus Sicht der Bank habe ich 300 Euro auf meinem Girokonto. Ledger kann mir aber auf diese Art anzeigen, das von diesen 300 Euro sich bereits 180 in einem virtuellen Briefumschlag mit der Aufschrift Autoversicherung befinden, und mir daher nur noch 120 Euro zur freien Verfügung stehen
&lt;/p&gt;

&lt;p&gt;
Die dadurch notwendigen Buchungssätze einer Transaktion  können manchmal schon sehr verwirrend wirken, aber mit etwas Übung ist das machbar. Ich werde darauf noch ausführlich eingehen.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 class="collapsible" id="org8fc4cff"&gt;Arbeitserleichterungen&lt;/h2&gt;
&lt;div id="outline-container-org8fc4cff" class="outline-2 collapsme"&gt;
&lt;div class="outline-text-2" id="text-org8fc4cff"&gt;
&lt;p&gt;
Wie schon zu Anfang erwähnt liest Ledger die Dateien lediglich, und wertet sie aus. Zu keiner Zeit schreibt Ledger in eine der Dateien irgendetwas hinein (es gibt eine kleine Ausnahme, die man explizit anfordern muß, und die man fast nie braucht)
&lt;/p&gt;

&lt;p&gt;
Das bedeutet aber auch, dass ich die kompletten Buchungen selbst mit der Hand tippen muss, inklusiver der passenden Gegenbuchungen. die Kontonamen dürfen keine Tippfehler enthalten (was bei Namen wie Ausgaben:Haushalt:Lebensmittel:Biokiste schon mal spannend werden kann) Wenn ich ein Konto einmal Abwassergebühr und einmal Schmutzwassergebühr nenne, dann sind das für Ledger zwei komplett verschiedene Konten, die es dann jeweils einzeln aufsummiert, und niemals zusammenführt
&lt;/p&gt;

&lt;p&gt;
Gegen diese sehr aufwändige und fehleranfällige Tipparbeit hat Ledger nun einige Vereinfachungen auf Lager:
&lt;/p&gt;
&lt;/div&gt;
&lt;h3 class="collapsible" id="org07a0694"&gt;Der Kontenrahmen&lt;/h3&gt;
&lt;div id="outline-container-org07a0694" class="outline-3 collapsme"&gt;
&lt;div class="outline-text-3" id="text-org07a0694"&gt;
&lt;p&gt;
Natürlich werde ich mich im Laufe der Zeit mal irgendwann bei einem Kontonamen vertippen. Und bevor ich dann Geld auf irgendwelche Konten namens Ausgaben:Atuovresicherung buche und mich wundere, das auf dem echten Konto keine Veränderung passiert, ist es doch besser, wenn Ledger das kontrolliert.
&lt;/p&gt;

&lt;p&gt;
Ledger lässt sich so konfigurieren, das ich ihm einmal sage, welche Konten ich verwenden möchte, und wie der gesamte Kontenrahmen (also alle meine Konten und Unterkonten) aufgebaut ist. Danach kann ich nur noch diese Konten verwenden. Jeder Tippfehler wird gnadenlos angemeckert, und Ledger weigert sich so lange meine Buchungen auszuwerten, bis der Fehler behoben ist. Gott sei Dank sagt er mir sehr genau, wo das Problem liegt
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 class="collapsible" id="orgc62c2d1"&gt;Aliase&lt;/h3&gt;
&lt;div id="outline-container-orgc62c2d1" class="outline-3 collapsme"&gt;
&lt;div class="outline-text-3" id="text-orgc62c2d1"&gt;
&lt;p&gt;
Ein Konto mit dem Namen  Ausgaben:Haushalt:Lebensmittel:Biokiste kann beim Tippen schon sehr aufhalten, Daher bietet Ledger die Möglichkeit statt dieser Wortmonster kurze Aliasnamen zu vergeben. Ich muss dann z.B. nur noch "Bio" tippen, und Ledger weiss, das ich dieses Konto damit meine.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 class="collapsible" id="org4a67cb1"&gt;Die Leerbuchung&lt;/h3&gt;
&lt;div id="outline-container-org4a67cb1" class="outline-3 collapsme"&gt;
&lt;div class="outline-text-3" id="text-org4a67cb1"&gt;
&lt;p&gt;
Auch bei Beträgen hat man sich schnell mal vertippt, oder verrechnet, welche Summe eine Gegenbuchung haben muss.
Wenn die Stadtwerke von mir z.B. Nachzahlungen haben möchte kann ich einfach schreiben
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;2019-01-02 Stadtwerke
   Gas 12.34
   Wasser  56.78
   Girokonto
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;
Wie man sieht fehlt beim Girokonto der Betrag, und wenn es bei einer Transaktion &lt;b&gt;exakt&lt;/b&gt; ein Konto ohne Betrag gibt, dann nimmt Ledger an dieser Stelle einfach genau den Betrag an, der nötig ist, um die anderen Buchungen auszugleichen. In diesem Fall werden also -69.12 auf das Girokonto gebucht (also 69.12 abgebucht)
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 class="collapsible" id="org89071ca"&gt;Das Standardkonto&lt;/h3&gt;
&lt;div id="outline-container-org89071ca" class="outline-3 collapsme"&gt;
&lt;div class="outline-text-3" id="text-org89071ca"&gt;
&lt;p&gt;
Die meisten von uns haben genau ein Girokonto, und alle Bankbewegungen laufen über dieses eine Konto. Da kann es selbst wenn man als Alias etwas so kurzes wie "Giro" verwendet, schnell lästig sein, das zu jeder Transaktion immer wieder dazu zu schreiben.
Ledger bietet allerdings die Möglichkeit exakt ein Konto zum Standardkonto zu machen, welches danach immer dann angenommen wird, wenn die Transaktion nicht ausgeglichen ist, und das Konto nicht bereits in der Transaktion verwendet wird.
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;2019-01-02 Stadtwerke
   Gas 12.34
   Wasser  56.78
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;
ist also ein gültiger Buchungssatz, wenn vorher z.B. Girokonto als Standardkonto vereinbart wurde. In diesem Fall wird automatisch das Girokonto als Gegenkonto genommen, und der entsprechende Betrag, wie im Abschnitt Leerbuchung erklärt ermittelt.
   Auch
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;2019-01-02 Stadtwerke
   Gas 12.34
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;
ist damit nun eine gültige Buchung, obwohl die Transaktion auf den ersten Blick die Regel verletzt, nach der eine Transaktion aus mindestens 2 Buchungen bestehen muss. Die 2. Buchung geht hierbei auf das vorher festgelegte Standardkonto
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 class="collapsible" id="orgd618897"&gt;Der Ledger Mode&lt;/h3&gt;
&lt;div id="outline-container-orgd618897" class="outline-3 collapsme"&gt;
&lt;div class="outline-text-3" id="text-orgd618897"&gt;
&lt;p&gt;
Wie man sieht hat Ledger schon von Hause aus eine Menge Möglichkeiten, die einem die Tipparbeit erleichtern. Für die Emacs Umgebung gibt es nun sogar den Ledger Mode, der einem die Eingabe noch weiter vereinfacht, indem er z.B. passende Buchungsdaten vorschlägt, oder immer wiederkehrende Buchungen schon nach ein paar getippten Buchstaben vorschlägt, oder gleich vollständig einfügt.  Daneben bietet er noch recht komfortable Funktionen um Berichte zu erstellen, oder die gebuchten Daten regelmäßig mit der Realität abzugleichen. Der Ledger Mode wird aber mal einen eigenen Beitrag Wert sein.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;</description><category>emacs</category><category>ledger</category><guid>https://plaindrops.de/de/blog/2019/finance-under-control-1/</guid><pubDate>Fri, 12 Jul 2019 05:00:00 GMT</pubDate></item><item><title>Medusa -  Die Mutter aller Hydras</title><link>https://plaindrops.de/de/blog/2019/medusa-mother-of-all-hydras/</link><dc:creator>Andy Drop</dc:creator><description>&lt;figure&gt;&lt;img src="https://plaindrops.de/de/blog/2019/medusa-mother-of-all-hydras/medusa.png%20Medusas%20Kopf"&gt;&lt;/figure&gt; &lt;h2 class="collapsible" id="org963d3d3"&gt;Medusa&lt;/h2&gt;
&lt;div id="outline-container-org963d3d3" class="outline-2 collapsme"&gt;
&lt;div class="outline-text-2" id="text-org963d3d3"&gt;
&lt;p&gt;
Eines der Probleme aller Texteditoren ist, das sie eigentlich zwei  verschiedene Funktionen miteinander vereinbaren müssen, die Erfassung von Text, und die Bearbeitung von Text. Das wir uns nur selten bewusst sind wie verschieden diese beiden Aufgaben sind, ist auch Teil des Problems. Unser Verstand neigt dazu nahtlos zwischen diesen beiden Aufgaben hin und her zu wechseln.
&lt;/p&gt;

&lt;p&gt;
Wir schreiben einen Satz, und noch während wir ihn erfassen, bemerken wir, dass nach dem letzten Wort wohl besser ein Komma gewesen wäre, und der der ganze Absatz vielleicht sowieso besser als Zitat Teil der Einleitung gewesen wäre.
&lt;/p&gt;
&lt;!-- TEASER_END --&gt;

&lt;p&gt;
Diese Art zu arbeiten macht es notwendig jederzeit leicht zwischen der Erfassung und der Bearbeitung von Text umschalten zu müssen. Im wesentlichen haben sich dabei 3 Ansätze durchgesetzt. Allen gemein ist, das sich oft die einfachen Funktionen auf eigenen Tasten (Delete, Tab, PageUp, etc…) wieder finden. Fur die komplizierteren Fälle sind üblich:
&lt;/p&gt;

&lt;ol class="org-ol"&gt;
&lt;li&gt;Die Menusteuerung (z.b. Word) mit dem Problem das man fü die Mausbedienung dann mit einer Hand zwischen Maus und Tastatur hin- und herwechseln muss.&lt;/li&gt;

&lt;li&gt;Eine Mehrfachbelegung der Tasten via ALT, CTRL, META, SUPER oder HYPER Tasten. Das ist das Gebiet auf dem Emacs zu Hause ist.&lt;/li&gt;

&lt;li&gt;Ein Leaderkey, also eine Taste die in normalem Text nicht vorkommt, und daher zum Umschalten in den Bearbeitungsmodus dient. Dies ist die Domäne von VIM&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 class="collapsible" id="org79dbb72"&gt;Spacemacs und der Leaderkey&lt;/h2&gt;
&lt;div id="outline-container-org79dbb72" class="outline-2 collapsme"&gt;
&lt;div class="outline-text-2" id="text-org79dbb72"&gt;
&lt;p&gt;
Genau wie ich halten auch die Macher von Spacemacs die Idee mit dem Leaderkey, für den Weg den sie gerne gehen wollen. Sie haben daher das Konzept so weit es ging übernommen und als Konfiguration über ein vorhandenes Emacs gestülpt. Der Charme besteht darin, dass dadurch keine der üblichen Funktionen in Emacs beeinflusst wird und nun beide Arten der Bedienung nebeneinander existieren können. Was dabei in meinen Augen leider verloren gegangen ist, ist der systematischere Aufbau der Funktionen wie sie Emacs üblicherweise mitbringt. Die von Spacemacs ausgelieferten Hydras (eine Art visuelle Menüführung) scheinen  in meinem Kopf nur selten sinnvoll, oder leicht zu merken
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 class="collapsible" id="org1d32deb"&gt;Thing at point&lt;/h2&gt;
&lt;div id="outline-container-org1d32deb" class="outline-2 collapsme"&gt;
&lt;div class="outline-text-2" id="text-org1d32deb"&gt;
&lt;p&gt;
So erscheint z.B. immer die gleiche Hydra, wenn ich den Leaderkey drücke, dabei lassen sich in Emacs unzählige Bedienmodi auswählen, die jeweils völlig unterschiedliche Möglichkeiten der Interaktion erfordern. 
&lt;/p&gt;

&lt;p&gt;
In einem Blogeinrtag von &lt;a href="https://dfeich.github.io/www/org-mode/emacs/2018/05/10/context-hydra.html"&gt;Derek Feichtinger&lt;/a&gt; habe ich neulich eine sehr elegante Lösung gefunden, die nicht nur fü die einzelnen Modi verschiedene Hydra zur Verfügung stellen kann, sonder auch noch in der Lage ist, in dem sehr beliebten &lt;i&gt;Org Mode&lt;/i&gt; festzustellen ob sich der Cursor auf einem Objekt (wie z.B. einem Link oder einer Tabelle) befindet, und dann eine Hydra speziell für dieses Objekt aufzurufen.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 class="collapsible" id="org73955d5"&gt;Fallback&lt;/h2&gt;
&lt;div id="outline-container-org73955d5" class="outline-2 collapsme"&gt;
&lt;div class="outline-text-2" id="text-org73955d5"&gt;
&lt;p&gt;
Das elegante an dieser Lösung ist, das sie zum einen sehr leicht zu erweitern ist, und zum anderen auch die Möglichkeit besteht weiterhin eine Standard-Hydra aufzurufen, wenn keiner der besonderen Fälle vorliegt.
&lt;/p&gt;

&lt;p&gt;
Das bietet gerade auch in der Kombination der verschiedenen Hydras ungeahnte Möglichkeiten. Mein Leaderkey ist zum Beispiel die &amp;lt;menu&amp;gt; Taste, die normalerweise rechts der Leertaste zu finden ist, und bei Windows das Kontextmenü aufruft. Unter Linux hatte die bei mir sowieso noch nie eine sinnvolle Funktion
&lt;/p&gt;

&lt;p&gt;
In jeder einzelnen Hydra belege ich wiederum die &amp;lt;menu&amp;gt; Taste mit der am häufigsten benutzten Funktion. Dadurch kann ich mit dem zweimaligen drücken der Menu Taste z.B. im Org Mode das geiche tun, was sonst Ctrl-C Ctrl-C tut, während im Ledger Mode eine neue Buchung angelegt wird.
&lt;/p&gt;

&lt;p&gt;
Auch hier funktionieren, wie bei der Spacemacs Lösung, weiterhin alle eingebauten Emacs Tasten weiterhin wie gewohnt,  Ich habe mittlerweile alle Hydras, die ich bisher so erstellt habe in das Medusa Projekt integriert, die Sourcen finden sich &lt;a href="https://codeberg.org/dr.ops/medusa"&gt;hier&lt;/a&gt;.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;</description><category>emacs</category><category>hydra</category><category>medusa</category><category>orgmode</category><category>project</category><guid>https://plaindrops.de/de/blog/2019/medusa-mother-of-all-hydras/</guid><pubDate>Tue, 14 May 2019 17:56:29 GMT</pubDate></item><item><title>My perfect typing environment. Finally.</title><link>https://plaindrops.de/de/blog/2018/de-code/</link><dc:creator>Andy Drop</dc:creator><description>&lt;figure&gt;&lt;img src="https://plaindrops.de/de/blog/2018/de-code/de-code_header.png%20A%20schematic%20drawing%20of%20a%20keyboard%20layout%20with%20some%20of%20the%20keys%20marked%20in%20various%20shades%20of%20red"&gt;&lt;/figure&gt; &lt;p&gt;
If you have read my earlier articles about my search for the perfect keyboard, you may have got an idea of what I was looking for. Namely a mechanical keyboard with a decent keyboard layout, optimized for my use case. I mostly do my writing with &lt;a href="https://www.gnu.org/software/emacs/"&gt;Emacs&lt;/a&gt;, and a lot of it is german text and programm code. In the meantime I found my perfect solution, and realized I had no article of it in my blog. So this is it, maybe it is of use for some of you.
&lt;/p&gt;
&lt;!-- TEASER_END --&gt;
&lt;h2 class="collapsible" id="org3ba8714"&gt;The keyboard&lt;/h2&gt;
&lt;div id="outline-container-org3ba8714" class="outline-2 collapsme"&gt;
&lt;div class="outline-text-2" id="text-org3ba8714"&gt;
&lt;p&gt;
My decision finally zeroed in on buying a conventional keyboard with MX-Switches, as they have that exact tactile feeling that is deeply satisfying while I type. They are a bit loud for an office environment with colleagues around, but as I only use the keyboard at home it is ok. I ordered it with some touch of my personal coloring taste, and a special keyboard layout, that I gave some thought beforehand.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 class="collapsible" id="org03a3630"&gt;The thoughts&lt;/h2&gt;
&lt;div id="outline-container-org03a3630" class="outline-2 collapsme"&gt;
&lt;div class="outline-text-2" id="text-org03a3630"&gt;
&lt;p&gt;
Some of the thoughts I had, before I ordered the keyboard, were going into the use cases I have, and in the constraints that a normal keyboard is delivering to this use cases. Namely:
&lt;/p&gt;

&lt;ul class="org-ul"&gt;
&lt;li&gt;&lt;p&gt;
I type a lot of programming code
&lt;/p&gt;

&lt;p&gt;
The optimal keyboard layout for that would be most probably an american, because most programming languages were developed with an american keyboard in mind. Characters like [, { or | are easily reachable on those keyboards. Sadly
&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;
I write a lot of german text
&lt;/p&gt;

&lt;p&gt;
and that means I absolutely want to have Umlauts in my layout. The german layout has those keys to the right of the keyboard, where they rule out some of that keys that are crucial for programming on an american board. As a consequence the german layout makes heavy use of the AltGR key to shift into a layer in which those keys are reachable. Unfortunatly this key is normally pressed with the least sensible finger, the pinky. Which leads me to the next issue,
&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;
I write in Emacs
&lt;/p&gt;

&lt;p&gt;
The Emacs community has a concept that is called "&lt;a href="https://www.emacswiki.org/emacs/RepeatedStrainInjury"&gt;Emacs pinky syndrome&lt;/a&gt;" and refers to he fact that Emacs makes heavy use of all your auxiliary keys like Shift, Ctrl or Alt. there is an often quoted saying, that Emacs is just an abbreviation for Escape-Meta-Alt-Ctrl-Shift. And for most of that keys you have to press some letters with your left pinky on one of that keys. Sometimes even more than one of it.
&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 class="collapsible" id="org45859ea"&gt;The layout&lt;/h2&gt;
&lt;div id="outline-container-org45859ea" class="outline-2 collapsme"&gt;
&lt;div class="outline-text-2" id="text-org45859ea"&gt;
&lt;p&gt;
The gist of that matter was space. I needed the space for the german Umlauts, as well as those coding keys, that are to find in an american layout. Oh, and more Meta-keys would be of help for Emacs, to eliminate those long key combinations that are hard to memorize.
&lt;/p&gt;

&lt;p&gt;
The solution got in reach, when I realized that I nearly never use the numbers in the numbers row at the top of the keyboard. Instead of there, I type them on the number pad to the right. And there it was: SPACE, THE FINAL FRONTIER! Ah, and &lt;a href="https://uxmag.com/articles/the-trouble-with-caps-lock-wtfux"&gt;nobody needs CapsLock&lt;/a&gt; either.
&lt;/p&gt;

&lt;p&gt;
So I began to move all those keys that are only reachable via the AltGr key to the upper number row, leaving as much characters as possible in place that were already in the top row except numbers. All brackety chars ({[&amp;lt;&amp;gt;]}) are now on only 4 keys (7,8,9,0) which causes the only relocation that was needed. The = char had to move to the right to give way for the &amp;gt;, and so also the ? had to move and I chose to place it on the key where the 1 once was, so it is right below the !. 
&lt;/p&gt;

&lt;p&gt;
Following the same idea the ' was placed on the same key as the " so I have all quoting chars on one key, To use the normal chars used for quoting a string there is now no need for a Shift key anymore. That made place for the ~ which moved a key down, and can now be typed with just Shift instead of the pinky-heavy AltGr.
&lt;/p&gt;

&lt;p&gt;
The only two keys left where now the | which I moved to the same key as the &amp;amp; (both are used in many programming languages as logical AND and OR). The now empty key on the lower left became home to the backslash, together with the normal slash as the un-shifted key.
The @ sign found it's home at the place of the former 3 together with the Euro sign when shifted.
&lt;/p&gt;

&lt;p&gt;
You can see the result in the following image:
&lt;/p&gt;

&lt;p&gt;
&lt;img src="https://plaindrops.de/images/de-code.png" alt="nil"&gt;
&lt;/p&gt;

&lt;p&gt;
To make Emacs a little bit easier to use I also made CapsLock the Super-key and the now unneeded AltGr became the Hyper-key. The Alt-key was named Meta (that would have been the correct name for it's function anyways).
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 class="collapsible" id="orgeaeb7ee"&gt;Conclusion&lt;/h2&gt;
&lt;div id="outline-container-orgeaeb7ee" class="outline-2 collapsme"&gt;
&lt;div class="outline-text-2" id="text-orgeaeb7ee"&gt;
&lt;p&gt;
Within two weeks I had fully memorized the positions of the moved keys, and I don't mix them up with the traditional layout I use at the office computer. This risk was, what held me back from using the &lt;a href="https://www.neo-layout.org/"&gt;NEO Layout&lt;/a&gt;, which is also optimized for Germans and programming use.
&lt;/p&gt;

&lt;p&gt;
The &lt;a href="https://en.wikipedia.org/wiki/Symbolics#/media/File:Symbolics-keyboard.jpg"&gt;Super and Hyper keys&lt;/a&gt; are great when using Emacs. I made me a still growing set of &lt;a href="https://github.com/abo-abo/hydra"&gt;Hydras&lt;/a&gt; and mapped it to the Hyper key (Hyper/Hydra made it very easy to memorize). The Super key becomes more useful to call whole Emacs modes like &lt;a href="https://www.emacswiki.org/emacs/mu4e"&gt;mu4e&lt;/a&gt;, &lt;a href="https://magit.vc/"&gt;magit&lt;/a&gt; or calendar modes.
&lt;/p&gt;

&lt;p&gt;
As a side effect I never get stuck in CapsLock anymore, so no more badly typed password three times in a row.
&lt;/p&gt;

&lt;p&gt;
The feeling that "something is wrong" while I type had completely gone, and now it feels so naturally, that i'm far less distracted, and could finally better concentrate on the content.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;</description><guid>https://plaindrops.de/de/blog/2018/de-code/</guid><pubDate>Mon, 22 Oct 2018 22:00:00 GMT</pubDate></item></channel></rss>