Tipps mit G(VIM)

R

ralli

Guest
An dieser Stelle möchte ich ein paar Erfahrungen für die Arbeit mit VIM posten. Jeder ist gerne aufgerufen, eigene Konfigurationen zu posten, die die tägliche Arbeit erleichtern. Ich fange mal an:

Vim hat auch einen eingebauten kleinen Dateimanager. Aufgerufen wird er mit:

Code:
%Exp Tex

Öffnet den Ordner Tex, aus dem die Datei zur Bearbeitung geladen werden kann.

Möchtest Du wissen, in welchem Arbeitsverzeichnis Du Dich aktuell befindest? Kein Problem:

Code:
:pwd

Ich benutze für das Compilieren von LaTeX Dokumente in der Regel das Kommando:

Code:
:!pdflatex %

Es geht auch komfortabeler. Den Befehl auf eine Funktionstaste mappen, zum Beispiel F2. Dazu tragen wir in die .vimrc ein:

Code:
map <F2> :!pdflatex %

Dann muß ich die Befehlsfolge nicht immer eingeben, sondern drücke einfach F2.

Das war ein kleiner Anfang.

have fun! :)
 
Um ein Vimer der ersten Stunde zu sein, bin ich mindestens zehn Jahre zu jung, aber ich bin inzwischen recht lange dabei. Angefangen habe ich irgendwann um und bei 1999 mit einer der 5.x Versionen. Damals war Vim noch einigermaßen überschaubar, aber über die Jahre ist der Editor stark gewachsen und ich glaube, dass es inzwischen doch recht schwer ist einen sinnvollen Einstieg zu finden. Einfach weil viele Konzepte und Funktionen in der Masse untergehen. Also, mal schnell zusammengetippt:

Die wirkliche Macht des klassischen vi und von viel mehr Vim ergibt sich daraus, dass es eine Sprache ist. Diese Sprache besteht aus Bewegungskommandos, oft Selektoren genannt und aus Befehlen. Als Beispiel gqap, es besteht aus dem Kommando gq für "Formartiere Zeilen" und dem Selektor ap "A Paragraph", also "den aktuellen Absatz". Zusammen "Formierte den aktuellen Absatz". Nun hat Vim eine Unmenge Selektoren und noch viel mehr Kommandos, will man wirklich schnell mit Vim werden kommt man nicht umhin die schlicht und ergreifend zu lernen. Eine gute Strategie ist, mit den grundsätzlichen Selektoren wie h, j, k und l anzufangen und immer, wenn man das Gefühl hat, dass man gerade etwas unnötig kompliziert macht, nachzuschauen wie es besser geht. Und ganz wichtig, Vim ist sehr gut dokumentiert. Man kann viel lernen, wenn man konsequent die Doku liest.

Um in dem Beispiel zu bleiben, :help gq:
Code:
                            *gq*
gq{motion}        Format the lines that {motion} moves over.
            Formatting is done with one of three methods:
            1. If 'formatexpr' is not empty the expression is
               evaluated.  This can differ for each buffer.
            2. If 'formatprg' is not empty an external program
               is used.
            3. Otherwise formatting is done internally.

            In the third case the 'textwidth' option controls the
            length of each formatted line (see below).
            If the 'textwidth' option is 0, the formatted line
            length is the screen width (with a maximum width of
            79).
            The 'formatoptions' option controls the type of
            formatting |fo-table|.
            The cursor is left on the first non-blank of the last
            formatted line.
            NOTE: The "Q" command formerly performed this
            function.  If you still want to use "Q" for
            formatting, use this mapping: >
                :nnoremap Q gq

Und :help ap:
Code:
ap            "a paragraph", select [count] paragraphs (see
            |paragraph|).
            Exception: a blank line (only containing white space)
            is also a paragraph boundary.
            When used in Visual mode it is made linewise.

Außerdem sollte man in jedem Fall sicherstellen, dass Vim nicht im Kompatibilitäsmodus zu vi läuft. Der ist gut und schön, aber man verliert grob geschätzt 98% der Funktionalität und bekommt im Gegenzug all die schönen Bugs des vi. Dazu muss in der vimrc möglichst weit oben set nocompatible aufgerufen werden.

