rss feed articles all_comments

indeedgeek.de

Florian Eitel

Journaled vim

Notizen geordnet

Warum?

Niemand kann sich alles merken, deshalb schreibt man sich Dinge auf. Im Analogen sowie im Digitalen haben sich unglaublich viele Methodiken und Formate für Notizen entwickelt. Hier möchte ich kurz meine Beschreiben.

Das ist sicher nicht der erste Versuch Notizen zu ordnen. Ich habe schon viel probiert.

Aber Analog hatte es immer den Nachteil, dass man die Notizen nicht immer dabei hatte. Zudem war das auffinden ein Problem. Und die Volltextsuche. Und mal URLs abgeschrieben?

Digital hatte ich nie eine passende Ordnung. Mal Evernote versucht was mich komplett enttäuscht hat, da ich nie einen richtigen Zugang gefunden habe. Mal einfache Textdateien die unauffindbar in Unterordnern versunken sind. Zudem konnte ich darauf unterwegs auch nicht zugreifen. Auch mit Web-Wikis hatte ich mich schon rum geschlagen. Alles ohne Erfolg.

Auf vimwiki bin ich zufällig gekommen. Ich hatte mal davon im vimberlin Meetup gehört aber dem keine weitere Beachtung geschenkt. Irgendwann musste ich mal wieder was größeres notieren und fragte mich wohin. Erstmal in Vim tippen und dann irgendwo speichern? Irgendwie kam ich dazu Dokumente verlinken zu wollen und kam dann auf vimwiki. Das war im November und seitdem bin ich eigentlich sehr froh damit.

Wobei mir an Vimwiki vor allem die Diary-Funktion gefallen hat. Die Idee ist für jeden Tag eine Wiki-Datei mit dem aktuellen Datum anzulegen. Ich nutze das für Notizen. Nie mehr überlegen wohin mit einer Notiz. Immer in den aktuellen Tag.

Und Vimwiki hat einen großen Vorteil: Es ist in Vim. Vim ist ohnehin immer offen wenn ich am Computer bin und wenn nicht so kann man auf die Textdateien auch irgendwie zugreifen.

Vimwiki Features

Das beste Feature an Vimwiki ist das schnelle öffnen. Einfach ww bzw wt für neuen Tab drücken und schon ist man im aktullen Tag und kann seine Notiz schreiben.

Schön ist: Man kann auf andere Tage verlinken: [[diary:2013-03-17]] erstellt ein Link zum siebzehnten März. Die Klammern kann man sogar weg lassen und einfach + drücken. Auch wenn man gerne Notizen zu einem Projekt nicht im Diary sondern als normale Wiki-Datei speichert ist das Verlinken sehr hilfreich.

Hat man viele Diary Dateien erstellt verliert man schnell den Überblick. Der Diary Index hilft hierbei. Das ist eine spezielle Datei welche alle Tage auflistet und automatisch mit dem jeweiligen Tag verlinkt. Die erste Überschrift wird hierbei als Text übernommen. Deshalb enthält bei mir jeder Tag in der ersten Zeile eine Überschrift mit dem aktuellen Datum und das was ich in dem Tag gemacht habe. So muss ich nur in den Diary Index schauen und finde schnell was ich suche.

Eine andere Möglichkeit zu einem Tag zu springen ist die Integration mit dem calendar vim plugin. Mittels :Calendar erscheint in einem Split ein Kalender in dem die Tage mit einem Diary Eintrag verlinkt sind. So muss man nur den Tag auswählen und Enter drücken und schon ist man beim richtigen Tag. (Week start montag: let g:calendar_monday = 1)

Vimwiki erleichtert das Anlegen von Todos. Einfach eine Liste erstellen und dann bei einer Zeile drücken. Die Zeile wird dann automatisch zum Todo. Mit einem weiteren kann man das Todo abhaken. Sogar Hierarchische Todos (Einrückung) werden berücksichtigt und entsprechend abgehakt. Anmerkung: Einrücken/Ausrücken im Insert mode: T/D.

