man page: man vi
vi is a shell based editor which is available on nearly every linux installation. It's very useful to have a basic understanding how it works because sometimes it is the only option to change something. This post describes the basics plus some additional hints which I find useful.
Siehe auch: Nützliche Linux Befehle
Page Contents
Zusammenfassung
Befehl | Erklärung |
vi filename.txt | filename.txt im Editor öffnen, kann auch verwendet werden, um eine neue Datei mit diesem Namen zu erstellen |
:q | Beenden ohne zu speichern |
:q! | ohne Speichern beenden und Änderungen nicht speichern (falls vorhanden) |
:wq | mit Speichern beenden |
:wq! | mit Speichern beenden (obwohl es vielleicht eine schreibgeschützte Datei ist) |
i | gehe in den Bearbeitungsmodus |
Esc | Mode verlassen |
dd | Zeile löschen, in der sich der Cursor befindet |
G | zur letzten Zeile in der Datei springen |
gg | zur ersten Zeile in der Datei springen |
Editiersitzung starten und beenden
Der folgende Befehl öffnet eine Datei mit vi
vi filename.txt
In diesem Beispiel verwenden wir eine docker-compose.yaml
version: '3'
services:
web:
build: btapp
network_mode: host
container_name: btapp
environment:
JAVA_OPTS: "-XX:+UseContainerSupport -XX:+UseG1GC -XX:+PrintGC -Xms1024m -Xmx1024m"
ports:
- "443:443"
- "80:80"
volumes:
- ./btapp/log:/log
- ./btapp/crt:/crt
Um die Sitzung zu beenden, drückt man Escape und gibt :q (Beenden) ein. Das Escape wird benötigt, im den Edit Modus zu verlassen. Ich habe mich daran gewöhnt, immer zuerst Esc zu drücken, damit ich nicht darüber nachdenken muss, in welchem Modus ich mich befinde.
version: '3'
services:
web:
build: btapp
network_mode: host
container_name: btapp
environment:
JAVA_OPTS: "-XX:+UseContainerSupport -XX:+UseG1GC -XX:+PrintGC -Xms1024m -Xmx1024m"
ports:
- "443:443"
- "80:80"
volumes:
- ./btapp/log:/log
- ./btapp/crt:/crt
~
~
~
:q
Wenn etwas geändert wurde, warnt vi mit der Meldung
E37: No write since last change (add ! to override)
Um ohne Speichern zu beenden, muss man in diesem Fall :q! eingeben.
Um die Änderungen zu speichern, gibt man :wq (write quit) ein. Manchmal ändert man eine Datei, die als schreibgeschützt markiert ist. In diesem Fall kann man die Änderungen immer noch mit :wq! speichern.
Datei Inhalt ändern
Um die Datei zu ändern, bewegt man den Cursor auf eine Zeile und drückt i. Jetzt kann man die Datei wie gewohnt ändern und den Cursor mit den Pfeilen bewegen.
Man kann Inhalte auch über das Terminal an der Cursorposition einfügen.
Um den Bearbeitungsmodus zu verlassen, drückt man einfach die Escape-Taste und man kann die Datei mit oder ohne Speichern verlassen (siehe oben).
Um eine ganze Zeile zu löschen, kann man dd drücken, wenn sich der Cursor im Nicht-Bearbeitungsmodus in der richtigen Zeile befindet.
Suchen und Ersetzen
vi bietet eine mächtige Suchfunktionen über Befehle. Um in den Suchmodus zu wechseln, gibt man Esc ein und gibt /{searchString} ein, um zum nächsten Vorkommen dieser Zeichenfolge zu springen.
version: '3'
services:
web:
build: btapp
network_mode: host
container_name: btapp
environment:
JAVA_OPTS: "-XX:+UseContainerSupport -XX:+UseG1GC -XX:+PrintGC -Xms1024m -Xmx1024m"
ports:
- "443:443" # <- cursor jumps here
- "80:80"
volumes:
- ./btapp/log:/log
- ./btapp/crt:/crt
~
~
~
/443
Man kann die gesamte Datei auch direkt nach allen Vorkommen des Suchbegriffs mit einem vorangestellten :g durchsuchen.
version: '3'
services:
web:
build: btapp
network_mode: host
container_name: btapp
environment:
JAVA_OPTS: "-XX:+UseContainerSupport -XX:+UseG1GC -XX:+PrintGC -Xms1024m -Xmx1024m"
ports:
- "443:443"
- "80:80"
volumes:
- ./btapp/log:/log
- ./btapp/crt:/crt
~
~
~
:g/btapp
build: btapp
container_name: btapp
- ./btapp/log:/log
- ./btapp/crt:/crt
Press ENTER or type command to continue
Der Suchbefehl kann auch mit Regex-Suchmustern umgehen. Im nächsten Beispiel suchen wir nach allen Zeilen, in denen die Zeichennummer 11 ein Leerzeichen ist.
version: '3'
services:
web:
build: btapp
network_mode: host
container_name: btapp
environment:
JAVA_OPTS: "-XX:+UseContainerSupport -XX:+UseG1GC -XX:+PrintGC -Xms1024m -Xmx1024m"
ports:
- "443:443"
- "80:80"
volumes:
- ./btapp/log:/log
- ./btapp/crt:/crt
~
~
~
:g/^.\{10}\s
build: btapp
Press ENTER or type command to continue
Man kann zum Beispiel auch alle Zeilen löschen, auf die die Regex passt, indem man direkt /d am Ende hinzufügt.
version: '3'
services:
web:
build: btapp
network_mode: host
container_name: btapp
environment:
JAVA_OPTS: "-XX:+UseContainerSupport -XX:+UseG1GC -XX:+PrintGC -Xms1024m -Xmx1024m"
ports:
- "443:443"
- "80:80"
volumes:
- ./btapp/log:/log
- ./btapp/crt:/crt
~
~
~
:g/^.\{10}\s/d
was das Resultat gibt:
version: '3'
services:
web:
network_mode: host
container_name: btapp
environment:
JAVA_OPTS: "-XX:+UseContainerSupport -XX:+UseG1GC -XX:+PrintGC -Xms1024m -Xmx1024m"
ports:
- "443:443"
- "80:80"
volumes:
- ./btapp/log:/log
- ./btapp/crt:/crt
~
~
~
~
Problem: vi fügt bei Cursorbewegung Zeichen hinzu
Auf manchen Systemen könnte das Problem auftreten, dass die Cursorbewegung mit den Pfeiltasten im Bearbeitungsmodus dazu führt, dass vi die Zeichen A, B, C oder D hinzufügt. Um dies zu beheben, fügt man eine Datei im Home-Verzeichnis des aktuellen Benutzers wie folgt hinzu:
user1@pi:~ $ cat .vimrc
set nocompatible
Schreibe einen Kommentar