Samstag, 20. Februar 2016

Vimwiki - Personal Wiki in Vim

2016-02-20_vimwiki

Ein Vim sie zu knechten

Vim ist einer der besten Texteditoren, die ich kenne. Zwar fragt sich der VIM-Neuling anfänglich, ob er bei einer Computer-Variante von "Verstehen Sie Spaß" gelandet ist, aber nach einer kurzen Eingewöhnungszeit stellt man dann erstaunt fest, dass man in diesem Editor extrem effizient arbeiten kann, sobald man mal eine paar grundlegende Konzepte und Befehle verinnerlicht hat. Aus diesem Grunde verwende ich ihn seit vielen Jahren für eigentlich alles, was mit Text zu tun hat: Programmieren, Texte schreiben (z.B. in LaTeX) config Files anpassen etc.

Was einen guten Editor ausmacht ist aber nicht nur sein Interface, sondern vor allem, dass man ihn den persönlichen Bedürfnissen anpassen kann. Faustregel bei der Editor-Wahl: Wenn sich das Ding nicht gut konfigurieren lässt und es Erweiterungen nicht unterstützt – Finger weg. Vim lässt sich durch Plugins erweitern, die man entweder in Vimscript schreiben kann, oder aber auch in Python. Ähnliches gilt für den Erzrivalen Emacs, nur dass hier LISP das Mittel der Wahl ist.

Aber wieso mache ich so viel Aufhebens um einen Texteditor? Weil Textfiles unglaublich praktisch sind. Das wird nun vielen Leuten komisch vorkommen und so mancher hat heute gar keine Ahnung mehr, was ich mit Textfile überhaupt meine, wo doch jede Software inzwischen ein neues Dateiformat definiert, das zu allen anderen inkompatibel ist. Ist ja auch viel besser für den Hersteller, wenn ein Wechsel zur Konkurrenz durch die Unverträglichkeit der Dateien erschwert wird.

Aber eigentlich verwende ich stinknormale Textfiles andauernd – z.B. für

  • ToDo Listen
  • Notizen
  • Mitschriften aus Meetings
  • Meinen Wunschzettel
  • Readme Files für Programme
  • Readme Files für Folder in meinem Dateisystem
  • ...

Das ist praktisch, denn es ist kinderleicht ein Textfile zu editieren, man kann es sehr effizient durchsuchen – im Editor oder z.B. mit grep, ich kann es mit diff mit einer anderen Version vergleichen, alle Versionierungssysteme kommen damit klar, es ist schlank, es funktioniert problemlos unter LINUX, Windows, Mac, Android, iOS, DOS, CPM, OS/2, dem Betriebssystem von HAL9000 und überhaupt überall.

Mit anderen Worten es ist ein extrem einfaches und deshalb mächtiges Dateiformat.

Ein Vim sie zu finden

Zahlreiche Textfiles finden sich verstreut auf meinem Computer – ich organisiere sie so gut ich kann durch sinnvolle Ordnerstruktur. Im Großen und Ganzen klappt das gut. Manchmal denke ich mir aber, es wäre nett, wenn ich auch ein tool hätte, das bestimmte Dokumente stärker zusammenhält und verlinkt. Z.B. meine ToDos, Meetingnotizen und kleinere Texte in denen ich meine Gedanken ordne, Konzepte erarbeite etc. Ich hatte in der Vergangenheit schon gelegentlich verschiedene GUI Tools ausprobiert, die versprachen, meine Produktivität zu steigern, das Denken zu fördern, Verbindungen zu managen und den Weltfrieden herbeizuführen. Lange Rede kurzer Sinn – nach einer, meist kurzen, Testphase war ich zurück bei Textfiles in Folders, ggf. mit begleitenden Medien und Dokumenten, wie Photos, PDFs etc.

Warum? Weil alle diese vermeintlichen Produktivitätsbooster irgendwie unbequem zu bedienen waren, nur auf einer oder wenigen Plattformen funktionierten, untereinander vollkommen inkompatibel waren und einfach nervten.

Kürzlich bin ich nun auf etwas sehr angenehmes gestoßen: vimwiki. Das ist exakt, was der Name suggeriert: eine Implementierung eines Wiki Systems als Vim-Plugin. Wikis wurden ursprünglich erfunden, um es dem weniger HTML-erleuchteten Bürger zu ermöglichen, effizient kleine Webseiten zu erstellen, sie untereinander zu verlinken und auf diese Weise eine Menge wertvolle Information organisiert zu kriegen. Wikipedia ist das Vorzeigekind der Familie. Aber es muss nicht gleich ein Lexikon sein – ein Wiki ist auch unglaublich nützlich, um seine eigenen Gedanken Festzuhalten und Informationen, die man von irgendwo her hat zu organisieren. In der Tat waren auch veritable Wiki System unter den oben verworfenen Lösungen – sie waren einfach Overkill für das, was ich haben wollte.