Oft fallen bei mir Code-Schnipsel an. Auch diese schreibe ich einfach zu dem aktuellen Tag. Vimwiki unterstützt hierbei sogar syntax highlighting. Einfach die Sprache hinter dem Block schreiben und in der Config entsprechend mappen und schon hat man die Syntax als wäre es eine eigene Datei.

Viele weitere schöne Extras bietet Vimwiki. Man kann automatisch das Wiki als HTML exportieren. Tabellen werden automatisch formatiert oder man kann Markdown als Syntax verwenden.

Extensions

Hier einige Anpassungen die ich an vimwiki noch durchgeführt habe.

Snippets

Mittels SnipMate habe ich zwei recht hilfreiche Snippets definiert:


snippet log
  `system('date +"%Y-%m-%d %H:%M"')`: 
snippet anotherday
  = `Filename()` - =
  
  [[`system('date +"%Y-%m-%d" -d '.Filename().'-1day')`|yesterday]] - [[`system('date +"%Y-%m-%d" -d '.Filename().'+1day')`|tomorrow]]
  
  == issues for today: ==
  
  `system('sed  "1,/^== issues for today: ==\$/d;/^[^ ].*/,\$d" $(date +"%Y-%m-%d.wiki" -d '.Filename().'-1day) | grep -v "\[X\]"')`
  
# == google says: ==
# 
# `system('gcalcli --nc --cal "Florian Eitel" --cal "FLo" --cal "Studium" agenda "'.Filename().'T01:00" $(date +"%Y-%m-%d" -d '.Filename().'+1day)')`

Das erste Snippet fügt ein Timestamp mit der aktuellen Uhrzeit ein. Dahinter kann ich einen kurzen Text schreiben und eventuell in nachfolgenden Zeilen zusätzliche Infos. So besteht mein Tag aus mehreren Timestamps mit mehr oder weniger Inhalt.

Das zweite Snippet startet einen neuen Tag. Es wird in der ersten Zeile eine Überschrift mit dem heutigen Datum eingefügt. Das Minus dahinter trennt das Datum von eventuellen Beschreibungen was ich an dem Tag gemacht habe. Anschließend werden Links zu gestern/morgen eingefügt und die offenen Todos aus dem Vortag übernommen. Anschleißend hatte ich mal versucht die Kalendereinträge von Google mit anzuzeigen. Hat mir nicht mehr gefallen aber evtl möchte ja jemand damit rum probieren.

Drei Anmerkungen: Ich sollte für die Date-calls Vimscript verwenden und nicht system. Und es werden die Todos nur vom Vortag übernommen. Sollte dieser nicht extisteren (z.B. Ferien/Wochenende) schlägt es fehl. Hatte noch keine Lust das zu fixen. Und es gibt ein Problem mit Table Mappgings von vimwiki und snipmate. Daher table mappings mit let g:vimwiki_table_mappings = 0 ausschalten.

syntax logentry


syntax match logentry /^[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9] [0-9][0-9]:[0-9][0-9]: .*$/me=s+18

highlight logentry ctermbg=17

In der after/syntax/vimiki.vim Datei sorgt das dafür, dass ein Logentry entsprechend hervorgehoben ist.

Anmerkung: Evtl schlägt Spell fehl. Mit syntax spell toplevel sollte das wieder behoben sein. Bei vimwiki gibts ein Bug dazu. Ich bin mir nicht sicher ob der Fehler noch auftritt.

folding

Vimwiki kommt mit folding. Allerdings nur über foldmethod=expr. Ich habe daher mein eigenes Folding für logentries geschrieben (über Syntax) kann damit aber nicht wie Vimwiki Checkboxen oder Überschriften einklappen. Ich muss das mal zusammen führen.


syn region logregion start=/^[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9] [0-9][0-9]:[0-9][0-9]: .*$/ end=/^[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9] [0-9][0-9]:[0-9][0-9]: .*$/me=s-1 keepend fold transparent

