Bitte Beachten: Dieser Blog wird hier nicht weiter geführt! Kommentare und neue Blogposts gibt es unter http://feitel.indeedgeek.de. Dort bitte auch neue Kommentare zu diesen Beiträge erstellen.

Dienstag, 29. September 2009

Open Access im Mitmachweb - Teil 1

Ja, ich weiß, die meisten von euch können es schon nicht mehr hören. Spätestens seit die die gängigen Buzwords in den Massenmedien ihre Heimat gefunden haben, ist man froh wenn einem nicht ständig jemand Twitter und Co erklären will. Aber das habe ich auch gar nicht vor. Ich denke jeder der mich kennt, weiß das ich sehr viel Wert auf freien Zugang und offene Lizenzen lege. Das Problem ist nur, die meisten der Daten die wir täglich konsumieren sind eben nicht frei. Firmen haben diese Daten mit ausschließlich kommerziellen Hintergedanken gesammelt und verwenden sie auch, mehr oder weniger offensichtlich um damit mehr Geld zu erwirtschaften. Einfache Werbeeinblendungen sind da meist noch das geringere Übel. Zudem erlauben die Nutzungsauflagen nur eine sehr beschränkte Weiterverwendung. Dies kann gerade bei einem Kreativen "Remixen" also sprich aufbereiten, anreichern oder verknüpfen schnell zur unangenehmen Überraschung führen.

Um ein konkretes Beispiel zu nennen: Google Maps. Google Maps hat sich in den letzten Jahren den Platz als Allheilmittel für Geodaten wie Landkarten, Wegbeschreibung, Location Based Services oder Satellitenbilder, erkämpft. Man kann die Karten soweit kostenlos einfach über die Weboberfläche nutzen und es gibt sogar eine Schnittstelle über die man Karten auf der eigenen Seite anzeigen kann. Wo ist nun der Haken? Stellen wir uns einmal vor Google beschließt morgen doch evil zu sein und ändert die Nutzungsbedingungen, was sie ja beliebig tun können. Plötzlich muss man für das Einblenden Geld bezahlen oder man kann die Karten nur noch nach Registrierung einsehen. Nichts könnte man dagegen unternehmen. Google kann somit mit allen Nutzern machen was sie möchten ohne das man sich irgendwie dagegen wehren kann. Gut, Viele werden nun sagen, das macht Google sowieso nicht aber nehmen wir ein anderes Beispiel: Ich bin das nervige Webinterface leid und programmiere einen Desktop Client der Teile der Karten runterlädt und zwischenspeichert. Auch hier kommt mir Google in die Quere da sie mir auferlegen auf die Daten nur über ihre vorgegebenen Nutzungswege zugreifen zu können. Mir sind erneut die Hände gebunden da ich eben mit den Daten nicht das machen kann was ich gerne machen möchte. Zudem wird dem ein oder anderen schon die veralteten Daten aufgefallen sein. Google kauf nur in sehr unregelmäßigen Abständen aktualisierte Daten ein, so das einzelne Karten durchaus ein paar Jahre alt sein können. Nun weiß ich aber genau, dass die Straße vor meinem Haus anders heißt und trotzdem navigiert mich Google jedes mal falsch weil eben der Name nicht passt. Man könnte nun versuchen Google auf den Fehler aufmerksam zu machen aber glaubt mir ihr werdet damit kein Erfolg haben.

Wie schön wäre es wenn es nun neben Google Maps auch Datenbestände gäbe auf die ich frei zugreifen kann. Die ich frei bearbeiten, verteilen und weiterverarbeiten kann ohne das Google oder sonst wer mir vorschreiben kann wie und zu welchen Bedingungen ich diese nutzen darf. Das Problem hierbei ist allerdings der Preis solcher Daten. Gerade Geodaten sind sehr teuer wenn man diese einkaufen möchte. Da wird wohl kaum jemand her gehen und diese, nachdem er sehr viel Geld dafür ausgegeben hat, einfach verschenken. Deshalb geht man einen anderen Weg und nutzt die Masse der Leute. Wenn man jeden bittet seine Straße vor dem Haus in einer Karte einzutragen so hat man anschließend eine aktuelle, weitgehend fehlerfreie Karte die jeder nutzen kann, ohne das jemand sonderlich viel Mühe rein gesteckt hat.