Vimwiki implementiert nun ein minimalistisches Wiki. Die Syntax erinnert an Markdown, ist aber nicht exakt die gleiche, was aber echt wurscht ist. Und so habe ich angefangen, mir ein persönliches Wiki zu bauen und es füllt sich stetig:

  • Todo Liste (eigentlich mehrere, nach Kontext geordnet)
  • Lösungen zu schwierigen Computer-Problemen, die ich nicht verlieren möchte
  • Bookmarks mit ausführlichen Kommentaren für mich selbst
  • Ideen für Bastelprojekte und Blog Beiträge
  • Outlines für längere Texte, an denen ich arbeite
  • Planung unserer Urlaubstermine
  • Skizzen für Blogbeiträge
  • Ideen und Notizen zu Dingen, die gerade lerne oder lernen möchte
  • Meine Wunschliste
  • Geschenkideen für andere
  • und vieles mehr

Das Ergebnis besteht aus einer Vielzahl von Textfiles im vimwiki Markup, die in einem speziellen wiki Ordner liegen und untereinander durch Hyperlinks verbunden sind. Öffne ich das Ganze in Vim fühlt es sich an, wie Websurfen mit einem Text-basierten Browser (lynx/w3m o.ä.). Ich kann von meiner Hauptseite aus wie im Flug durch diverse Links navigieren, bis ich im Zieldokument ankomme. Innerhalb der Dokumente kann ich dann mit den gewohnten Vim Befehlen arbeiten und das Syntaxhighlighting machte es leicht, die Dokumentenstruktur zu erfassen.

Vimwiki kennt mehrere Levels von Überschriften, geordnete und ungeordnete Listen, die sich auch schachteln lassen, Links nach außen (auf Files, Webseiten, Bilder, etc.). Simple Textauszeichnungen, wie fett oder kursiv fehlen ebenfalls nicht.

Ein Vim sie ins Dunkel zu treiben und ewig zu binden

Und natürlich lässt sich das Ganze (oder einzelne Dateien) auch leicht in HTML verwandeln. wozu das nützlich ist? Zum Beispiel, um sein Wiki in aufgehübschter Form zu durchforsten, oder es anderen lesend zur Verfügung zu stellen.

Oder zum bloggen -- dieser Post wurde komplett in vimwiki geschrieben, nach HTML konvertiert und auf blogspot kopiert...

Sonntag, 14. Februar 2016

Code snippet beautification in vim

Hallo Welt! Chris hatte neulich ein schönes tool zum Verhübschen von Source Code vorgestellt (Gist). Das ist nützlich für Blogposts in denen man mal ein Stück Code vorstellen will.

Nun bin ich ein alter VIM user, denn in meinen Augen ist das der beste Editor der Welt und mithilfe diverser Plugins kann man ihm ungeahnte neue Trick beibringen. Einige erstaunliche Sachen kann er aber auch schon ohne solche Erweiterungen. Dazu gehört ein sehr hilfreiches Syntax-Highlighting für ziemliche alle Programmiersprachen, die es so gibt. Und wie es der Zufall so will bringt vim auch einen html Konverter mit! Um den aufzurufen gibt man einfach im Kommandozeilen Modus folgendes ein:

:TOhtml

Das Ergebnis landet in einem neuen Buffer und kann von dort als html File gespeichert oder eben in den Blog kopiert werden – zumindest der Teil zwischen den body tags. Probieren wir das also mal aus mit einem code snippet für die Collatz conjecture. Das sieht dann so aus:

def collatz(number):
    path = [number]
    while number != 1:
        if even(number):
            number /= 2
        else:
            number = number * 3 + 1
        path.append(number)
    return(path)

Die Formatierung passt schon, aber  Syntax-Highlighting wäre toll. Der Grund das es fehlt ist, dass vim per default CSS verwendet, was aber problematisch ist, wenn man nur das snippet kopiert. Man kann das aber auch abschalten, und zwar so:

:let html_use_css=0

Und dann wären Zeilennummern noch schön. Also:

:set number

Das Ergebnis gefällt mit schon sehr gut:

19 def collatz(number):
20     path = [number]
21     while number != 1:
22         if even(number):
23             number /= 2
24         else:
25             number = number * 3 + 1
26         path.append(number)
27     return(path)



Die Zeilennummern gehen bei 19 los, weil das die Zeile im Original File war. Wenn ich für das Snippet lieber bei 1 starten möchte dann muss ich vorher eben noch das Snippet in ein eigenes File tun - auch kein Akt. Und wenn einem das Farbschema nicht gefällt gibt es natürlich diverse zur Auswahl. z.B.:

:colorscheme delek

und man bekommt dies (diesmal mit Nummerierung bei 1 startend):

def collatz(number):
        path = [number]
        while number != 1:
                if even(number):
                        number /= 2
                else:
                        number = number * 3 + 1
                path.append(number)
        return(path)