Anmerkung: Schön wäre es auch wenn man Pre Blöcke einklappen könnte. Ich hatte mal das Syntax Nesting selbst implementiert, da ging es. Allerdings ist das syntax nesting von vimwiki besser. Müsste ich mal folding einbauen…

Nachtrag: Vimwiki unterstützt in der neusten Version auch Folding per Syntax. Das ist zwar etwas langsamer als `expr` aber mich hat es noch nicht gestört.

:grep

Wenn ich etwas suche könnte ich zwar das System grep bemühen. Schöner ist es aber mit dem vim grep. Einfach :grep PATTERN * im Diary-Ordner eingeben und schon werden alle Treffer im Quickfix Window angezeigt.

Fire up

Um schnell etwas vimwiki hinzuzufügen und das auch gleichzeitig zu syncen, habe ich folgendes “script” gebastelt:


#!/usr/bin/env bash

VIMWIKI_PATH="$HOME/vimwiki"

cd $VIMWIKI_PATH

git pull

# go to todays diary, open calendar, focus left window (diary)
vim -c "VimwikiMakeDiaryNote" -c "Calendar" -c "wincmd l"

git add -A
git commit -m "updated"
git push

Ideas

Einige Ideen die noch nicht fertig oder erst gar nicht angefangen wurden.

LOOK:

Wenn ich ein interessanten Link sehe oder mir generell später etwas noch einmal ansehen möchte setze ich ein “LOOK:” davor. Mittels folgenden Befehl kann ich prinzipiell alle “LOOK:”s anzeigen. Allerdings funktioniert der Befehl noch nicht richtig.


for I in ~/vimwiki/diary/*; do
  sed -n '/^[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9] [0-9][0-9]:[0-9][0-9]: LOOK:/,/[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9] [0-9][0-9]:[0-9][0-9]:/p' $I | ghead -n -1 ;
  sed -n '/^LOOK:.*$/p' $I;
done

Notify

Eine zweite Idee ist ein notify. Oft denke ich mir heute um 12:00 musst du unbedingt an “X” denken und immer vergesse ich es. Warum nicht einfach 2013-04-21 19:30: NOTIFY: X. Dafür habe ich noch keine Lösung, sollte aber einfach sein.

Time Tracking

Ich hatte mal mit hamster oder gtimelog herumgespielt ob Timetracking mit vimwiki möglich ist. Theoretisch ja, war für mich aber nicht praktikabel. Mal sehen ob mir da noch was einfällt.

autocommit

Es gibt viele Projekte die Dateien automatisch in Git einchecken. Ich hatte da auch schon mit inotfy und gitwatch rum gespielt aber nichts aktuell im Betrieb. Wer Tipps hat immer her mit.

multiple devices

Wer das selbe wiki über mehrere Devices synchron halten will kann das einfach über git machen. Was macht man aber wenn das Device kein Git unterstützt? Branches! Für jedes Device (handy,tablet) ist ein repo mit dem jeweiligen Branch auf dem Server ausgecheckt. Mittels Foldersync synced das android device den Ordner über SMB auf das Device und ich kann es mit einem Texteditor ansehen/bearbeiten. Hätte ich Markdown Syntax verwendet sollte es dafür sogar viele Editoren mit Syntax highlighting geben. Veränderte Dateien werden ebenso zurück gesynced und sollten automatisch commited werden. Zu Konflikten kann es nicht kommen, da ein extra Branch verwendet wird.

Auf dem Laptop muss ich dann nur bei Konflikten die Branches rebase’n (nicht mergen sonst landet man in einer Endlos Schleife).

So habe ich (theoretisch) git für nicht git devices. (no git write support for android so far :( )

web

vimwiki hat viele Optionen um das komplette Wiki als HTML zu exportieren. Für die readonly Version unterwegs sicher eine schöne Option. Habe ich aber ebenfalls noch nicht implementiert.

Comments:

(howto comment?)