BlogBlog ÜbersichtjailscriptportsoptFreeBSDLinksThermoskanne

Treppeneffekt beim Einfügen von Text im vi verhindern

Fügt man Text mittels Copy/Past in den vi ein, kann es zu einem sogenannten Treppeneffekt kommen, dass heisst der Text wird in jeder Zeile weiter eingerückt. Um dies zu verhindern, muss vor dem Einfügen das automatische Einrücken deaktiviert werden.

Das automtische Einrücken rückt die nächste Zeile so wie die vorhergehende automatisch ein. Dies ist normalerweise auch sehr nützlich, nur beim Einfügen von Text ist es störend.

Zuerst muss man sich im Kommandomodus befinden (dies erreicht man, indem man die Esc-Taste drückt) und danach mit dem Doppelpunkt in den ex Modus wechselt. Anschliessend lässt sich mit set noai das automatische Einrücken deaktivieren. Danach kann man den Text eingefügen. Das automatische Einrücken wird nach dem Einfügen mit set ai im ex Modus wieder aktiviert.

Related Entries:
Rechtschreibprüfung im vi
vi Fenster teilen
Abkürzungen im vi benutzen
vi Makros benutzen
vi Kurzreferenz
Comments (3)  Permalink

Rechtschreibprüfung im vi

Im vi(1) lässt sich die Rechtschreibprüfung aspell(1) mit Hilfe eines vi Makros integrieren.

Zuerst muss aspell installiert werden. Auf FreeBSD kann man dies wie folgt tun:

cd /usr/ports/german/aspell && make install clean

Danach kann man folgende Zeile in die .exrc oder /etc/vi.exrc eintragen:

map #1 :w!^M:!aspell -c %^M:e! %^M

Die ^M werden mit Ctrl + v und der Entertaste erzeugt. Diese Zeile legt das Makro auf die F1-Taste. Folgendes wird dabei ausgeführt:

:w!^M Speichert die aktuelle Datei.

!aspell -c %^M Führt aspell im Rechtschreibprüfungsmodus auf der aktuell geöffneten Datei aus. Diese wird danach von aspell mit den Korrekturen gespeichert.

:e! % ^M Lädt die von aspell korrigierte Datei wieder in den vi.

Related Entries:
Treppeneffekt beim Einfügen von Text im vi verhindern
vi Fenster teilen
Abkürzungen im vi benutzen
vi Makros benutzen
vi Kurzreferenz
 Permalink

vi Fenster teilen

Im vi(1) lässt sich das Fenster teilen, so kann man gleichzeitig mehrere Dokumente bearbeiten. Um das Fenster zu teilen, muss man sich zuerst im Kommandomodus befinden (dies erreicht man, indem man die Esc-Taste drückt) und danach mit dem Doppelpunkt in den ex Modus wechselt und anschliessend E drückt. Nun wird das Fenster geteilt und in der neuen Hälfte das gleiche Dokument geöffnet.

Mit Ctrl + w kann man zwischen den beiden Fensterhälften wechseln. Nun kann man zum Beispiel mit :e <Dateiname> im aktiven Fenster eine neue Datei, mit dem angegebenen Dateinamen, anlegen.

Related Entries:
Treppeneffekt beim Einfügen von Text im vi verhindern
Rechtschreibprüfung im vi
Abkürzungen im vi benutzen
vi Makros benutzen
vi Kurzreferenz
 Permalink

Abkürzungen im vi benutzen

Im vi(1) lassen sich Abkürzungen (abbreviations) definieren. So kann man für oft gebrauchte Wörter, Satzteile oder Sätze Abkürzungen definieren, welche dann automatisch vom vi umgewandelt werden. Abkürzungen werden mittels des ex-Befehls ab festgelegt. Dazu muss man sich zuerst im Kommandomodus befinden (dies erreicht man, indem man die Esc-Taste drückt) und danach mit dem Doppelpunkt in den ex Modus wechseln und die Abkürzung eingeben:

ab <Abkürzung> <Satz oder Wort, das die Abkürzung ersetzt>

Um eine Abkürzung zu nutzen, wird im Textmodus die Abkürzung geschrieben, wenn man dann nach der Abkürzung die Leer-oder Entertaste drückt, wird die Abkürzung durch das vorher definierte Wort oder den Satz ersetzt.

Im folgenden Beispiel wird eine Abkürzung definiert die mfg durch Mit freundlichen Grüssen ersetzt:

ab mfg Mit freundlichen Grüssen

Danach muss im vi nur noch mfg geschrieben werden, wenn man danach noch die Leertaste oder Enter drückt, wird dies ersetzt.