Überhaupt ist die vimrc sozusagen der heilige Gral, über Jahre gepflegt und um den eigenen Workflow gebaut, kann sie überraschende Dimensionen annehmen. Es ist daher eine gute Idee die vimrc gleich von Beginn an sauber zu kommentieren und strukturiert aufzubauen, idealerweise trackt man sie noch über svn, git oder einem anderen Versionsverwaltungssystem. Irgendwann sieht es dann so aus: https://github.com/yamagi/vimrc Aber dazu auch gleich eine Warnung. jeder Mensch ist anders, er arbeitet anders, hat andere Workflows, etc. Daher sollte man niemals eine vimrc übernehmen, sich lediglich inspirieren lassen.

Vim hat auch einen eingebauten kleinen Dateimanager.
Für Dateimanager ist das NERDTree Plugin zu empfehlen: https://github.com/scrooloose/nerdtree

Nachtrag: Wenn man mit Plugins anfängt, ist man schnell bei dem Thema Pluginmanager. Daran scheiden sich die Geister, es gibt entsprechend viele Möglichkeiten. Für den Anfang (und oft auch für größere Setups) ist allerdings der seit Vim 8.0 integrierte Pluginmanager, der auf dem beliebten Manager "Pathogen" basiert, völlig ausreichend. Wechseln kann man immer noch.

Den Befehl auf eine Funktionstaste mappen, zum Beispiel F2.
Ich würde stattdessen den Leader auf , remappen. In Standardeinstellung ist er auf \, was auf dem deutschen Layout sehr schwer zu erreichen ist. Dann erhältst du eine komplette zweite Mapping-Ebene, die du mit , gefolgt einer beliebigen Tastenfolge erreichen kannst. Als Beispiel:
Code:
let mapleader=","
nmap <Leader>p :!pdflatex %
Schon kannst du pdflatex über ,p aufrufen und musst nicht auf F2 umgreifen. Außerdem wirst du mit der Zeit viele Mapping sammlen, mit 12 Funktionstasten ist da schnell die Grenze erreicht.
 
Ich finde die Vervollständigungsfunktionen sehr praktisch.

z.B. steht irgendwo im Text "Grottenolmfußpilz" und man möchte das Wort nochmal schreiben. Also fängt man mit "Gr" an und drückt "Ctrl+n", schon wird ein im Text (oder in Include-Files) vorkommendes Wort an der Stelle eingefügt. Gibt es in obigen Fall kein anderes, was mit "Gr" anfängt, ist man schon fertig, ansosnten kann man mit weiteren Aufrufen von "Ctrl+n" die Wortliste vorwärts und mit "Ctrl+p" die Wortliste rückwärts durchlaufen.
Das ist auch sehr praktisch beim Programmieren - man kann so schnell und fehlerfrei schon vorhandene Variablennamen einfügen.

Tippt man gerade einen Dateipfad ein, ist "Ctrl+x f" das Mittel der Wahl. Also nach dem Drücken von "x" noch die Ctrl-Taste festhalten und ein "f" nachschieben. Hierdurch wird der Pfad unter dem Cursor ergänzt.

Will man im Text alle Vorkommisse von "Grottenolmfußpilz" durch "Echsenfäule" ersetzen, kommt ja im Ex-Modus der Befehl :%s/foo/bar/g zum Einsatz. Hier kann man sich das Tippen des Suchbegriffs sparen, indem man den Cursor auf das Wort bewegt, dann :%s/Ctrl+r w/Echsenfäule/g eingibt. Als Merker: "r w == Read word".
 
Ja, autocomplete mit Ctrl-n oder Ctrl-p ist schon genial ( im Insert Mode )

erweitern kann man das mit dictionaries - Beispiel:
:set dictionary+=/usr/share/dict/words
:set complete+=k


dann einfach mal im Insert-Mode irgendwas schreiben, z.B.
sens und dann ctrl+n
.................................................
Unabhängig vom autocomplete fällt mir gerade noch mks ein
:mks ( Abkürzung für mksession ) erstellt ein sogenanntes Session-File in dem alle
aktuellen (Format)Einstellungen wie Fenster, Größe, Anordnung etc. abgespeichert werden.

wenn man dann vim wieder startet, benutzt man einfach den switch -S und die Einstellungen werden beim vim-start aus dem Session-file gelesen
vim -S
vim kann natuerlich auch unterschiedliche sessions verwalten
d.h. man speichert die sessions mit einem passenden Namen:
:mks ~/normal_session
oder :mks ~/clang_dev_session
und startet dann entsprechend mit
vim -S ~/clang_dev_session
oder falls man beim vim Start vergessen hat -S mit anzugeben, dann
eben im vim mit
:source ~/clang_dev_session
 
Mal was Grundsätzlich ( und nur fuer Anfänger ) zum Thema vim
( wobei in diesem Kontext vim auch für vi, gVim, neoVim, MacVim usw. steht)