So und hier fängt nun mein eigentliches Anliegen an. Es gibt viele Projekte die ein solches freies Wissen aufbauen. Doch man wird kaum alle überreden können ihre Straße einzutragen. Allerdings reicht es schon wenn sehr viele Leute möglichst viel eintragen. Dann hat man auch schon eine recht brauchbare Karte. Deshalb herrscht bei solch freien Projekten, die durch ihre Mitglieder angetrieben werden, ein notorischer Mangel an Arbeitskräften. Ich möchte deshalb an dieser Stelle einige mehr oder weniger bekannte Projekte vorstellen die meiner Meinung eine aktive Beteiligung verdient haben.

Da die Überlänge meiner Artikel allerdings langsam zu einem notorischen Problem wird und die Einleitung nun schon wieder den Rahmen Sprengt, gibt es die eigentliche Vorstellung der Projekte erst in den nächsten Tagen.

Sonntag, 27. September 2009

Wählen mit Bleistift

Ich habe heute zum ersten mal in Heilbronn gewählt und war doch schwer verwundert. Ich habe nur ein Faber Castell Bleistift vorgefunden, mit dem ich meine Kreuzchen machen sollte. Empört hab ich natürlich gleich mal gefragt wie das sein kann. Die Aufsicht hat mich mit den Worten "Wir haben sowieso keine Radiergummis hier" versucht zu beschwichtigen.

Anscheinend muss ich ein etwas entsetztes Gesicht gemacht haben denn die Frau neben ihm ist gleich eingesprungen und erklärte mir das es sich um einen Kopierstift handelt. Ich wusste gar nicht das es so etwas überhaupt gibt.

Immer noch etwas skeptisch über die Farbe, die aussah wie ein Bleistiftstrich, habe ich zuhause gleich nachgeforscht und tatsächlich gibt es Kopierstifte die trocken aussehen wie Bleistifte und erst wenn man sie nass macht ändern sie ihre Farbe in violett. Schade, dass ich das nicht schon beim wählen wusste. Den Selbstversuch hätte ich mir nicht entgehen lassen.

Ist das normal? Ich hatte bisher immer Briefwahl gemacht, von daher weiß ich nicht ob dies überall so ist. Nächstes mal spendiere ich denen ein Kulli (nachdem ich den Stift nass gemacht habe um zu testen ob die mich nicht angelogen haben).