Oft gebrauchte Abkürzungen lassen sich auch in der .exrc oder in der /etc/vi.exrc dauerhaft speichern.

Related Entries:
Treppeneffekt beim Einfügen von Text im vi verhindern
Rechtschreibprüfung im vi
vi Fenster teilen
vi Makros benutzen
vi Kurzreferenz
 Permalink

vi Makros benutzen

Im vi(1) lassen sich oft gebrauchte vi-Kommandofolgen zu einem Makro zusammenfassen. Makros werden mittels des ex-Befehles map oder map! definiert. Werden Makros mit map erstellt, so kann das Makro aus dem Kommandomodus aufgerufen werden, map! Makros werden aus dem Textmodus aufgerufen. Um die ex-Befehle map/map! ausführen zu können, muss man sich zuerst im Kommandomodus befinden, dies erreicht man indem man im vi die Esc-Taste drückt. Danach kann mittels des Doppelpunktes in den ex-Modus umgeschaltet werden und das Makro definiert werden:

map[!] <Taste> <Kommandofolge>

Um ein Makro zu definieren, welches im Kommandomodus durch die q-Taste aufgerufen wird und an der aktuellen Cursorposition \subsection{ einfügt, danach ans Ende der Zeile springt und dort ein } einfügt, kann folgender Befehl gebraucht werden:

map q i\subsection{^[$a}

Die Kommandofolge wird dabei so eingegeben, wie wenn man das Kommando direkt im vi benutzt:

i Wechselt in den Textmodus
\subsection{ Fügt an der aktuellen Cursorposition \subsection{ ein
^[ Esc-Taste, um in den Kommandomodus zu wechseln. Muss als Ctrl + v Esc eingegeben werden
$ Springt ans Zeilenende
a Wechselt in den Textmodus, das nächste Zeichen wird nach der aktuellen Cursorposition eingefügt
} Fügt eine schliessende, geschweifte Klammer ein

Wie in diesem Beispiel gesehen wurde, müssen Steuerzeichen wie Esc, Return, Backspace mit Ctrl + v in den Makros maskiert werden.

Makros können auch auf die Funktionstasten F1 - F12 gelegt werden. Diese Tasten werden durch eine Raute # und die jeweilige Nummer symbolisiert. Folgendes Makro wird aus dem Kommandomodus mit F1 aufgerufen, fügt eine neue Zeile ein, fügt auf dieser \begin{lstlisting} ein und setzt den Cursor im Textmodus auf eine neue Zeile:

map #1 o\begin{lstlisting}^M
o Fügt eine neue Zeile nach der aktuellen Cursorposition ein und wechselt danach in den Textmodus
\begin{lstlisting} Dieser Text wird auf der neuen Zeile eingefügt
^M Return-Taste. Ein Zeilenumbruch wird vorgenommen. Wird als Ctrl + v Return eingegeben

Dieses Makro kann nur aus dem Kommandomodus aufgerufen werden. Es kann jedoch für die gleiche Taste noch ein anderes Makro definiert werden, das aber aus dem Textmodus aufgerufen wird. So kann zum Beispiel jetzt noch ein Makro auf die F1 Taste gelegt werden, dass im Textmodus aufgerufen wird, welches in den Kommandomodus wechselt und dort F1 aufruft:

map! #1 ^[^[OP
^[ Esc-Taste um in den Kommandomodus zu wechseln. Wird als Ctrl + v Esc eingegeben
^[OP F1-Taste um das Kommandomodus-Makro auf F1 auszuführen. Wird als Ctrl + v F1 eingegeben

So lassen sich natürlich interessante Sachen wie folgende zwei Makros machen:

map #1 i^[OP
map! #1 ^[^[OP

Das erste Makro wechselt durch das Drücken der F1-Taste in den Textmodus und wählt die F1-Taste, welche wiederum durch das zweite Makro in den Kommandomodus wechselt und dort die F1-Taste auswählt... Drückt man nun die F1 Taste, lässt sich dieses Spielchen dann nur noch durch ein kill -9 <vi-PID> beenden.

Eine Kurzreferenz von vi Kommandos findet man hier: http://www.chruetertee.ch/blog/archive/2005/11/26/vi-kurzreferenz.html

Anstatt Makros jedes mal wieder neu einzugeben, lassen sich diese auch in der .exrc dauerhaft speichern. Einfach die Makrozeile in die .exrc des Benutzers einfügen oder in der /etc/vi.exrc definieren, dann stehen die Makros allen Benutzern zur Verfügung.

Related Entries:
Treppeneffekt beim Einfügen von Text im vi verhindern
Rechtschreibprüfung im vi
vi Fenster teilen
Abkürzungen im vi benutzen
vi Kurzreferenz
 Permalink

vi Kurzreferenz

Ich werde öfters gefragt, wieso ich den vi als Editor brauche. Ganz einfach, der kann viel und man editiert so schnell, wie mit keinem anderen Editor. Deshalb möchte ich den Befehl der Woche dem vi widmen.

Bewegen


h, j, k, l links, runter, hinauf, rechts
Pfeiltasten Hoffentlich selbsterklärend
w, b
Springt jeweils ein Wort vorwärts/rückwärts
E
Springt ans Ende des aktuellen Wortes
0, $
Springt zum Anfang/Ende der Zeile
H, M, L
Springt an den Anfang, in die Mitte oder ans Ende des Fensters
G
Springt ans Ende der Datei
1G
Springt an den Anfang der Datei
Suchen
/<Wort>[Enter] Sucht vorwärts nach <Wort> und setzt den Cursor auf den ersten Buchstaben
?<Wort>[Enter]
Sucht rückwärts nach <Wort> und setzt den Cursor auf den ersten Buchstaben
n, N
Sucht nach <Wort> vorwärts, rückwärts fortsetzen
Schreiben

i, a
Fügt den nachfolgenden Text vor/nach dem Buchstaben unter dem Cursor ein
I, A
Fügt den nachfolgenden Text am Anfang/Ende der Zeile ein
o, O
Fügt eine neue Zeile nach/vor der aktuellen Zeile ein
r
Ersetzt das aktuelle Zeichen unter dem Cursor
Löschen

x
Löscht das aktuelle Zeichen unter dem Cursor
dh
Löscht das Zeichen links des Cursors
dw
Löscht das aktuelle Wort
db
Löscht das Wort links des aktuellen Wortes auf dem sich der Cursor befindet
dd
Löscht aktuelle Zeile
d0, d$
Löscht die Zeile von der aktuellen Corsorposition zum Zeilenanfang/-ende
dG Löscht alle folgenden Zeilen, einschliesslich der aktuellen, bis zum Ende der Datei
J
Löscht den Zeilenumbruch zwischen der aktuellen und der nächsten Zeile
d/<Wort>
Löscht von der aktuellen Cursorposition alles bis zu <Wort>
Navigieren

:<Zielennummer>
Geht zur angegebenen Zeile
Suchen und ersetzen

:s/<suche>/<ersetze>/ Sucht <suche> auf der aktuellen Zeile und ersetzt den ersten Treffer durch <ersetze>
:s/<suche>/<ersetze>/g Sucht <suche> auf der aktuellen Zeile und ersetzt alle durch <ersetze>
:%s/<suche>/<ersetze>/g Sucht <suche> in der ganzen Datei und ersetzt es durch <ersetze>
:%s/<suche>/<ersetze>/gc Sucht <suche>in der ganzen Datei und fragt nach, ob er es durch <ersetze> ersetzen soll
Weiteres

u Macht den letzten ausgeführten Befehl rückgängig
. <- Punkt Führt den letzten ausgeführten Befehl nochmals aus
~ Ändert Grossbuchstaben in Kleinbuchstaben und umgekehrt
Kommandomodus
[Esc] Wechselt in den Kommandomodus
:w / :w <Dateiname> Speichert Datei / Speichert Datei in <Dateiname>
:q / :q! Verlässt den vi / Verlässt vi ohne geänderte Datei zu speichern
:wq oder :x
Speichert Datei und verlässt den vi
:! <Befehl> Führt <Befehl> in der Shell aus
:e <Dateiname> Erstellt neue Datei namens <Dateiname>
Kopieren und Einfügen
yy Kopiert aktuelle Zeile
p, P
Fügt kopierte Zeile nach/vor der aktuellen Zeile ein

Lösch- und Bewegungsbefehle können auch noch mit Zahlen kombiniert werden, so löscht zum Beispiel ein 3dw gleich 3 Wörter auf einmal oder ein 5h bewegt den Cursor gleich 5 Zeichen nach links.

Leider weiss ich auch nicht alle Befehle auswendig, aber dafür hab ich ja meine vi Referenz Kaffeetasse.

Related Entries:
Treppeneffekt beim Einfügen von Text im vi verhindern
Rechtschreibprüfung im vi
vi Fenster teilen
Abkürzungen im vi benutzen
vi Makros benutzen
 Permalink
1-6/6