Wenn man nicht schnell die Lust am vim verlieren will, weil einem die Fülle der Kommandos erschlägt oder einem das ganze Konzept nicht logisch erscheint -
muss man sich dem Teil erstmal etwas abstrakt nähern ... um die
Philosophie des vi begreifen zu können.

Es bringt also nichts magische Kommandos auswendig zu lernen ohne diese Dinge im Kontext des Gesamtkonzeptes zu sehen.

Ein Beispiel:
Wie beende ich vim?
:q oder :wq oder :q! oder ZZ ???
ist alles ein bisschen richtig - funktioniert aber nur manchmal - und somit auch alles ein bisschen falsch!

Warum? Nun q im command-mode beendet nicht vim, sondern schliesst das aktuelle Fenster - was aber auch bedeutet,
wenn nur ein Fenster offen ist, wird das Fenster geschlossen und zugleich vim beendet.

Warum ist das aber so?
Dazu muss man sich erstmal das Konzept des VIM anschauen, bzw sich mit dessen verschiedenen Modi
vertraut machen.

mal die wichtigsten Modi fuer den Anfang:
1. Normal - Modus
2. Insert - Modus
3. Kommando - Modus
4. Visuell-zeichenorientierter - Modus
5. Visuell-zeilenorietiernter - Modus
6. Visuell-blockorientierter - Modus
...und noch viele andere Modi

(1) der Normal-Mode:
er ist der wichtigste und am häufigsten benutzte Mode.
Deshalb ist das auch der Mode, in den VIM startet und den man mit der einfachsten
zu merkenden Taste <ESC> erreichen kann.
Dies ist deshalb wichtig, weil in diesem Mode im Text navigiert wird und alle anderen Modi
aus dem Normal-Mode heraus aufgerufen werden müssen - oftmals auch abhängig von der
Navigation im Text - aber nicht nur.

(2) der Insert-Mode:
hier kann man Text einfügen
Man wechselt vom Normal-Mode mit dem i in den Insert-Mode und kann Zeichen am Anfang einer leeren Datei oder links
vom Cursor einfuegen.
wechselt man mit dem a in den Mode so kann man rechts vom Cursor ein Zeichen einfuegen.
Bei leerer Datei verhalten sich i und a logischerweise gleich.
Starte ich mit shift a, so füge ich am Ende der Zeile ein - mit shift i am Anfang der Zeile.

Hier wird jetzt auch schon mal ansatzweise klar, warum vim nach einer gewissen Lernphase ein
intuitiv zu bedienender Editor wird.
Ich muss nur wissen wissen, was i und a machen - und mir vor Augen halten, dass in Kombination mit
shift dieses Kommando irgendwie verstärkt wird, also mit shift A append rechts vom Cursor,
aber am Zeilenende!
Ausser der HaJotKaEl - Navi dürften alle anderen Zeichentasten-Befehle ohnehin leicht zu merken sein
( a fuer append, i insert, y für yank, g fuer go ...)

(3) der command-Mode
Möchte ich nun aus dem Insert-Mode meine Textdatei speichern und vim beenden,
so muss ich mit ESC in den Normal Mode wechseln, denn nur dort kann ich den command-mode
mit dem Befehl : (also Doppelpunkt) aufrufen und die nötigen Kommandos wie z.B.
w mein_file.txt und danach q aufrufen und das vim-Fenster zu schliessen.

An dieser etwas langatmigen und trivialen Darstellung wollte ich mal deutlich machen,
dass das aktuelle vim Fenster eben nicht mit <ESC>:q geschlossen wird ..sondern ganz schlicht mit
q

<ESC> wechselt in den Normalmode aus dem dann mit dem Doppelpunkt : der command-mode aufgerufen wird,
damit dort mit w und q gespeichert und beendet werden kann
 
Fortsetzung:
Ergänzend zum vorhergehenden Beitrag, der versucht hat die Idee von Vim
seiner Modus-Struktur zu skizzieren und Euch animieren soll, dies bei der Arbeit mit Vim
zu beachten ... möchte ich noch kurz ergänzen, dass die v-Modi aus dem Normal-Modus unterschiedlich aufgerufen werden.
Dabei unterscheidet man:
- v macht den Visual-Mode zeichenorientiert, dh es wirken h j k l wie erwartet.
- <shift> V macht den v-mode zeilenorientiert, dh nur j und k markieren im ~Text nach oben und unten inclusive LF
- <ctrl> v macht den v-mode blockorientiert, dh hjkl markieren im Text Blöcke, so als ob es kein LF gäbe
- ideal fuer Tabellen, senkrechte Striche usw.

