Evernote Tag Autocomplete Macro Version 2
EDIT (08.10.2020) - Please note: A Note As Regards To My Evernote Macros And The New Evernote Client Version 10
(This is a follow up post to Keyboard Maestro Tag Autocomplete Makro für Evernote unter macOS.)
This macro enhances the tagging functionality of Evernote's native macOS client by providing a way to search for tags in an "unanchored" way, that is, if I have a tag "gotomuseum", I can find this tag when searching for "museum", whereas the native tag autocomplete would only find the tag, if I typed at least "gotom". This is helpful, when having lots of tags in a deeply nested tag hierarchy.
How it works
This macro actually consists of two macros:
- A collector macro, that reads and parses Evernote's tags
- A selector macro, that displays a search box and pastes the selected tag
The collector macro could be bound to a hot key trigger or could be run in a time controlled manner (e. g. every hour). I have bound it to a hot key, so it's easy to invoke when I rcently added a tag, but it's not yet showing up in the selector.
So what you would do to use this:
- You just create tags as usual
- You invoke the collector macro
- When tagging a note you invoke the selector macro, search for the tag you want and the tag is inserted where your cursor is
Installation
Just download the file and drop it onto the Keyboard Maestro App Icon in the dock, or double click the file.
Evernote Autocomplete Macros - v2
(application/octet-stream, 12 KB)
Keyboard Maestro Tag Autocomplete Makro für Evernote unter macOS
Das Problem
Ich benutze Evernote als meinen Zettelkasten, wie ich ja neulich
beschrieben habe. Teil
des Zettelkastens - aber nicht nur des Zettelkastens - ist ein baumartig aufgebautes Stichwortverzeichnis, meine "hierarchische Projektliste":
Eine große baumartige Struktur, in der jedes Ding (wenigstens) einen
Platz hat. Beispiel:
00-meta.01-setup.03-reading-writing.00-notizen.02-evernote
Da Tags sich in Evernote in beliebiger Tiefe verzweigen lassen, ist
jedes Teilsegment (d. h. 00-meta und 01-setup) jeweils ein eigenes
Stichwort, welches hierarchisch ineinander verschachtelt ist. Da aber
aus technischen Gründen Evernote nur das Tag selbst, nicht aber die
sie enthaltenden Eltern- und Großelterntags anzeigt, wird die gesamte
Hierachie bis zum jetzigen Stichwort immer mitgeschrieben, d. h.
obiges Beispiel sieht praktisch so aus:
- 00-meta
- 00-meta.01-setup
- 00-meta.01-setup.03-reading-writing
- 00-meta.01-setup.03-reading-writing.00-notizen
- 00-meta.01-setup.03-reading-writing.00-notizen.02-evernote
Derzeit unterstützt der native Evernote-Client keine ausreichend
flexible Tag-Autovervollständigung. So würde ich, wenn ich in der
Stichwortleiste nach evernote
suchen würde, das entsprechende Tag
nicht finden.
Bevor das passende Tag für Evernote überhaupt als auswählbares Stichwort
im Tag-Feld auftaucht, müsste ich wenigstens
00-meta.01-setup.03-reading-writing
hinschreiben.
Logischerweise kann sich das niemand merken. Würde ich aber die
Baumstruktur meines Tagsystems auflösen, verlöre ich viele Vorzüge eines
solchen Systems. Also braucht es eine andere Lösung.
Für lange Zeit habe ich entsprechende Tags lediglich von einer
Tag-Übersicht herauskopiert. Aber das war umständlich und führte
tendenziell dazu, dass man Tags weniger häufig benutzt hat, als man es
vielleicht gewollt hätte.
Die Lösung
Ein Hoch auf Keyboard Maestro!
Keyboard Maestro ist ein Automatisierungstool für den Mac, mit dem man
in vielen Fällen Apps um Funktionalitäten oder Integrationen erweitern
kann, die einem fehlen. Wir machen es uns hier zu nutze, um eine
funktionierende Stichwort-Autovervollständigung zu bauen.
Schritt 1
Wie gesagt, habe ich in Evernote eine Notiz mit allen Tags die auf den
Namen Tagliste
hört.
Diese Liste müssen wir nun nur noch auslesen bzw. parsen. Um das zu
ermöglichen machen wir uns einen weiteren Vorteil der Mac-Plattform zu
Nutze: Die Applescript-Unterstützung des
Evernote-Clients.
tell application "Evernote"
set mysearch to find notes "intitle:Tagliste"
set mynote to item 1 of mysearch
return HTML content of mynote
end tell
Dieses Applescript macht folgendes:
- Es sucht in Evernote nach Notizen die im Titel
Tagliste
enthalten...
- ...und wählt aus den Suchergebnisse das erste aus...
- ...und anschließend gibt es den Inhalt der entsprechenden Notiz als
HTML aus
Wir halten HTML was so aussieht:
<div id="en-note"><ul><li><div>xx-archiv</div></li>...
Schritt 2
Diesen langen HTML-Wurm müssen wir nun so aufbereiten, dass er uns für
eine Autovervollständigung dienen kann. Auch wenn man für HTML
eigentlich keine regulären Ausdrücke verwenden
sollte,
so ist das von uns vorgefundene HTML einfach genug um es dennoch zu tun.
(?<=(<li><div>))([a-zA-Z0-9().,\-:;@#$%^&*\[\]"'+–/\/®°⁰!?{}|`~äöüÄÖÜß_ \n])+(?=(</div></li>))
Diese RegExp tut folgendes (Visualisierung von hier):
Kurz: Es wird alles gefunden was zwischen
<li>
und <div>
Tags ist.
Schritt 3
Schließlich braucht es ein Makro, welches bei Bedarf die obigen Schritte
durchführt und das Ergebnis vorhält.
Immer wenn ich die Tastenkombination ⌃⌥⇧⌘#
drücke passiert folgendes:
- die Variable
TagsFound
wird zurückgesetzt um Duplikate zu
vermeiden
- das Applescript aus Schritt 1 wird ausgeführt und liefert uns HTML,
welches wir in der Variable
Tags
speichern
- Hier iterieren wir über jeden gefundenen Match unseres Regulären
Ausdrucks (Variable
TagsMatch
) aus Schritt 2 und führen für jedes
Stichwort die folgenden Aktionen durch
- wir speichern das Gefundene in der Variable
TagsCaptured
- wir fügen den Inhalt von
TagsCaptured
und einen Zeilenumbruch
am Ende an die Variable TagsFound
an
- Wir löschen
Tags
, TagsMatch
, TagsCaptured
, da sie nicht mehr
gebraucht werden.
- Schließlich geben wir eine Notification aus, dass die Tags aus
Evernote gefunden und aktualisiert worden sind.
Das Ergebnis ist eine Variable die in jeder Zeile ein Tag enthält:
xx-archiv
00-meta
00-meta.00-baum
00-meta.01-setup
00-meta.01-setup.01-taskmgmt
00-meta.01-setup.01-taskmgmt.01-timewarrior
00-meta.01-setup.01-taskmgmt.02-taskwarrior
Hier das Makro zum Download: Evernote - ZKN - Tag
Collection
[ (application/octet-stream, 6 KB) ]{.small}
Schritt 4
Nun müssen wir die so befüllte Variable nur noch von KeyboardMaestro in
geeigneter Form anzeigen lassen. Das geht so:
Immer wenn ich die Tastenkombination ⌥⇧⌘#
drücke (also ohne Control)
passiert folgendes:
- Es wird ein Suchschlitz eingeblendet werden, dessen Inhalt sich aus
der Variable
TagsFound
speist und die Auswahl (d. h. den Eintrag
also in unserem Falle das Tag) in die Variable TagTmp
speichert.
- Wir fügen den Inhalt der Variable
TagTmp
an der Position ein, wo
wir das Makro ausgeführt hatten.
- Wir löschen die Zwischenablage 0, d. h. unser gerade eben
eingefügtes Stichwort, um nicht unsere eigentliche Zwischenablage -
vielleicht habe ich ja z. B. einen Textschnipsel für einen neuen, zu
taggenden Zettel in der Zwischenablage - zu "löschen".
Hier das Makro zum Download: Evernote - ZKN - Tag
Selection
[ (application/octet-stream, 2 KB) ]{.small}
Ergebnis
Das Ergebnis sieht dann so aus:
Anzumerken bleibt, dass man das Tag Collection Makro nur ausführen muss,
wenn sich was an den Tags geändert hat und nicht vor jeder
Stichwortsuche.
Links und Inspiration
Evernote als Zettelkasten
(For a shorter summary in English, see: Evernote as a Zettelkasten)
Ich bin seit Jahren also wieder zurück bei Evernote. Auch dort (wie hier im Blog) ist es irgendwie ein Mengengelage aus Ansprüchen an die Form und notwendigen Einschränken aufgrund der zur Verfügung stehennden Ressourcen (Zeit, Konzentration, technische Plattform, etc.).
Aber im Prinzip funktioniert es im Augenblick so:
Notizbücher
Übernommen von hier habe ich die ersten drei Notizbücher:
- !_Inbox
- 1_Inspiration (für mehr oder weniger eigene Gedanken)
- 2_Referenzen (für mehr oder weniger fremde Iritationen)
Der Trick hier ist, dass die Unterscheidung zwischen eigenem und fremdem so leicht getroffen werden kann (auch wenn sicherlich eine unerhebliche Menge an Entscheidungen darüber falsch getroffen werden: das ist in Ordnung. Nur leicht muss es sein zu einer Entscheidung zu kommen, alles andere kommt später.) Das sorgt dafür, dass die Inbox eigentlich immer leer ist. So soll es sein.
Schließlich gibt es noch ein weiteres Notizbuch:
Dieses enthält "gereifte Notizen", die wenigstens zweimal angefasst worden sind, im richtigen Format vorliegen, usw. Ziel ist hier übrigens nicht, dass jede Notiz im ZKN landen muss. Schön wäre das schon, aber es ist nicht wichtig genug, um dadurch die Erfassung von Neuem zu blockieren - so die Ausrichtung.
Daran anschließend gibt es eine Reihe von Notizbüchern, die entweder Projekt-Spezifisch oder Themengebietsspezifisch aufgebaut sind und zumeist aus historischen Gründe existieren. Eine Auswahl:
- Arbeit
- Bürokratie
- Notizensystem
- Rezepte
- usw.
Diese sollen irgendwann mehr oder weniger alle in Prozessnotizbücher (siehe oben, !_Inbox, usw.) und temporäre Projektnotizbücher ("Reise nach Oulu" z. B.) aufgehen. Hat aber alles keine Eile.
Tags
Es gibt derzeit zwei verschiedene Tag-Systeme:
1. die hierarchische Projektliste
Eine große baumartige Struktur, in der jedes Ding (wenigstens) einen Platz hat. Beispiel:
00-meta.01-setup.03-reading-writing.00-notizen.02-evernote
Da Tags sich in Evernote in beliebiger Tiefe verzweigen lassen, ist jedes Teilsegment (d. h. 00-meta und 01-setup) jeweils ein eigenes Stichwort, welches hierarchisch ineinander verschachtelt ist. Da aber aus technischen Gründen Evernote nur das Tag selbst, nicht aber die sie enthaltenden Eltern- und Großelterntags anzeigt, wird die gesamte Hierachie bis zum jetzigen Stichwort immer mitgeschrieben, d. h. obiges Beispiel sieht praktisch so aus:
- 00-meta
- 00-meta.01-setup
- 00-meta.01-setup.03-reading-writing
- 00-meta.01-setup.03-reading-writing.00-notizen
- 00-meta.01-setup.03-reading-writing.00-notizen.02-evernote
Das schöne an dieser Hierarchie ist, dass ich sie mit minimalen Anpassungen auf allen Ebenen verwenden kann: In Gmail (Labels), in OmniFocus (Tags), im Filesystem (mit Slash statt Punkt).
Zugegebenermaßen erzeugt die Verwaltung einer solchen riesigen Struktur auch einen gewissen Mehraufwand (ich halte in Evernote eine Notiz mit dem geltenden Stichwort-Baum vor und zusätzlich ein Changelog, um eine Historie dazu zu haben) aber die dadurch gewonnene Konsistenz macht das im Alltag doch wieder lohnenswert. Zumal nicht jede Notiz immer getaggt wird, sondern auch hier wird nur das verschlagwortet, wo man gerade zu kommt.
2. Nicht-hierarchische Tags
Zu diesem Tag-System habe ich derzeit noch ein versehentlich durch den Import eines öffentlichen Evernote-Zettelkastens, über den ich sonst nichts weiß, außer, dass er existiert eine weitere nicht-hierarchische Tag-Struktur gewonnen.
Diese sollte irgendwann mal in der hierarchischen Tag-Sturktur aufgehen. Eine Auswahl der dort zur Verfügung stehenden Tags:
- angst
- Aporie
- Big Data
- Erkenntnistheorie
- Gedanke
- sinnkopplung
- wissen
Warum hier einige Begriffe groß und andere klein geschrieben worden sind, weiß ich nicht.
Notizen/Zettel
Notizen haben im Prinzip immer denselben Aufbau:
Titel
.
(Quelle: )
- Zurück:
- Weiter:
- Querverweise:
Dieser Aufbau ist als template in Evernote hinterlegt und ist damit schnell zugänglich. Dieses Layout gibt aus meiner Sicht genügend Struktur vor, um Zettel miteinander in Baumartiger Weise zu verlinken. Dort wo der Punkt steht, schreibt man den entsprechend atomaren Gedanken hin, verlinkt wenn nötig inline auf andere Zettel und ergänzt, wo nötig/sinnvoll/nützlich Vorgängerzettel, Folgezettel und Querverweise. Über die entsprechende "copy note Link"-Funktionalität lassen sich auf diese Weise relativ schnell (jedenfalls schnell genug) Netze aus Zetteln erstellen.
Prinzipien des Arbeitens
Neue Suchstrategie
Hat man einen solchen Zettelkasten, dann ist es notwendig, dass man seine Internet-Suchstrategie dahingehend abändert, dass man zunächst im Zettelkasten nach Antworten sucht und nicht im WWW. Der Grund dafür ist, dass man sonst nicht weiß, was der Kasten bereits enthält und was er vielleicht auch nicht enthält oder was er noch nicht enthält, aber vielleicht einen Ort hat, wo man aber etwas Fehlendes Anschließen könnte. Dementsprechend ist der neue Suchalgroithmus für ein auftauchendes Problem:
- Habe ich dazu was im Zettelkasten geschrieben?
- Wenn Ja:
- entsprechendere Folgezettel sind zu erstellen um so die Reichweite des ZKN zu verlängern.
- Wenn Nein:
- (z. B.) Internetsuche bemühen und wenn eine Antwort gefunden worden ist, dann wird diese in einen Zettel überführt.
Atomare Notizen
Eine Notiz sollte nach Möglichkeit atomar sein, d. h. sie sollte einen Gedanken fassen nur eine Sache tun. Erklärt wird das Vorgehen z. B. hier:
The underlying principle I’d call the principle of atomicity: put things which belong together in a Zettel, but try to separate concerns from one another.[2] For example, I might collect a list of assumptions in one Zettel which serves as an overview. like hard determinism. A related argument and its conclusion will be kept in another Zettel. Moral responsibility under hard determinism is a good example. I can re-use the arguments without buying into the assumptions because the arguments are of sufficiently general form. Atomicity fosters re-use which in turn multiplies the amount of connections in the network of Zettels.
Und die dazugehörige Fußnote 2:
If you’re a programmer, separation of concerns should ring a familiar bell. I deal with notes in a fashion similar to complex code. Instead of writing classes, I create new note files. Accordingly, patterns emerge: there are argumentative notes; there are notes with term definitions; there are sparks and ideas. Each Zettel pattern fulfils a different purpose.
In meinen Worten: Wiedervwendbarkeit sollte beim Output, Beschränkung der "Funktionalität" (Outline, Beispiel, Definition, …) beim Input der Leitfaden für das Erstellen von Notizen sein. Dadurch, dass sich diese atomaren Notizen ja wiederum miteinander Verlinken lassen, gewinnt man ein unglaubliches Maß an Verzweigbarkeit seiner Notizen.
Keine Perfektion anstreben, nirgends
Vollständigkeit, der Form entsprechend, Einheitlichkeit, Abgeschlossenheit, usw.: Man muss Zettel nicht schon beim ersten Versuch perfekt erstellen. Im Gegenteil: Ein allmähliches Überarbeiten, dort wo es gerade tatsächlich notwendig ist, ist ein Garant für die Langlebigkeit der eigenen Verzettlungspraxis.
Eine gute Formulierung dafür findet sich hier:
It can be tempting to spend a lot of time to create highly structured, perfectionistic notes. The problem is, you often have no idea which sources will end up being valuable until much later. Instead of investing a lot of effort upfront, organize your notes opportunistically, in small bits over time
Your rule of thumb should be: add value to a note every time you touch it. This could include adding an informative title the first time you come across a note, highlighting the most important points the next time you see it, and adding a link to a related note sometime later. By spreading out the heavy work of organizing your notes over time, you not only save time and effort, but ensure that the most frequently used (and thus most valuable) notes surface organically, like a ski slope where the most popular routes naturally end up with deeper grooves.
Ende
Es gäbe natürlich noch unheimlich viel mehr zum Thema zu sagen, aber mit diesen "Zutaten" und den verlinkten Quellen lässt sich verhältnismäßig einfach ein eigener Zettelkasten einrichten, wenn man genug Eigeninitiative hat. Gesagt habe ich nichts über ergebnisorientiertes Schreiben, d. h. wie man Notizen aus einem Zettelkasten in einen zusammenhängenden Text verwandelt. Auch nicht darüber, wie sich ein Zettelkasten zu einem Task-Management-System verhält. Aber das kann ja ein anderes Mal Thema sein.