Vim: Unterschied zwischen den Versionen

Aus wiki.archlinux.de
 
(71 dazwischenliegende Versionen von 13 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
<div style="float:right; width:321px">[[Bild:Vi_fstab.png|thumb|300px|Vim zeigt eine [[fstab]] in [[xterm]], hier mit aktiviertem Syntax-Highlighting]]<br />
{{hinweis|Dieser Artikel bezieht sich ausdrücklich auf '''Vim''', den leistungsfähigeren Klon von [[vi]]}}
{{righttoc}}</div>
{{righttoc}}
Der folgende Artikel ist eine kleine Einführung und ein Spickzettel zu Vi und dessen erweitertem Nachfolger Vim. Die Einführung beschränkt sich auf die wichtigsten Grundlagen, versucht diese allerdings einfach und nachvollziehbar zu vermitteln. Im Spickzettel und den Tipps werden auch fortgeschrittene Befehle aufgelistet, allerdings ohne Anspruch auf Vollständigkeit.
[[Bild:Vi_fstab.png|thumb|300px|Vim zeigt eine [[fstab]] in [[xterm]], hier mit aktiviertem Syntax-Highlighting]]


== Einführung ==
Vim ist einer der am weitesten fortgeschrittenen, freien Klone des Standardeditors vi und als solcher ein de-facto-Standard vor allem auf Linux Systemen. Zusätzliche Eigenschaften sind z.B.
Der auf allen POSIX-konformen Systemen vorhandene Vi wurde bereits in den siebziger Jahren entwickelt und weist einige Unterschiede zu moderneren Editoren auf. Wer schon einen ersten Kontakt mit ihm hatte weiß, dass es zum Beispiel nicht möglich ist, einfach so drauflos zu tippen; entweder es passiert gar nichts, oder nicht das, was man erwartet hätte. Dann, wenn man sich frustriert einem anderen Editor zuwenden möchte, hat man auch schon das nächste Problem: Keine der sonst üblichen Methoden helfen bei dem Versuch, dem Methusalem der Editoren den Rücken zu kehren. Um zumindest den Rückzug zu sichern: Escape drücken und Eingabe von ''':q!''' beenden den Vi sofort.
* Syntax-Highlighting,
* Programmierbarkeit,
* Erweiterbarkeit durch Plug-Ins,
* Code Folding (Einklappen von Abschnitten im Text) sowie
* Darstellung in mehreren Teilfenstern.


=== Modi ===
{{Installation|repo=extra|paket=vim}}
Der Vi befindet sich immer in genau einem Modus, welcher die Reaktionen des Editors auf Tastatureingaben bestimmt. Nach dem Start befindet man sich im ''Befehlsmodus'', welcher keine Texteingabe, sondern durch  Tastaturbefehle gesteuerte Bearbeitung des Textes, wie zum Beispiel das Löschen von Zeilen, ermöglicht.


Um vom Befehlsmodus in den ''Einfügemodus'' zu gelangen, muss '''i''' gedrückt werden. In diesem Modus verhält sich der Vi im Prinzip wie ein moderner Editor: Die Eingabe wird vor dem Cursor eingefügt. Um nun wieder  zum Befehlsmodus zurückzukehren, muss die Escape-Taste gedrückt werden.
Vim ist nur auf der Konsole oder in einem Terminal aufrufbar.


Der ''Kommandozeilenmodus'', welcher im Vergleich zum Befehlsmodus komplexere Befehle ermöglicht und auch für die meisten Dateioperationen genutzt wird, ist der letzte im Bunde. Dieser wird durch Eingabe eines ''':''' im Befehlsmodus erreicht und nimmt dann einen Befehl in der untersten Bildschirmzeile entgegen.
Anleitungen zur Bedienung sind unter Weblinks zu finden.


Zusätzlich zu den oben genannten Modi steht im Vim der ''visuelle Modus'' zur Verfügung. Er ermöglicht die, an moderne Editoren angelehnte, visuelle Selektion von Text. (Im klassischen Vi wird dies mit den Registern realisiert) Auf ihn wird im Rahmen der Einführung nicht weiter eingegangen.
Die GUI-Variante GVim befindet sich in einem gesonderten Paket.
# pacman -S gvim
Dieses Programm öffnet ein eigenes X11-Fenster, besitzt ein Menü, Datei-Dialoge,Scroll Bar, und weitere GUI-Spezifische Eigenschaften.


==== Beispiel ====
Vim steht in Konflikt mit GVim: Es kann entweder Vim oder GVim installiert werden, aber nicht beide Programme gleichzeitig. Siehe [http://www.archlinux.org/news/vimgvim-72411-update/ News: Vim/GVim 7.2.411 Update]. Allerdings bringt das Paket gvim die nichtgrafische Variante mit, die wie gewohnt mittels vim gestartet werden kann.
Um eine Datei zu editieren und gegebenenfalls zu erstellen ruft man Vi mit dem Dateinamen als Argument in der Shell auf:


$ vi hallo
Es existieren zudem in den Repositorys eine ganze Reihe separat zu installierender Plug-Ins.


Nachdem man durch drücken der Taste '''i''' in den Eingabemodus gewechselt hat, kann Text eingegeben werden:
== Konfiguration ==
Hallo Welt!
vi und Vim benutzen die Konfigurationsdatei {{ic|~/.exrc}} gemeinsam, wenn beide Programme installiert sind. Die Einstellungen sind nicht kompatibel zueinander. Man sollte Vim ausschließlich über {{ic|~/.vimrc}} konfigurieren und die Option {{ic|noexrc}} setzen.
~
~


Die Tilden, welche unterhalb des Textes dargestellt werden, dienen übrigens lediglich dazu, die entsprechenden Zeilen von Leerzeilen unterscheiden zu können -- Sie sind nicht Bestandteil des Textes.
Manuelle Einstellungen können in o.g. Konfigurationsdatei geschrieben werden, dann ohne führende Doppelpunkte. Vim bietet allerdings auch die Möglichkeit, solche Optionen zur Laufzeit zu setzen, zu testen und in die Konfigurationsdatei(en) zu speichern. Die Kommandos dazu lauten:
:set all
:set <option> oder
:set no<option>
:set <option> = <value> :mk oder :mk! (oder :mkexrc oder :mkexrc!)
{{ic|:mkexrc}} und {{ic|:mkexrc!}} führen u.U. zu oben genanntem Konflikt mit vi. Statt {{ic|:set <option>}} zum Setzen von Optionen kann auch {{ic|:set no<option>}} zum Entfernen der Optionen verwendet werden.


Jetzt, da der Text eingegeben worden ist, kann der Einfügemodus durch Drücken von Escape verlassen werden. Der Kommandozeilen-Befehl ''':wq''' (w: write, q: quit) speichert die Datei und beendet die Vi-Sitzung.
Die Auflistung aller möglichen Einstellungen über das klassische, von vi bekannte {{ic|:set all}} verschafft bereits intuitiv Klarheit über bereits getätigte Einstellungen.


~
GVim besitzt zudem die Möglichkeit, Einstellungen auch über Menüs bzw. grafische Dialoge vorzunehmen.
~
:wq


Fertig! Das war die erste erfolgreich mit Vi erstellte Datei!
===Nützliche Optionen===
:set nobackup                # Backups ausschalten
:set ruler                    # Zeile und Spalte anzeigen
:set number                  # sollte "set ruler" nicht klappen, kann man diese Option nehmen
:set nocompatible            # nicht im Kompatibilitätsmodus arbeiten, d.h. Vim-spezifische Erweiterungen nutzen
:set noexrc                  # ~/.exrc nicht benutzen
:set noerrorbells            # nicht piepsen, wenn man an Textbegrenzungen anstößt o.ä.
:set showmode                # den aktuellen Mode anzeigen
:set nowrap                  # lange Zeilen nicht umbrechen
:set scrolloff=x              # x-Zeilen vor dem Rand wird schon gescrollt
:set tabstop=x                # Einmal tab gedrückt entspricht x - Leerzeichen
:set clipboard=unnamedplus    # Wenn man etwas kopiert, dann wird das in's clipboard kopiert, sodass man es überall wieder pasten kann


$ cat hallo
==Tipps und Tricks==
Hallo Welt!
===Datei {{ic|.viminfo}}===
Wer viel mit Vim arbeitet, wird feststellen, dass diese Datei stetig anwächst. Die Datei speichert bis zu einer gewissen Länge die Historie dessen, was der Benutzer mit Vim macht. Sie enthält dabei auch Textbestandteile, allerdings möglicherweise nicht nur von Dateien, die es längst nicht mehr gibt, sondern vielleicht auch sicherheitsrelevante und sensible Daten. Man kann diese Datei getrost löschen, auch automatisch, z.B. beim Login. Damit einhergehend verliert man dann aber die Möglichkeit, bereits schon mal eingegebene Befehle mit {{ic|:<?>}} zu durchsuchen.
=== Navigation ===
===Syntax-Highlighting===
==== Die Vi-Keys ====
Möglicherweise kommt es nach einem Update dazu, dass das bislang einwandfrei funktionierende Syntax-Highlighting plötzlich ausgeschaltet ist. Ursache ist das beim Update von Vim dessen globale Konfigurationsdatei ausgetauscht wird. Man kann es explizit wieder einschalten, indem man in {{ic|~/.vimrc}} die Zeile
Obwohl es in modernen Vi-Abkömmlingen wie dem Vim möglich ist, im Eingabemodus durch Verwendung der Cursortasten zu navigieren, ist dies aus verschiedenen Gründen nicht empfehlenswert. Erstens ist diese Möglichkeit nicht bei allen Vis gegeben (und sie kann auch unter Vim versagen, zum Beispiel beim Remote-Login oder falsch konfiguriertem tty), zweitens widerspricht sie dem Grundkonzept des modalen Editierens. Den Eingabemodus auch ausschließlich als solchen zu nutzen ist zwar anfänglich ungewohnt, ermöglicht jedoch die Verwendung der elaborierten Navigations- und Editierbefehle des Vi, welche durch eben diese Trennung nach einem gewissen Lernaufwand einfach, schnell und handgelenkschonend (z.B. im Vergleich zu Emacs Keychords) sind.
  syntax enable
 
einfügt. Nach einem Neustart von Vim funktioniert das Syntax-Highlighting wieder wie erwartet. Man sollte mittels {{ic|:set all}} den Wert der Option {{ic|:syntax}} prüfen. Dieser sollte auf "vim" stehen. Wenn nicht, sollte man dies ebenfalls in die {{ic|~/.vimrc}} schreiben:
Die Funktion der Cursortasten übernehmen im Befehlsmodus die sogenannten ''Vi-Keys'' '''hjkl''', welche aufgrund ihrer günstigen Lage auf der Grundreihe ausgewählt wurden:
  syntax=vim
 
===integrierte Rechtschreibprüfung===
      '''k'''
Es werden dafür zusätzlich die Wörterbücher benötigt. Diese können mittels [[Pacman]] nachinstalliert werden z.B. vim-spell-de.
      ^
Prüfe, ob die Option aktiviert ist
      |
  :spellinfo
  '''h'''<--+-->'''l'''
Aktiviere die deutsche Rechtschreibprüfung
      |
  :setlocal spell spelllang=de_de
      v
Nun werden die falschen bzw. unbekannten Wörter markiert.
      '''j'''
==== Befehle im Kommandomodus ====
 
{|{{prettytable}}
Diese Befehle sind allerdings — wie Vi im Allgemeinen — zeilenorientiert. So würde ein einziges j einen gesamten im Fließtext geschriebenen Absatz überspringen. Im Vim kann man dieses Problem durch drücken von '''g''' vor dem entsprechenden Befehl umgehen.
 
===== Beispiel =====
Öffnen der eben erstellten Datei:
 
$ vi hallo
Durch drücken der '''l'''-Taste hinter das Wort navigieren:
 
Hallo| | Welt!
~
~
 
Mittels '''i''' in den Einfügemodus wechseln und Text einfügen:
 
Hallo meine| | Welt!
~
~
 
Speichern und beenden durch Escape-''':wq''':
~
~
:wq
 
==== Wort-, satz- und absatzweise Navigation ====
Da zeichen- und zeilenweise Navigation, wie sie die Vi-Keys ermöglichen, gerade bei großen Dateien und langen Zeilen sehr ineffizient sein kann, gibt es viele andere Möglichkeiten um zum Beispiel wort-, satz- oder abschnittsweise zu navigieren, welche einen enormen Geschwindigkeitsvorteil bringen. Diese hier aufzuführen geht allerdings über den Rahmen der Einführung hinaus, da die Kenntnis jener Kommandos nicht essenziell ist. Somit sei auf den Spickzettel, die Tipps und weitere Dokumentation im Web verwiesen.
   
=== Löschen und Ändern ===
Löschen mittels Backspace ist im Vi nur für die aktuelle Eingabe und nicht über Zeilengrenzen hinweg möglich. Diese Einschränkung gibt es im Vim zwar nicht, aber auch hier gilt: Der Einfügemodus ist eben ein Solcher.
 
Um Text unter dem Cursor zeichenweise zu löschen verwendet man '''x'''; '''X''' macht das Gleiche für Zeichen vor dem Cursor. Soll eine ganze Zeile gelöscht werden, kommt '''dd''' zum Einsatz. Möchte man Löschen und Einfügen kombinieren, stehen Befehle zum Ändern zur Verfügung; so lässt sich zum Beispiel eine ganze Zeile mittels '''cc''' ändern.
 
==== Beispiel ====
Die Datei öffnen und etwas hinzufügen (Mit '''a''' kann man hinter dem Cursor einfügen):
 
Hallo meine Welt!
Und Tschüss!| |
~
~
 
Wenn man das "meine" in der ersten Zeile löschen will, so bewegt man sich mittels der Vi-Keys an den Anfang des Wortes und drückt solange '''x''', bis dieses gelöscht ist:
 
  Hallo |W|elt!
  Und Tschüss!
  ~
  ~
 
Will man nun doch die gesamte erste Zeile löschen, so drückt man '''dd''' im Befehlsmodus:
 
  |U|nd Tschüss!
  ~
  ~
 
Soll eine Zeile geändert werden, kann dies mit '''cc''' geschehen, ohne danach explizit in den Einfügemodus wechseln zu müssen:
 
  Ciao!| |
~
~
 
=== Kopieren und Einfügen ===
Um eine Zeile zu kopieren, was im Vi-Jargon als ''yank'' bezeichnet wird, nutzt man das Kommando '''yy'''. Sollen mehrere Zeilen kopiert werden, so kann man deren Anzahl einfach dem Kommando vorausstellen, also zum Beispiel '''10yy''' um zehn Zeilen zu yanken.
 
Zum Einfügen über dem Cursor nutzt man '''P''', zum Einfügen darunter '''p'''. Dies funktioniert auch mit per '''dd''' gelöschten Abschnitten.
 
==== Beispiel ====
Um die ersten beiden Zeilen des Textes zu kopieren, positioniert man den Cursor irgendwo auf der ersten Zeile und drückt '''2yy''':
 
Lorem ipsum dolo|r| sit amet, consectetur adipisicing elit, sed
do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Ut enim ad minim veniam, quis nostrud exercitation ullamco
laboris nisi ut aliquip ex ea commodo consequat.
~
~
 
Soll dieser Text unterhalb der letzten Zeile eingefügt werden, so bewegt man sich zu derselben (z.B. mittels '''G''') und drückt '''p''':
 
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed
do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Ut enim ad minim veniam, quis nostrud exercitation ullamco
  laboris nisi ut aliquip ex ea commodo consequat.   
|L|orem ipsum dolor sit amet, consectetur adipisicing elit, sed
  do eiusmod tempor incididunt ut labore et dolore magna aliqua.
~
~
 
=== Undo ===
Hat man sich dann doch mal total verhaspelt, stellen die meisten Vis eine Undo-Funktion zur Verfügung. Unter dem original Vi konnte allerdings nur der letzte Schritt rückgängig gemacht werden.
 
;nvi
:Im BSD-Vi wird durch Drücken von '''u''' die letzte Aktion rückgängig gemacht, erneutes Drücken von '''u''' macht das Undo rückgängig. Um das Undo zu wiederholen wird '''.''' verwendet. Redo ist also im nvi ein Undo des Undo.
 
;Vim
:Der Vim nimmt mit jedem '''u''' eine Aktion zurück, Redo liegt auf '''Strg-R'''.
 
Alle Vis kennen '''U''', um alle in einer Zeile durchgeführten Änderungen rückgängig zu machen.
 
Außerdem werden die letzten neun gelöschten Abschnitte (alles >= einer Zeile) in nummerierten Registern gespeichert, welche durch '''"np''' wieder eingefügt werden können. So lässt sich der vorletzte ausgeschnittene Abschnitt beispielsweise mittels '''"2p''' einfügen. Durch wiederholtes drücken von '''u.''' lassen sich dann sukzessiv die anderen Register ersetzen.
 
=== Vi beenden ===
Lässt sich der Editor nicht mittels ''':q''' beenden, weil die Datei zwar geändert, aber nicht gespeichert wurde, so kann man mit einem Ausrufezeichen die Beendigung forcieren (''':q!'''). Möchte man den Editor nur verlassen, um die Datei im Ausgangszustand erneut zu editieren, so kann man dies auch mittels ''':e!''' erreichen.
 
Soweit die Einführung. Zwar wurde nur das absolut Nötigste vermittelt, doch nun sollte man beispielsweise dazu in der Lage sein, kleinere Änderungen an Konfigurationsdateien vorzunehmen. Weiterführende Themen, wie zum Beispiel effizienteres Editieren und Konfiguration, werden im Abschnitt Tipps besprochen, oder man kann den Spickzettel zu Rate ziehen.
 
== Spickzettel ==
Dieser Spickzettel soll eine Übersicht zu den wichtigsten Vi-Kommandos liefern. Vim-spezifische Kommandos sind als solche ausgewiesen.
 
=== Navigation ===
{|border="1"
|style="width:10em;background-color:#E5E5E5"|'''Befehl'''
|style="width:10em;background-color:#E5E5E5"|'''Befehl'''
|style="width:40em;background-color:#E5E5E5"|'''Wirkung'''
|style="width:40em;background-color:#E5E5E5"|'''Wirkung'''
|-
|-
|h        || links
|]s  || Gehe zum nächsten falschen Wort
|-
|-
|l        || rechts
|[s || Gehe zum vorherigen falschen Wort
|-
|-
|j        || unten
|zg || Fügt das Wort unter dem Cursor dem Wörterbuch hinzu, das in der Variable spellfile steht.
|-
|-
|k        || oben
|zG || Speichert Wort unter Cursor in interner Wortliste, diese geht nach dem Schließen von Vim verloren
|-
|-
|w        || wortweise vor
|zw || Fügt das Wort als falsch der Wörterbuchdatei aus der spellfile-Variable hinzu
|-
|-
|W        || wortweise vor, inklusive Sonderzeichen
|zW || Speichert Wort als falsch in interner Wortliste
|-
|-
|b        || wortweise zurück
|z= || Bietet eine Auswahl von Korrekturvorschlägen an
|-
|-
|B        || wortweise zurück, inklusive Sonderzeichen
|zug zuw zuG zuW || Löscht das Wort unter dem Cursor aus der entsprechenden Liste
|-
|e        || zum Wortende
|-
|E        || zum Wortende, inklusive Sonderzeichen
|-
|)        || satzweise vor
|-
|(        || satzweise zurück
|-
| }        || absatzweise vor
|-
|{        || absatzweise zurück
|-
|0        || zum Zeilenanfang
|-
|^        || zum ersten sichtbaren Zeichen der Zeile
|-
|nG      || zur n-ten Zeile
|-
|:n      || zur n-ten Zeile
|-
|gg      || Vim, zur ersten Zeile
|-
|G        || zur letzen Zeile
|-
|%        || zur passenden Klammer
|-
|H        || zum Bildschirmanfang
|-
|M        || zur Bildschirmmitte
|-
|L        || zum Bildschirmende
|}
 
=== einfaches Editieren ===
==== Einfügen ====
{|border="1"
|style="width:10em;background-color:#E5E5E5"|'''Befehl'''
|style="width:40em;background-color:#E5E5E5"|'''Wirkung'''
|-
|i        || vor dem Cursor einfügen
|-
|I        || am Anfang der Zeile einfügen
|-
|a        || hinter dem Cursor einfügen
|-
|A        || am Ende der Zeile einfügen
|-
|o        || Zeile unterhalb einfügen
|-
|O        || Zeile oberhalb einfügen
|}
|}
 
==== Automatisch aktivieren ====
==== Löschen ====
Will man de Rechtschreibprüfung für bestimmte Dateitypen (unterschieden durch den Dateinamenssuffix) aktivieren, so kann man dies über die {{ic|~/.vimrc}} konfigurieren.
{|border="1"
# Wann geladen wird              # Maske  # Aktivieren      # Zu verwendende Sprache
|style="width:10em;background-color:#E5E5E5"|'''Befehl'''
au BufNewFile,BufRead,BufEnter  *.wiki    setlocal spell    spelllang=de_de
|style="width:40em;background-color:#E5E5E5"|'''Wirkung'''
au BufNewFile,BufRead,BufEnter  *.md      setlocal spell    spelllang=de_de
|-
au BufNewFile,BufRead,BufEnter  *.txt    setlocal spell    spelllang=de_de
|x        || Zeichen unter dem Cursor löschen
au BufNewFile,BufRead,BufEnter  README    setlocal spell    spelllang=en_us
|-
Dieses Beispiel aktiviert die Rechtschreibprüfung auf Deutsch für alle Dateien mit {{ic|.wiki}} als Suffix, für alle Markdown-Dateien ({{ic|.md}}) und für alle Textdateien, die durch {{ic|.txt}} gekennzeichnet werden. Zusätzlich wird für alle Dateien mit dem Namen {{ic|README}} die englische Rechtschreibprüfung aktiviert.
|X        || Zeichen vor dem Cursor löschen
==== Weitere Hilfe ====
|-
:help spell
|dd        || Zeile löschen
Online unter [http://vimdoc.sourceforge.net/htmldoc/spell.html Vim documentation: spell]
|-
===Eingabemodus automatisch verlassen===
|:d        || Zeile löschen
Vim erlaubt im Eingabemodus Cursorbewegungen. Dies ist ein Tribut an jüngere Benutzer, die „modeless„ Editoren gewöhnt sind und möglichst frei schreiben wollen. Dies kann allerdings signifikant stören, sofern der versierte Vim-Benutzer, der mit Kommandos arbeitet, gleich nach der Cursorbewegung ein Kommando ausführen will. Oft hämmert man dann das Kommando in den Text und muss es nachträglich mühsam wieder entfernen, um es dann noch einmal einzutippen. Vim erlaubt das Mappen von Tasten, auch spezifisch nur für bestimmte Modi. Man kann also die Cursortasten im Eingabemodus ganz nach Belieben so umgestalten, dass sie nicht nur die Cursorbewegung ausführen, sondern auch automatisch den Eingabemodus beenden, so dass Vim gleich zur Eingabe eines neuen Kommandos bereitsteht. Dazu dient folgendes kleine Stück Code, das in die {{ic|~/.vimrc}} gehört:
|-
:function CondRight ()
|D        || vom Cursor bis zum Ende der Zeile löschen
: if col(".") > 1
|-
: call cursor(line("."), col(".") + 1)
|d<nav>    || allgemeines Löschen in Kombination mit einer Bewegung (z.B. d})
: endif
|}
:endfunction
 
imap <up>        <esc><up>:call CondRight()<CR>
==== Ändern ====
  imap <down>      <esc><down>:call CondRight()<CR>
{|border="1"
imap <left>      <esc>
|style="width:10em;background-color:#E5E5E5"|'''Befehl'''
imap <right>      <esc>:call CondRight()<CR><right>
|style="width:40em;background-color:#E5E5E5"|'''Wirkung'''
imap <home>      <esc><home>
|-
imap <end>        <esc><end>
|r          || einzelnes Zeichen unter dem Cursor ändern
imap <pageup>    <esc><pageup>:call CondRight()<CR>
|-
imap <pagedown>  <esc><pagedown>:call CondRight()<CR>
|R          || überschreiben
===Vimtutor===
|-
Vim besitzt ein eingebautes Tutorial, mit dem man die Grundfunktionen des Editors erlernen kann.
|cc        || Zeile ändern
vimtutor
|-
Der Vimtutor wird automatisch bei der Vim-Installation mitinstalliert.
|C          || vom Cursor bis zum Ende der Zeile ändern
==Siehe auch==
|-
* [[vi|Artikel zu vi hier im Wiki]]
|c<nav>    || allgemeines Ändern in Kombination mit einer Bewegung (z.B. c( )
==Weblinks==
|}
* [http://www.vim.org/ Homepage : vim online] {{sprache|en}}
 
* [http://vim.wikia.com/wiki/Vim_Tips_Wiki Vim Tips Wiki] {{sprache|en}}
=== Kopieren und Einfügen ===
* [http://tnerual.eriogerg.free.fr/vimqrc-ge.pdf Vim Kurzanleitung (2 Seiten, PDF)] {{sprache|de}}
{|border="1"
* [http://lug.fh-swf.de/vim/vim-kurzanleitung/vim-kurzanleitung.pdf Vim Kurzanleitung (30 Seiten, PDF)] {{sprache|de}}
|style="width:10em;background-color:#E5E5E5"|'''Befehl'''
* [http://tnerual.eriogerg.free.fr/vimqrc-ge.html VIM Quick Reference Card] {{sprache|de}}
|style="width:40em;background-color:#E5E5E5"|'''Wirkung'''
* [http://www.oualline.com/vim/vim-cook.html Vim Cookbook] {{sprache|en}}
|-
* [http://www.nitidelo.de/vim.php Vim Befehlsreferenz] {{sprache|de}}
|yy        || Zeile kopieren
* [http://koydl.in-berlin.de/ A Byte Of Vim in Deutsch von Christoph Koydl] {{sprache|de}}
|-
|Y          || Zeile kopieren
|-
|y<nav>    || allgemeines Kopieren in Kombination mit einer Bewegung (z.B. y} )
|-
|p          || unterhalb der aktuellen Zeile einfügen
|-
|P          || oberhalb der aktuellen Zeile einfügen
|-
|}
 
=== Dateien ===
{|border="1"
|style="width:10em;background-color:#E5E5E5"|'''Befehl'''
|style="width:40em;background-color:#E5E5E5"|'''Wirkung'''
|-
|:e        || Datei editieren
|-
|:w [datei] || [in datei] speichern
|-
|:wq [datei] || [in datei] speichern und beenden
|-
|:r datei  || Datei unterhalb der aktuellen Zeile einfügen
|}
 
=== Filter u.Ä. ===
{|border="1"
|style="width:10em;background-color:#E5E5E5"|'''Befehl'''
|style="width:40em;background-color:#E5E5E5"|'''Wirkung'''
|-
|:!<befehl|| Shell-Escape
|-
|:r!<befehl> || fügt stdout des Befehls unterhalb der aktuellen Zeile ein
|-
|:%!<befehl> || Datei durch Befehl filtern
|-
|:m,n!<befehl>|| Zeilen n bis m durch Befehl filtern
|}
 
=== Suchen ===
{|border="1"
|style="width:10em;background-color:#E5E5E5"|'''Befehl'''
|style="width:40em;background-color:#E5E5E5"|'''Wirkung'''
|-
|/          || suchen
|-
|?          || rückwärts suchen
|-
|n          || nächstes Suchergebnis
|-
|N          || nächstes Suchergebnis in entgegengesetzter Richtung
|-
|:%s/x/y/g  || alle x durch y ersetzen
|}
 
=== Sonstiges ===
{|border="1"
|style="width:10em;background-color:#E5E5E5"|'''Befehl'''
|style="width:40em;background-color:#E5E5E5"|'''Wirkung'''
|-
|u          || undo
|-
|Strg-R      || Vim, redo
|-
|.           || letzten Befehl wiederholen
|-
|:q          || beenden
|-
|:q!        || Beenden erzwingen
|-
|ZZ          || speichern und beenden
|}
 
 
== Tipps ==
=== Redundanzen vermeiden ===
Wenn man sich dabei ertappt, eine bestimmte Kombination öfters auszuführen, sollte man nach einer besseren Lösung suchen. Dieses Prinzip macht die Arbeit mit Vi sukzessive schneller und effizienter.
 
==== Beispiele ====
;I um am Zeilenanfang einzufügen
:Der naheliegenste Weg um Text am Anfang einer Zeile einzufügen ist, sich zum Anfang der Zeile zu bewegen und dann mittels '''i''' in den Einfügemodus zu wechseln. Wenn man dies eins zu eins in Vi-Befehle umsetzt, würde sich '''^i''' ergeben, da '''^''' zum ersten Zeichen der Zeile führt und '''i''' in den Einfügemodus wechselt. Für diese Aktion steht allerdings bereits ein fertiges Kommando zur Verfügung: '''I'''.
 
;A um am Zeilenende anzuhängen
:Analog zu '''I''' kann '''$i''' zu '''A''' zusammengefasst werden, was den Cursor ans Zeilenende versetzt und in den Einfügemodus schaltet.
 
;Mit . Befehle wiederholen
:Die letzte Aktion, die den Text verändert hat, kann mit '''.''' wiederholt werden! Das kann eine Menge Zeit und Nerven sparen.
 
=== Filter benutzen ===
Durch die Filterfunktion steht im Vi die gesamte UNIX-Toolbox zur Verfügung. Filter lassen sich auch sehr schön mit Vims Visual-Mode nutzen, indem man im Befehlsmodus v drückt, den gewünschten Bereich markiert und dann mit '''!'''''<befehl>'' filtert.
 
==== Beispiele ====
;Zeilen alphabetisch sortieren
: :%!sort
: Hier steht '''%''' für die gesamte Datei, '''!''' ruft ein externes Filterkommando (hier eben sort(1)) auf.
 
;Datei auf 60 Zeichen Breite formatieren
: :%!fmt -60
: Analog zum vorherigen Befehl. fmt(1) ist ein sehr nützliches Tool zur Textformatierung.
 
;ROT13
: }!tr A-Za-z N-ZA-Mn-za-m
: Im Gegensatz zu den beiden ersten Beispielen im Befehlsmodus. Das '''}''' bedeutet, dass der nächste Abschnitt gefiltert werden soll.
 
=== Sonstiges ===
==== Rechtschreibprüfung ====
Siehe: [[Rechtschreibprüfung unter Vim]].
 
==== Arbeiten mit mehreren Dateien ====
;Schneller Wechsel zwischen zwei Dateien mittels Strg+^
:Öfters kommt es vor, dass man während des Editierens schnell mal etwas aus einer anderen Datei einfügen, oder nachsehen möchte. Eine — eher unbekannte, aber sehr praktische — Möglichkeit besteht darin, eine zweite Datei mittels ''':e''' ''<Dateiname>'' zu öffnen und dann bequem durch drücken von '''Strg+^''' zwischen beiden Dateien zu wechseln. Zu beachten ist, dass nach Änderungen an einer der beiden Dateien jeweils gespeichert werden muss. Diese Variante funktioniert, im Gegensatz zu Tabs und ähnlichen Vim-eigenen Erweiterungen, auch unter älteren Vis.
 
[[Kategorie:Konsole]]
[[Kategorie:Konsole]]
[[Kategorie:Editoren]]
[[Kategorie:Editoren]]
[[en:Vim]]

Aktuelle Version vom 24. Oktober 2022, 14:54 Uhr

Hinweis: Dieser Artikel bezieht sich ausdrücklich auf Vim, den leistungsfähigeren Klon von vi

Vim zeigt eine fstab in xterm, hier mit aktiviertem Syntax-Highlighting

Vim ist einer der am weitesten fortgeschrittenen, freien Klone des Standardeditors vi und als solcher ein de-facto-Standard vor allem auf Linux Systemen. Zusätzliche Eigenschaften sind z.B.

  • Syntax-Highlighting,
  • Programmierbarkeit,
  • Erweiterbarkeit durch Plug-Ins,
  • Code Folding (Einklappen von Abschnitten im Text) sowie
  • Darstellung in mehreren Teilfenstern.

Installation

Das Programm ist als vim in extra verfügbar, und kann von dort mittels Pacman installiert werden.

pacman -S vim

Vim ist nur auf der Konsole oder in einem Terminal aufrufbar.

Anleitungen zur Bedienung sind unter Weblinks zu finden.

Die GUI-Variante GVim befindet sich in einem gesonderten Paket.

# pacman -S gvim

Dieses Programm öffnet ein eigenes X11-Fenster, besitzt ein Menü, Datei-Dialoge,Scroll Bar, und weitere GUI-Spezifische Eigenschaften.

Vim steht in Konflikt mit GVim: Es kann entweder Vim oder GVim installiert werden, aber nicht beide Programme gleichzeitig. Siehe News: Vim/GVim 7.2.411 Update. Allerdings bringt das Paket gvim die nichtgrafische Variante mit, die wie gewohnt mittels vim gestartet werden kann.

Es existieren zudem in den Repositorys eine ganze Reihe separat zu installierender Plug-Ins.

Konfiguration

vi und Vim benutzen die Konfigurationsdatei ~/.exrc gemeinsam, wenn beide Programme installiert sind. Die Einstellungen sind nicht kompatibel zueinander. Man sollte Vim ausschließlich über ~/.vimrc konfigurieren und die Option noexrc setzen.

Manuelle Einstellungen können in o.g. Konfigurationsdatei geschrieben werden, dann ohne führende Doppelpunkte. Vim bietet allerdings auch die Möglichkeit, solche Optionen zur Laufzeit zu setzen, zu testen und in die Konfigurationsdatei(en) zu speichern. Die Kommandos dazu lauten:

:set all
:set <option> oder
:set no<option>
:set <option> = <value> :mk oder :mk! (oder :mkexrc oder :mkexrc!)

:mkexrc und :mkexrc! führen u.U. zu oben genanntem Konflikt mit vi. Statt :set <option> zum Setzen von Optionen kann auch :set no<option> zum Entfernen der Optionen verwendet werden.

Die Auflistung aller möglichen Einstellungen über das klassische, von vi bekannte :set all verschafft bereits intuitiv Klarheit über bereits getätigte Einstellungen.

GVim besitzt zudem die Möglichkeit, Einstellungen auch über Menüs bzw. grafische Dialoge vorzunehmen.

Nützliche Optionen

:set nobackup                 # Backups ausschalten
:set ruler                    # Zeile und Spalte anzeigen
:set number                   # sollte "set ruler" nicht klappen, kann man diese Option nehmen
:set nocompatible             # nicht im Kompatibilitätsmodus arbeiten, d.h. Vim-spezifische Erweiterungen nutzen
:set noexrc                   # ~/.exrc nicht benutzen
:set noerrorbells             # nicht piepsen, wenn man an Textbegrenzungen anstößt o.ä.
:set showmode                 # den aktuellen Mode anzeigen
:set nowrap                   # lange Zeilen nicht umbrechen
:set scrolloff=x              # x-Zeilen vor dem Rand wird schon gescrollt
:set tabstop=x                # Einmal tab gedrückt entspricht x - Leerzeichen
:set clipboard=unnamedplus    # Wenn man etwas kopiert, dann wird das in's clipboard kopiert, sodass man es überall wieder pasten kann

Tipps und Tricks

Datei .viminfo

Wer viel mit Vim arbeitet, wird feststellen, dass diese Datei stetig anwächst. Die Datei speichert bis zu einer gewissen Länge die Historie dessen, was der Benutzer mit Vim macht. Sie enthält dabei auch Textbestandteile, allerdings möglicherweise nicht nur von Dateien, die es längst nicht mehr gibt, sondern vielleicht auch sicherheitsrelevante und sensible Daten. Man kann diese Datei getrost löschen, auch automatisch, z.B. beim Login. Damit einhergehend verliert man dann aber die Möglichkeit, bereits schon mal eingegebene Befehle mit :<?> zu durchsuchen.

Syntax-Highlighting

Möglicherweise kommt es nach einem Update dazu, dass das bislang einwandfrei funktionierende Syntax-Highlighting plötzlich ausgeschaltet ist. Ursache ist das beim Update von Vim dessen globale Konfigurationsdatei ausgetauscht wird. Man kann es explizit wieder einschalten, indem man in ~/.vimrc die Zeile

syntax enable

einfügt. Nach einem Neustart von Vim funktioniert das Syntax-Highlighting wieder wie erwartet. Man sollte mittels :set all den Wert der Option :syntax prüfen. Dieser sollte auf "vim" stehen. Wenn nicht, sollte man dies ebenfalls in die ~/.vimrc schreiben:

syntax=vim

integrierte Rechtschreibprüfung

Es werden dafür zusätzlich die Wörterbücher benötigt. Diese können mittels Pacman nachinstalliert werden z.B. vim-spell-de. Prüfe, ob die Option aktiviert ist

:spellinfo

Aktiviere die deutsche Rechtschreibprüfung

:setlocal spell spelllang=de_de

Nun werden die falschen bzw. unbekannten Wörter markiert.

Befehle im Kommandomodus

Befehl Wirkung
]s Gehe zum nächsten falschen Wort
[s Gehe zum vorherigen falschen Wort
zg Fügt das Wort unter dem Cursor dem Wörterbuch hinzu, das in der Variable spellfile steht.
zG Speichert Wort unter Cursor in interner Wortliste, diese geht nach dem Schließen von Vim verloren
zw Fügt das Wort als falsch der Wörterbuchdatei aus der spellfile-Variable hinzu
zW Speichert Wort als falsch in interner Wortliste
z= Bietet eine Auswahl von Korrekturvorschlägen an
zug zuw zuG zuW Löscht das Wort unter dem Cursor aus der entsprechenden Liste

Automatisch aktivieren

Will man de Rechtschreibprüfung für bestimmte Dateitypen (unterschieden durch den Dateinamenssuffix) aktivieren, so kann man dies über die ~/.vimrc konfigurieren.

# Wann geladen wird              # Maske   # Aktivieren      # Zu verwendende Sprache
au BufNewFile,BufRead,BufEnter   *.wiki    setlocal spell    spelllang=de_de
au BufNewFile,BufRead,BufEnter   *.md      setlocal spell    spelllang=de_de
au BufNewFile,BufRead,BufEnter   *.txt     setlocal spell    spelllang=de_de
au BufNewFile,BufRead,BufEnter   README    setlocal spell    spelllang=en_us

Dieses Beispiel aktiviert die Rechtschreibprüfung auf Deutsch für alle Dateien mit .wiki als Suffix, für alle Markdown-Dateien (.md) und für alle Textdateien, die durch .txt gekennzeichnet werden. Zusätzlich wird für alle Dateien mit dem Namen README die englische Rechtschreibprüfung aktiviert.

Weitere Hilfe

:help spell

Online unter Vim documentation: spell

Eingabemodus automatisch verlassen

Vim erlaubt im Eingabemodus Cursorbewegungen. Dies ist ein Tribut an jüngere Benutzer, die „modeless„ Editoren gewöhnt sind und möglichst frei schreiben wollen. Dies kann allerdings signifikant stören, sofern der versierte Vim-Benutzer, der mit Kommandos arbeitet, gleich nach der Cursorbewegung ein Kommando ausführen will. Oft hämmert man dann das Kommando in den Text und muss es nachträglich mühsam wieder entfernen, um es dann noch einmal einzutippen. Vim erlaubt das Mappen von Tasten, auch spezifisch nur für bestimmte Modi. Man kann also die Cursortasten im Eingabemodus ganz nach Belieben so umgestalten, dass sie nicht nur die Cursorbewegung ausführen, sondern auch automatisch den Eingabemodus beenden, so dass Vim gleich zur Eingabe eines neuen Kommandos bereitsteht. Dazu dient folgendes kleine Stück Code, das in die ~/.vimrc gehört:

:function CondRight ()
: if col(".") > 1
:  call cursor(line("."), col(".") + 1)
: endif
:endfunction
imap <up>         <esc><up>:call CondRight()<CR>
imap <down>       <esc><down>:call CondRight()<CR>
imap <left>       <esc>
imap <right>      <esc>:call CondRight()<CR><right>
imap <home>       <esc><home>
imap <end>        <esc><end>
imap <pageup>     <esc><pageup>:call CondRight()<CR>
imap <pagedown>   <esc><pagedown>:call CondRight()<CR>

Vimtutor

Vim besitzt ein eingebautes Tutorial, mit dem man die Grundfunktionen des Editors erlernen kann.

vimtutor

Der Vimtutor wird automatisch bei der Vim-Installation mitinstalliert.

Siehe auch

Weblinks