Nun kommen wir zu den beiden IMHO geilsten und kürzesten Kommandos im Normalmode -
dem Punkt <.> und dem u

der Punkt wiederholt das letzte Kommando - das u macht das letzte Kommando rückgängig.
Klingt erst mal banal - ist aber sehr mächtig.

Zuerst einmal muss man sich klar machen, was denn ein Kommando ist.
Beispiel:
aus dem n-Mode mit a in den Insert-Mode gehen,
dort eine Zeile Text eingeben - und noch eine Zeile und noch eine Zeile ... und das beliebig oft
sagen wir mal 99 Zeilen Text insgesamt , jede Zeile mit <Enter> abgeschlossen
und zum Schluss die Zeile " das ist die letzte Zeile " und < ENTER >... und dann irgendwann mit
<ESC> wieder in den N-Mode wechseln .

wenn man nun den Punkt drückt um das letzte Kommando zu wiederholen, dann wird nicht
die letzte Zeile "das ist die letzte Zeile <LF>" eingefügt - sondern alle 100 Zeilen.
In dem Fall kann man sich merken, dass ein Kommando alles das ist, was vom Aufruf
des Insert-Mode bis zum <ESC> eingegeben wurde --- und was was durch den Punkt-Befehl wiederholt wird.

In der Praxis hat das natürlich weniger Bedeutung, da man selten grosse Textteile einfach wiederholend
aneinander hängt - und falls doch, es dafür im VIM bessere Werkzeuge gibt -
zum Verständnis des Punkt-Befehles ist es aber nicht ganz unwichtig.

Grundsätzlich kommen jetzt auch die Register des vim ins Spiel.
Wenn man in einer Datei mal ein paar Arbeiten gemacht hat, sollte man sich im command-mode
(also Doppelpunkt im N-Mode eingeben ) mal mit dem Befehl reg deren Inhalte ansehen.

Registernamen beginnen immer mit einem doppelten Hochkomma "
das erste Register heisst "" ( also Hochkomma als Identifizierer von Register und weiteres Hochkomma als eigentlicher Name)
im "" steht immer das zuletzt mit yank, delete etc. bearbeitete Textteil
dann kommen die Register "0 ..."9 die sich wie ein Stack verhalten.
Einfach mal nach jedem Kommando im Text immer wieder in den command-mode wechseln und mit reg sich die Registerinhalte
ansehen dann werden die Idee und Arbeitsweise von den Registern 0 bis 9 schnell klar.
( da reg immer nur die register anzeigt, in denen schon etwas steht ..ist es eine gute Idee im Text wirklich mal ein bisschen
zu wuehlen ... von yy, dd, p usw. mehrfach Gebrauch zu machen )

Zusätzlich gibt es noch die Register "a .. "z .. also 26 Register die wir ganz individuell mit
Texten ( Text ist nicht nur auf eine Zeile beschränkt ), Befehlsfolgen, Makros usw. füllen koennen.

ps. um sich die Registerlogik anzuschauen ist es eine gute Idee den vim zuvor mit
vim -u NONE
zu starten ( denn bestimmte Einträge in der .vimrc oder gar plugins wie nerdtree lassen einzelne Register
komisch aussehen und verwirren dann nur )
 
Dabei unterscheidet man:
- v macht den Visual-Mode zeichenorientiert, dh es wirken h j k l wie erwartet.
- <shift> V macht den v-mode zeilenorientiert, dh nur j und k markieren im ~Text nach oben und unten inclusive LF
- <ctrl> v macht den v-mode blockorientiert, dh hjkl markieren im Text Blöcke, so als ob es kein LF gäbe
- ideal fuer Tabellen, senkrechte Striche usw.

Was weniger Leute wissen, das man besser mit den anderen Bewegungsbefehlen im Visual Mode vorwärts kommt. Bevor man also 10 mal l drückt um 2 Wörter zu markieren. Kann man das auch mit 2e oder 2w machen je nachdem ob mit oder ohne Lehrzeichen nach dem 2ten Wort.
Und das man z.B. vom v-block mode das I (also <shift> i) benötigt um in den Insert-Mode zu gelangen ist auch nicht jedem gläufig...
Ich habe damit schon häufiger mehrere Zeile auf die schnelle auskommentiert: sagen wir mal 5 Zeilen auskommentieren ... zur 1. Zeile: 0<ctrl-v>4jI# <esc>
 
Zurück
Oben