Und wenn der Beitrag sowieso schon Off-Topic ist leg ich doch glatt noch eins darauf. Aktuelle Hochrechnung: Piraten 2%!! Sogar auf der Tagesschau-Webseite als eigene Partei gelistet und nicht unter "Andere" geführt! ... Nur das mit Schwarz-Gelb scheint wohl sicher :(

Samstag, 26. September 2009

vim-Mastery: Eingerückt

Tabs, Space (oder beides)?

Es ist ja ein längerer Streitpunkt zwischen Entwicklern, mit welchem Zeichen eingerückt wird. Vim bietet an dieser Stelle drei verschiedene Möglichkeiten:

  • Einrückung mit Tabs - Jede Einrückung wird einfach durch ein Tab-Zeichen ersetzt. Dies ist die Standardmethode in den meisten Editoren so auch in vim. Steuern lässt sich dies mit der Option noexpandtab
  • Einrückung mit Leerzeichen und Tabs - Da Tabs sehr schell sehr hässlich werden, wenn man sie nicht konsequent umsetzt gibt es die Möglichkeit die Breite eines Tabs konstant (default: acht Zeichen) zu lassen aber nur mit weniger einzurücken (shiftwidth). Also zum Beispiel Einrückung vier Zeichen, Tabbreite acht Zeichen: Einmal Tab bedeutet vier Leerzeichen werden eingefügt. Zweimal Tab machen ein wirkliches Tab. Und bei drei wären es ein Tab und 4 Leerzeichen. Setzen lässt sich das über smarttab.
  • Einrückung nur mit Leerzeichen - Jeder Tab wird einfach durch die angegebene Anzahl von Leerzeichen ersetzt. Dies ist auch die von mir favorisierte Methode da nichts irgendwie verhauen wird wenn jemand anderes eine andere Breite von Tabs verwendet. Einstellen lässt sich die Option einfach durch expandtab.

Breite der Einrückung

Hierfür gibt es zwei Optionen. Einmal tabstop und dann noch shiftwidth. Üblicherweise sollte man beides auf den selben Wert lassen. Nur wenn man, wie oben beschrieben, Tabs und Leerzeichen mischen möchte, dann gibt tabstop an wie viele Leerzeichen durch ein Tab ersetzt werden und shiftwidth setzt die Breite einer Einrückungsstufe

Automatische Einrückung

Vim unterstützt selbstverständlich auch eine automatische Einrückung. Hierfür gibt es verschiedene Mods. Einmal gibt es autoindent welches einfach die Einrückung der letzten Zeile in die nächste übernimmt. Etwas Schlauer ist da smartindent. Hierbei werden einige Keywords und geschweifte Klammern beachtet. Diese beiden Methoden bilden die Basis und können immer aktiviert bleiben.

Unabhängig davon gibt es spezielle Einrückungen für eine große Anzahl von Sprachen. Einmal wäre da das eingebaute cindent welches sich auf Einrückung für c spezialisiert. Da man meistens aber doch an anderen Sprachen als c arbeitet gibt es die Möglichkeit einige Einrückungs-Schematas, die in den meisten vim Installationen mitgeliefert werden, zu aktivieren. Hierzu reicht ein einfaches filetype plugin indent on. Hierdurch versucht vim beim laden der Datei durch die Dateiendung oder Shee-Bang-Zeile zu erkennen um welche Art von Datei es sich handelt und lädt das entsprechende Profil. Die installierten Profile liegen in einzelnen Dateien im indent Ordner von vim.

Für die vimrc

Merken wir uns also folgende Optionen für unsere vimrc:

" use only Spaces
set expandtab
" indent with two spaces
set tabstop=2
set shiftwidth=2
" nativ indent detection
set autoindent
set smartindent
" activate language detection
filetype plugin indent on

Commands

Kommen wir nun zu der Anwendung.

Ein-/Ausrücken

Ist man gerade im Einfügemodus kann man einfach mit strg+T eine Stufe einrücken bzw. mit strg+D eine Stufe wieder ausrücken. Viel flexibler ist man allerdings im Befehlsmodus. Hier lassen sich < und > verwenden um entsprechend die Einrückung zu verändern. Am einfachsten über << und >>. Dies verrückt einfach die aktuelle Zeile um eine Stufe. Möchte man nun mehrere Zeilen verrücken dann kann man auch <{motion} verwenden. Motion ist hier jede beliebige Bewegung wie man sie in vim kennt. (G = bis zum Ende des Dokumentes, 35G = bis zur Zeile 35, 3j = 3 Zeilen nach unten, etc...) Interessant ist hierbei das man auch wie gewohnt den letzten Befehl mit . wiederholen kann. Also würde >4.. vier Zeilen drei mal einrücken. Wer sich da noch etwas unsicher ist kann auch erstmal im visuellen Modus alles markieren und dann einfach die markierten Zeilen mit > einrücken. Beispiel: V2j3> rückt die nächsten zwei Zeilen drei mal ein.

Und zum Schluss noch der Kommandozeilenmodus: Hier kann man mittels :left X angeben, dass die Einrückung der aktuellen Zeile (mittels angegebenem Bereich auch mehr als nur die aktuelle Zeile) auf X gesetzt wird.

Für den Spickzettel:

Sorry aber ich habe mal das mehr oder weniger aus der vim Hilfe übernommen. Ich glaub übersichtlicher hätte ich es nicht ausdrücken können.

<{motion}
Shift {motion} lines one shiftwidth leftwards.
<<
Shift [count] lines one shiftwidth leftwards.
{Visual}[count]<
Shift the highlighted lines [count] shiftwidth leftwards.
:[range]<
Shift [range] lines one shiftwidth left. Repeat '<' for shifting multiple shiftwidths.
:[range]< {count}
Shift {count} lines one shiftwidth left, starting with [range] (default current line). Repeat '<' for shifting multiple shiftwidths.
:[range]le[ft] [indent]
left align lines in [range]. Sets the indent in the lines to [indent] (default 0).

Automatisch Einrücken

Und jetzt das Beste. Wer sich ärgert, dass seine Einrückung nicht mehr stimmt soll einfach mal ={motion} ausprobieren. == korrigiert die aktuelle Zeile und wie gewohnt lässt sich dies mit dem visuellen Modus etc kombinieren (siehe oben < Operator). So rückt zum Beispiel ein gg=G den kompletten Text ein.

Misc

Eigentlich wollte ich ja mit diesem Beitrag die komplette Einrückung in vim erschlagen aber irgendwie ist es schon wieder viel zu lange geworden und ich bin immer noch nicht fertig. Es gibt noch Plugins die bei der Einrückung unterstützen und Einstellungen die ein detailiertes Konfigurieren ermöglichen. Was man aber auf jeden Fall noch kurz erwähnen sollte ist einmal :retab welches hilft die Einrückung von Text zu ändern. Und ganz wichtig die Option paste welche, wenn aktiviert einige Optionen so verändert, dass der eingefügt Text nicht durch automatische Einrückung verunstaltet wird. Einfach das nächste mal testen, wenn ihr Text vom Browser in vim einfügt.

Sonntag, 13. September 2009

VPN Schmerzlos

Jedes mal wenn man es verwenden muss ärgert man sich erneut: Immer dann wen man es am wenigsten brauchen kann bricht die VPN Verbindung zusammen und der laufende Download, die SSH Verbindung oder was auch immer grade wichtig war, bricht zusammen. Oder anders herum: Man scheut das Einwählen da man ein Wechseln der IP Adresse grade nicht gebrauchen kann. Viele Applikationen reagieren darauf sehr ärgerlich.

Heute hat es mich einmal zu viel aufgeregt und ich habe beschlossen etwas dagegen zu tun!

Wo ist das Problem?

Schaut man sich ohne VPN seine Routing Table an schaut alles wunderbar aus. Netzinterner Verkehr (192.168.188.0/24) wird direkt ohne Router über das wlan0 Interface gerouted. 127.0.0.0/8 geht über das loopback Device und alles andere wird über wlan0 an den Router bei 192.168.188.1 geschickt.

# route -n
Kernel IP Routentabelle
Ziel            Router          Genmask         Flags Metric Ref    Use Iface
192.168.188.0   0.0.0.0         255.255.255.0   U     2000   0        0 wlan0
127.0.0.0       0.0.0.0         255.0.0.0       U     0      0        0 lo
0.0.0.0         192.168.188.1   0.0.0.0         UG    2000   0        0 wlan0

Wählt man sich nun ins VPN ein bekommt man folgendes Bild zu sehen:

# route -n
Kernel IP Routentabelle
Ziel            Router          Genmask         Flags Metric Ref    Use Iface
193.197.62.114  192.168.188.1   255.255.255.255 UGH   0      0        0 wlan0
141.7.73.73     0.0.0.0         255.255.255.255 UH    0      0        0 tun0
192.168.188.0   0.0.0.0         255.255.255.0   U     2000   0        0 wlan0
127.0.0.0       0.0.0.0         255.0.0.0       U     0      0        0 lo
0.0.0.0         0.0.0.0         0.0.0.0         U     0      0        0 tun0
0.0.0.0         192.168.188.1   0.0.0.0         UG    2000   0        0 wlan0

Was ist nun passiert? Zum einen wurde ein neues Device hinzugefügt (tun0). Alles zu der IP Adresse 192.197.62.144 geht über wlan0. Ich nehme mal an dies ist der Eintrittspunkt ins Netz. 141.7.73.73 geht über das tun0 Device. Dies ist der VPN Server auf dem man sich anmeldet. Nun kommen die bereits gekannten Regeln mit einer Ausnahme: Vor der default Route über meinen Router kommt eine andere Route die alles über das tun0 Device leitet. Das heißt so viel wie alles was nicht an 193.197.62.114, 192.168.188.0/24 oder 127.0.0.0/8 geht wird auf tun0 geleitet und geht somit nicht mehr über meinen Router raus. Möchte ich nun eine Webseite wie indeedgeek.de anschauen muss ich erst über VPN ins Hochschulnetzt gehen und dann von dort wieder raus zu indeedgeek.de. Als Beweis ein Traceroute (wer sich wundert: Das Tool heißt tcptraceroute und geht einfach auf Port 80 da ein normaler traceroute geblockt wird).

# tcptraceroute indeedgeek.de
Selected device tun0, address 141.7.73.73, port 34815 for outgoing packets
Tracing the path to indeedgeek.de (92.51.129.99) on TCP port 80 (http), 30 hops max
1  141.7.75.254  57.261 ms  56.569 ms  56.535 ms
2  FH-Heilbronn1.belwue.de (129.143.124.33)  57.533 ms  56.640 ms  56.714 ms
3  Ulm1.belwue.de (129.143.1.70)  63.486 ms  62.116 ms  61.594 ms
4  Stuttgart1.belwue.de (129.143.1.161)  64.684 ms  73.933 ms  62.531 ms
5  Stuttgart2.belwue.de (129.143.1.25)  62.430 ms  63.443 ms  64.647 ms
6  Frankfurt1.belwue.de (129.143.1.130)  68.713 ms  68.232 ms  70.087 ms
7  xe-0-3-0.cr-merak.fra2.hosteurope.de (80.81.193.239)  78.019 ms  74.123 ms  71.746 ms
8  * xe-0-1-0.cr-altair.cgn2.hosteurope.de (80.237.129.86) 74.100 ms  74.901 ms
9  xe-0-3-0.cr-pollux.cgn3.hosteurope.de (80.237.129.65)  74.367 ms  72.913 ms  75.388 ms
10  xe-16-1.cs-master.r1.cgn3.hosteurope.de (80.237.129.118)  80.181 ms  81.041 ms  74.501 ms
11  * * *
12  indeedgeek.de (92.51.129.99) [open]  81.123 ms  80.154 ms  82.230 ms

Das heißt ich habe von außen nicht mehr die IP Adresse meines DSL-Anschlusses sondern die IP Adresse des Hochschulnetzes. Dieser Wechsel der IP wird von den meisten Programmen sehr übel genommen. Vor allem da er zwei mal auftritt: Einmal beim Einwählen und dann wieder beim Trennen der Verbindung.

Die Lösung

Wenn man sich innerhalb des Hochschulnetzes befindet (z.B. Wlan) dann hat man keine andere Wahl: Wenn Internet dann nur über VPN. Da ist das Einwählen nicht so tragisch da zuvor ja noch keine Internetverbindung bestanden hat. Möchte man aber von Außen auf Dienste innerhalb der Hochschule zugreifen kommt mein Kritikpunkt ins Spiel. Dann hat bereits eine Verbindung bestanden die nun im Grunde getrennt wird und von einer anderen IP erneut aufgebaut werden muss.

Und genau dagegen möchte ich etwas tun. Die Lösung ist einfach. Wir lenken einfach nur den Verkehr über tun0 der auch darüber fließen muss. Der Rest nutzt einfach weiter wie vorher meinen Router. Erreichen kann man dies über zwei kleine Befehle:

route del default dev tun0
route add -net 141.7.0.0 netmask 255.255.0.0 dev tun0

Der erste Befehl löscht die default Route über tun0 und der zweite fügt eine neue Route ein. Diese soll jeden Verkehr an 141.7.0.0/16 über tun0 routen. Schauen wir uns nun die Routingtable an sieht man schön die Änderungen.

route -n
Kernel IP Routentabelle
Ziel            Router          Genmask         Flags Metric Ref    Use Iface
193.197.62.114  192.168.188.1   255.255.255.255 UGH   0      0        0 wlan0
141.7.73.73     0.0.0.0         255.255.255.255 UH    0      0        0 tun0
192.168.188.0   0.0.0.0         255.255.255.0   U     2000   0        0 wlan0
141.7.0.0       0.0.0.0         255.255.0.0     U     0      0        0 tun0
127.0.0.0       0.0.0.0         255.0.0.0       U     0      0        0 lo
0.0.0.0         192.168.188.1   0.0.0.0         UG    2000   0        0 wlan0

Zur Vollständigkeit noch der funktionierende traceroute:

tcptraceroute indeedgeek.de
Selected device wlan0, address 192.168.188.22, port 35522 for outgoing packets
Tracing the path to indeedgeek.de (92.51.129.99) on TCP port 80 (http), 30 hops max
1  192.168.188.1  1.855 ms  6.856 ms  1.530 ms
2  lo1.br63.dus.de.hansenet.net (213.191.64.107)  39.948 ms  47.024 ms  39.611 ms
3  ae0-101.cr02.dus.de.hansenet.net (62.109.110.62)  39.143 ms  38.726 ms  38.570 ms
4  so-0-1-0-0.cr02.fra.de.hansenet.net (213.191.66.34)  42.411 ms  51.295 ms  44.529 ms
5  ae1-0.pr03.decix.de.hansenet.net (62.109.109.236)  48.808 ms * 42.657 ms
6  xe-0-3-0.cr-polaris.fra1.hosteurope.de (80.81.192.239)  43.630 ms  43.009 ms  43.116 ms
7  xe-0-2-0.cr-nashira.cgn4.hosteurope.de (80.237.129.109)  45.807 ms  47.210 ms  72.683 ms
8  xe-2-1-0.cr-pollux.cgn3.hosteurope.de (80.237.129.10)  45.310 ms  45.984 ms  45.996 ms
9  xe-16-1.cs-master.r1.cgn3.hosteurope.de (80.237.129.118)  48.070 ms  46.861 ms  51.865 ms
10  * * *
11  indeedgeek.de (92.51.129.99) [open]  45.604 ms  46.741 ms  47.159 ms

Wie erreicht man nun dies am einfachsten? Zwei Möglichkeiten: Entweder man hindert vpnc daran die default Route zu ändern oder man gibt nach dem Verbindungsaufbau die beiden Befehle ein. Die erste Möglichkeit ist zwar die Elegantere da gar kein Abbruch statt findet. Allerdings war es mir zu nervig in der 530 Zeilen langen Bash Datei (/etc/vpnc/vpnc-script) herumzufummeln. (Zeile 467 ist der Verbrecher). Man müsste ein Schalter einbauen der die default Route im Hochschulnetz setzt und außerhalb eben nicht. Wer sich versuchen möchte nur zu, ich würde mich freuen!

Deshalb die zweite Lösung: Die beiden Zeilen einfach nach Verbindungsaufbau eingeben. Die Programme verkraften meistens eine kurze Trennung und so sollte diese Methode ausreichen.

vpnc in gentoo

Um die Pause möglichst kurz zu halten habe ich die Ausführung automatisiert. Ich glaube so funktioniert es nur in Gentoo aber andere Distributionen werden sich wohl ähnlich verhalten.

Ich habe zwei vpnc Profile angelegt einmal fhhn und einmal fhhn-int (intern). Unter gentoo reicht es einfach die Startscripte und Konfigdateien zu verlinken:

cd /etc/init.d/
ln -s vpnc vpnc.fhhn-int
ln -s vpnc vpnc.fhhn
cd /etc/vpnc/
ln -s default.conf fhhn.conf
ln -s default.conf fhhn-int.conf

Anschließend kann man über /etc/init.d/vpnc.fhhn und /etc/init.d/vpnc.fhhn-int vpnc starten. Es wird automatisch die korrekte Konfigdatei genutz (wobei beide sowieso identisch sind). Nun hat man zwei identische Verbindungen und jetzt kommt das Beste: Wir legen einfach die Datei /etc/vpnc/scripts.d/fhhn-postup.sh an. Diese wird nur bei fhhn aufgerufen (sonst müsste sie fhhn-int-postup.sh heißen). Dort scheiben wir nun unsere beiden route Befehle rein und machen sie ausführbar.

Nun kann ich einfach entscheiden ob ich die Routen umgeschrieben haben möchte (fhhn-int) oder eben nicht (fhhn). Leider bleibt immer noch das Problem, dass die Verbindung ab und zu abbricht. Daran kann ich leider nichts tun aber zumindest sind so nicht mehr alle Dienste davon betroffen.

Vielleicht konnte euch etwas helfen und auch Klaus kann nun Baseline testen ;-).

