Bastelstart 2023: Klebezettel für Notepad++
Das Jahr fängt gut an, eine neue Funktion für meinen Editor, und AutoHotkey ist auch dabei ;)
Digitale Post-it-Derivate gibt es reichlich, auch als Open-Source-Software. Was mir aber meist nicht gefällt ist, dass alle Notizen vom Hauptprogramm abhängig sind. Und auch die vielen Optionen will ich nicht, nur simple unabhängige Einweg-Klebezettelchen in klassischem Gelb, so aus Prinzip. Und am liebsten würde ich sie aus Notepad++ heraus generieren. Dann ist es nämlich schön einfach, Teile bestehender Dokumente auf die Notizen zu bringen, zum Beispiel Code-Schnipsel. Und seltsamerweise gab es dieses Tool so nicht ...
Dann halt basteln
Also nochmal kurz meine Anforderungen: Ich wollte Text markieren und per Tastenkürzel in einen Klebezettel überführen. Und dieser sollte klassisch gelb sein, immer im Vordergrund und komplett eigenständig. Und als kleinen Bonus habe ich noch einen Button notiert, mit dem der Inhalt des Klebezettels kopiert werden kann. Und natürlich: Der Klebezettel sollte editierbar sein.
Der grundsätzliche Weg war eigentlich ziemlich klar: Vor einiger Zeit habe ich hier einen Artikel geschrieben, wie man per Tastenkürzel HTML-Links aus markiertem Text generieren kann - ein Tool, das ich tatsächlich ständig nutze. In dem Fall ging es um einen nutzerdefinierten Befehl (Custom Command) in Notepad++, der ein kleines Batch-Skript gestartet hat.
Auch für mein Post-it-Derivat sollte es wieder ein Custom Command sein, nun aber zum Auslösen eines AutoHotkey-Skripts - schließlich geht es um Fenster unter Windows und da ist AutoHotkey immer erste Wahl. Eigentlich alles easy. Trotzdem: Zwei kleine Problemchen sollten dann doch auftauchen, natürlich. Zum einen ein paar liebe Anführungszeichen in Notepad++, zum anderen die Farbe Gelb mit AutoHotkey.
Notepad++: Custom Command
Die Konfiguration findet in C:\Users\%USERNAME%\AppData\Roaming\Notepad++\shortcuts.xml statt. Für ein Kommando, das dann im Menü Ausführen erscheint, braucht es hier nur einen simplen Eintrag, der das AutoHotkey-Skript (hier mlnote.ahk) ausführt und als Argument den markierten Text übergibt:
<command name="ML_Notes" Ctrl="yes" Alt="yes" Shift="yes" Key="0"/>"D:\Arbeit\Scripting\Notepadstuff\mlnote.ahk" $(CURRENT_WORD)
Hier wird zunächst das Tastenkürzel definiert (nur ein Dummy, das geht über die GUI einfacher), dann der Pfad zum Skript angegeben. Und dann folgt das Problemchen: Die Variable CURRENT_WORD beinhaltet den markierten Text. In meinem Fall wird es sich um kleine Listen und dergleichen handeln - also mehre Wörter und mehrere Zeilen. Und diese würden dann als einzelne Argumente ans Skript übergeben. Aber natürlich soll das Skript den ganzen Text als ein Argument verstehen. Die obige Notation entspricht den vorgegebenen Kommandos - und tut das nicht.
Es fehlen natürlich die Anführungszeichen. Und wie Ihr schon oben seht, gibt es hier gleich zwei Varianten, nämlich ""
und die HTML-Notation (quot für quotation mark). Und der Gewinner ist:
<command name="ML_Notes" Ctrl="yes" Alt="yes" Shift="yes" Key="0"/>"D:\Arbeit\Scripting\Notepadstuff\mlnote.ahk" "$(CURRENT_WORD)"
Mit der HTML-Notation um CURRENT_WORD wird nun der gesamte markierte Text in Anführungszeichen gesetzt und somit als ein einzelnes Argument an das Skript übergeben.
AutoHotkey-Skript
Das Skript kann übergebene Argumente in der Form %1%, %2% und so weiter ansprechen, einfach durchnummeriert. Und da es keine Variable für alle Argumente gibt, mussten die Anführungszeichen sein. Nun, mittlerweile werden Argumente als Array übergeben, was weitere Möglichkeiten offeriert, ist hier aber alles zu kompliziert.
Im Grunde ist das Skript super simpel: Der als Argument übergebene Text wird in der Variablen text gespeichert, dann wird das Fenster mit einem Button und einem editierbaren Textfeld ("Edit") gebaut, welches den Text enthält.
; Standard-Vorgabe von AutoHotkey:
#NoEnv ; Recommended for performance and compatibility with future AutoHotkey releases.
SendMode Input ; Recommended for new scripts due to its superior speed and reliability.
SetWorkingDir %A_ScriptDir% ; Ensures a consistent starting directory.
; Skript:
#SingleInstance Off
#Include %A_ScriptDir%\Class_CtlColors.ahk
text = "%1%"
Gui +AlwaysOnTop
Gui Font, s16
Gui Color, 0xFFFF80
Gui, Show, w400 h500,Notiz
Gui, Add, Edit, hwndED1 x10 y50 w380 h440, %text%
CtlColors.Attach(ED1, "FFFF80", "")
Gui, Font, s12
Gui, Add, Button, gkopieren x10 y10 w70 h30, &Copy
return
GuiEscape:
GuiClose:
ExitApp
kopieren:
ControlGetText,clipboard, Edit1
Fast alles hier ist Standard, erstmal zum Banalen:
Die Anweisung #SingleInstance Off erlaubt mehrere Instanzen, sprich mehrere Klebezettel.
Die ganzen Gui-Zeilen gestalten schlicht das Fenster, das meiste dürfte selbsterklärend sein.
Der kopieren:-Part gehört zum Button, der über gkopieren eben diese Funktion auslöst; hier also das Kopieren des Texts in die Zwischenablage.
Und jetzt zum Spaßigen:
Das Einfärben des Fensters ist kein Problem, ein schlichtes Gui Color, 0xFFFF80 erledigt das. Aber das Edit-Element lässt sich nicht so einfach kolorisieren, daher wird mit der Include-Anweisung das kleine Helferlein Class_CtlColors eingebunden.
Für den Aufruf der Basisfunktion wird CtlColors.Attach(ED1, "FFFF80", "") nach dem Edit-Element aufgerufen. Und Attach braucht zwei Daten: den Window Handler (hwnd) des Edit-Elements und die gewünschte Farbe. Die Farbe ist wohl klar. Der HWND ist die eindeutige ID des Edit-Elements. In diesem Fall ist es ED1 - in der Zeile darüber manuell über die Option hwndED1 zugewiesen. Der Übersicht halber hier nochmal nur das Kolorisieren des Edit-Elements:
#Include %A_ScriptDir%\Class_CtlColors.ahk
Gui, Add, Edit, hwndED1 x10 y50 w380 h440, %text%
CtlColors.Attach(ED1, "FFFF80", "")
Damit ist das Skript fertig. Die Class_CtlColors-Bibliothek braucht allerdings auch eine Zeile aus den AutoHotkey-Standard-Vorgaben von oben:
SetWorkingDir %A_ScriptDir%
Ansonsten gibt es Pfadprobleme. Und hier die Hafties in Action:
Nachtrag: Standardmäßig bekommt natürlich jede Notiz/jedes Fenster ein Icon in der Taskbar - was ich ziemlich nervig finde. Die Lösung, folgende Zeile an den GUI-Bau-Anfang:
gui, +ToolWindow
So ein Tool-Window sieht genauso aus wie vorher, nur eben ohne Taskbar.
Zu viel der Bastelei? Na dann ...
So, das war doch ein schöner Abschluss eines ersten regulären Arbeitstages 2023. Nach einer Steuer- und DJV-Formularen-Orgie habe ich mir die Bastelei auch verdient. Wenn Ihr auch basteln wollt: Mehr zu AutoHotkey, mehr zu Notepad++.
Schöne Arbeit. Ich mag diese digitalen Post-its auch irgendwie. Der Klassiker ATNotes 9.5 (aus Windows 98 Zeiten) funktioniert auch noch mit den aktuellen Windows Versionen wenn man die Speicherorte der Dateien in zulässige Verzeichnisse umkonfiguriert. Als Gimmik gibt es sogar Kalender und Alarmfunktionen wie blinkende Post-its.
Hallo Mirco Lang , habe eben deien seite mit den Notepadd++ gesehen und gelesen. Bin mal gespannt wie der Nachbau wird. SO etwas sah ich bislang noch nie. Danke fürs teilen. Bislang nutze ich nur eine Textseit in der eben hintereinnader steht was ich brauche bzw machen möchte. Bin mal gespannt ob die Postit Methode meinen Ansprüchen genügt. Aber ich bin erst mal begeistert!!! Daher ein Danke
PS auch die Liste mit den Themen empfinde ich als spannend. Gruesse aus Region Karlsruhe