Disclaimer: Ich hoffe mal ich habe keine geheimen IP Adressen verraten. Ich denke an die Infos kommt jeder mit etwas motivation ran.

Samstag, 5. September 2009

vim-Mastery: Visualisiert

vim bietet viele Möglichkeiten einen bestimmten Bereich zu selektieren und darauf einen Befehl anzuwenden. Beispielsweise würde g~f? den Befehl g~ (Groß-/ Kleinschreibung umdrehen) auf alle Zeichen von der Cursor Position bis zum nächsten ? in der Zeile anwenden oder <3j würde die nächsten drei Zeilen ausrücken.

Aber manchmal ist man eben doch zu faul sich ein Konstrukt zusammen zu basteln welches genau den erforderlichen Text bearbeitet. Oder man möchte auf eine Selektion mehrere Befehle anwenden. Genau dann kommt der visuelle Modus ins Spiel.

Zu erst einmal gibt es drei unterschiedliche Möglichkeiten um Text zu selektieren. Einmal v welches wie man es von anderen Editoren gewöhnt ist Zeichen für Zeichen selektiert. V kann nur komplette Zeilen selektieren. Es ist somit nicht möglich nur halbe Zeilen zu bearbeiten. Und zu letzt noch strg+v welches blockweise selektiert.

Hat man nun angefangen zu selektieren und man merkt, dass am Anfang noch eine Zeile fehlt so kann man mit O zum Anfang der Selektion springen und mit o zum Ende.

Sobald man einmal seinen gewünschten Bereich selektiert kann man darauf dann den entsprechenden Befehl anzuwenden. Somit verschwindet aber der selektierte Bereich wieder. Mit gv ist es möglich die letzte Selektierung wieder herzustellen.

Notiz auf dem CheatSheet:

v
Zeichenweise selektieren
V
Zeilenweise selektieren
strg+v
Blockweise selektieren
gv
Selektierung wieder herstellen