Ich arbeite seit acht Jahren bei Vim und entdecke ständig etwas Neues. Es wird als eine Tugend von Vim angesehen. Für mich ist dies ein Mangel an Offenheit: Eine Reihe versteckter Funktionen sind zu tief verborgen.
Sie sprechen über die Schönheit der modalen Bearbeitung und von Textobjekten, aber es scheint mir, dass die Essenz von Vim nicht das ist. Vim ist ein Patchwork-Quilt aus Subsystemen, die mit zusätzlichen Tools verstopft sind. Nur im normalen Bearbeitungsmodus mehr als hundert Tastaturkürzel! Diese Dichte an Toolkits erklärt weitgehend, warum Vim so nützlich ist. Wenn "Alle Tags für ein Schlüsselwort anzeigen" nur
g]
, wird dieser Befehl viel häufiger verwendet.
In Systemen mit mangelnder Offenheit muss man sich auf Führung verlassen. Aber für Vim gibt es nicht so viele. Es gibt Artikel für Anfänger wie
ciw
(nicht zu verwechseln mit der CIA,
dem CIA-Handbuch für Vim ) und dergleichen. Und es gibt Artikel von Experten, die in Subsysteme eingetaucht sind. Aber niemand spricht wirklich über diese besonderen Tricks, die Sie ausrufen lassen: Verdammt, wie ich es in den letzten sechs Jahren gebraucht habe!
In diesem Artikel geht es um einige der kleinen Tricks, die ich in Vim verwende. Keiner von ihnen ist in allen Details zerlegt. Wenn Sie also interessiert sind, empfehle ich, zusätzliche Informationen zu sammeln. Sie sind auch nicht miteinander verwandt. Das ist aber normal. Im Allgemeinen gibt es mehr als genug von ihnen, um fast jedem wirklich zu helfen.
Artikelstruktur
Sehr unhöflich, Vim-Benutzer fallen in zwei Kategorien.
Puristen schätzen die geringe Größe und Allgegenwart. In der Regel wird die Konfiguration minimiert, falls Sie an einem unbekannten Computer arbeiten müssen (z. B. über ssh). Extensors hingegen füllen Vim mit Plugins, Funktionen und hausgemachten Zuordnungen, um vorzugeben, Emacs zu verwenden. Wenn du ihnen vimrc wegnimmst, bleiben die Jungs völlig hilflos.
Wie Sie wahrscheinlich vermuten, bin ich den Expandern viel näher als Puristen. Ich habe die Tricks in zwei Abschnitte unterteilt, je nachdem, ob Änderungen im Basis-Vim erforderlich sind.
Puristen
Für modale Befehle werden Standardhilfeansichten verwendet,
<cr>
bedeutet das Drücken der Eingabetaste. Wenn Sie Hilfe benötigen
:h
für eine bestimmte Zeile, z. B.
:h E676
, steht die Zeile in Klammern.
Verschiedene Befehle im normalen Modus
": und @:
":
ist ein Register, das den zuletzt ausgeführten Befehl enthält. Sie können
":p
, um ihn in den Puffer zu drucken.
@:
wiederholt den letzten Befehl.
"=
Registrieren Sie sich für "Ausdrücke". Hier können Sie einen beliebigen vimL-Ausdruck eingeben und einfügen, mit Strg-R usw. verwenden. So wird beispielsweise der lokale Zeitstempel durch Eingabe von
"=strftime("%c")<cr>p
eingefügt.
mA, 'A.
m{letter}
platziert die Markierung an der Cursorposition. Dann geht
'{letter}
in diese Zeile. Bei Kleinbuchstaben wirkt es auf den Puffer, sodass es für die Navigation geeignet ist. Es funktioniert global für Großbuchstaben: Selbst wenn Sie sich in einer anderen Datei befinden, wechselt
'A
zu der Datei mit der Bezeichnung
Sie können alle Ihre Tags mit dem folgenden Befehl
:marks:
Strg-A und Strg-X
Erhöht und verringert die nächste Zahl in der Zeile an der Cursorposition oder rechts davon. Da es sofort zur Nummer geht, kann die Kombination von überall verwendet werden.
10c-A
viel einfacher als
wwwwwciw20
.
q:
Öffnet die Geschichte früherer Teams. Sie können damit wie mit jedem Vim-Text arbeiten, aber die Änderungen werden nicht gespeichert. Sie können den geänderten Befehl jedoch mit
<CR>
ausführen. Auf diese Weise können Sie Befehle sehr schnell ändern und neu starten oder nach alten Befehlen zur Wiederverwendung suchen.
q /, q?
Gleich wie
q:
außer Suche.
Strg-I, Strg-O
Wechselt zum nächsten oder vorherigen Ort in der Jumplist. Nützlich für schnelles Überprüfen und anschließendes Zurückverfolgen. Es ist sehr schön, Hilfedateien zu lesen.
Makros
In
diesem Beitrag erhalten Sie einen tieferen Einblick in die Verwendung von Makros.
Visueller Modus
gv
Wählt das vorherige visuelle Element aus.
v_o
Geht zur anderen Seite des visuellen Blocks. Nützlich, wenn Sie eine Zeile zu niedrig oder so begonnen haben. Im Blockmodus wird auf den entgegengesetzten diagonalen Winkel
v_O
und mit
v_O
auf den entgegengesetzten horizontalen
v_O
.
g Strg-A / Strg-X
Im visuellen Modus erhöht Strg-A einfach die erste Zahl in jeder Zeile. Auf der anderen Seite wird
g ctrl-A
mit jeder Zeile um eine Zeile erhöht. Dies ist in der Tabelle viel einfacher zu erklären:
Operatoren: v, V, cv (: h o_v)
Sie wissen wahrscheinlich, dass Sie im visuellen Modus Zeichen (v), Zeilen (V) und Blöcke (Strg-V) auswählen können. Diese drei Kombinationen können jedoch als Bewegungsoperatoren für das entsprechende Fragment verwendet werden. Sie haben beispielsweise den folgenden Text:
abc
abc
abc
Wenn Sie den Cursor auf das obere
b
und
d2j
, werden alle drei Zeilen gelöscht, da
j
sich Zeile für Zeile bewegt. Wenn stattdessen
d<cV>2j
gedrückt wird, wird die Bewegung blockweise und nur die mittlere Spalte mit drei Buchstaben
b
wird gelöscht.
Ein Anwendungsfall ist das Löschen bei der Suche. Normal
d/
bewegt sich Zeichen für Zeichen. Daher verwende ich
dV/
für zeilenweise Bewegungen mit Löschung. Es gibt noch einen anderen Weg, dies zu tun:
/ regex / {n}
Bewegung n Zeilen unterhalb der Übereinstimmung oder ebenso viele Zeilen nach oben, wenn der Wert negativ ist. Als Nebeneffekt erfolgt die Bewegung Zeile für Zeile. Wenn Sie also die erste Zeile löschen möchten, die
regex
, können Sie
d/regex//0
eingeben.
Ex-Teams
Sie geben Ex-Befehle im Befehlsmodus ein, zum Beispiel den Befehl
:s
. Neben dem Ersetzen gibt es viele andere nützliche Befehle. Alle diese Beispiele erfordern einen Bereich, z. B.
%
.
: g / regex / ex
Führt den Befehl nur in Zeilen aus, die dem regulären Ausdruck entsprechen. Sie können beispielsweise
g/regex/d
eingeben, um alle Zeilen zu löschen, die mit dem regulären Ausdruck übereinstimmen. Der Befehl
v
ähnelt
g
, funktioniert jedoch in allen Zeilen,
die nicht mit dem regulären Ausdruck übereinstimmen.
Tricks werden mit der Norm und einigen anderen mächtiger.
: norm {Vim}
Verhält sich so, als ob Sie {Vim} in jeder Zeile des Bereichs ausgeführt hätten. Zum Beispiel löscht
g/regex/norm f dw
das erste Wort nach dem ersten Leerzeichen in jeder Zeile, die dem regulären Regex-Ausdruck entspricht. Dies ist oft viel einfacher als ein Makro.
norm
gehorcht all Ihren Vergleichen. Wenn Sie beispielsweise im Einfügemodus
<esc>
norm I jk$diw
haben, fügt
norm I jk$diw
am Anfang der Zeile ein Leerzeichen hinzu,
verlässt den Einfügemodus und löscht dann das letzte Wort in der Zeile. Diese Funktion gefällt mir sehr gut, aber wenn Sie Ihre Zuordnungen lieber nicht verwenden möchten, können Sie die
norm!
anwenden
norm!
.
: co.
Kopiert einen Bereich in die aktuelle Zeile. Sie können auch beliebige Werte anstelle eines Punkts angeben, z. B.
+3
oder
'a. mv
'a. mv
zu bewegen.
: y {reg}
Kopiert den Bereich in das
{reg}
-Register. Wenn
{reg}
groß geschrieben wird, wird es dem vorhandenen Fall hinzugefügt. ein solches Team
let @a = '' | %g/regex/y A
kopiert in alle Zeilen, die dem
regex
in der gesamten Datei entsprechen. Dies hilft, den fehlerhaften Text aus der Datei zu extrahieren und in die Zwischenablage des Systems zu kopieren (mit
let @+ = @a
).
: windo {ex}
Führt einen Befehl in allen Fenstern aus. Zum Beispiel
:windo $
alle Fenster nach unten. Es gibt
bufdo
,
cdo
,
tabdo
und andere.
Funktioniert sehr gut mit
g
und
s
. Um alle
AA
Kombinationen durch
BB
mit einer Vorschau der Ersetzungen zu ersetzen, können Sie
vimgrep AA
indem Sie alle Übereinstimmungen in Quickfix laden und dann
cdo s/AA/BB/cge
, um alle Übereinstimmungen zu suchen / zu ersetzen.
Vim für Extender
Hier sind Tricks aufgeführt, die das Speichern in Einstellungen oder das Ändern einer Vim-Sitzung erfordern. Hypothetisch können sie im "puritanischen" Modus verwendet werden, indem einfach Befehle eingegeben werden. Einige beinhalten jedoch ziemlich schwerwiegende Änderungen, die dem Geist des Purismus widersprechen.
Hier ist nur das ungewöhnlichste. Viele Leute weisen der Kappe
H
zu, so dass solche Dinge nicht erwähnenswert sind. Es macht auch keinen Sinn, über
vim-sensible
oder
vim-surround
zu sprechen, sondern nur über exotischere Plugins.
Wenn Sie Ihr vimrc ständig konfigurieren, fügen Sie bitte selbst einen separaten Befehl hinzu:
command! Vimrc :vs $MYVIMRC
Einstellungen
Ich habe alle Einstellungen, Tastenkombinationen und Funktionen in einer einzigen vimrc-Datei gespeichert. Das Aufteilen in mehrere Dateien erschwert die Suche.
Die meisten Einstellungen sind eigentlich keine „Tricks“. Am besten schauen Sie sich
vim- sense an: Fast alle Einstellungen von dort passen zu Ihrem vimrc.
Lazyredraw einstellen
Zeichnen Sie den Bildschirm nicht in der Mitte eines Makros neu (um die Leistung zu verbessern).
setze smartcase / ignorecase
Mit diesen beiden Einstellungen wird bei einer Suche ohne Großbuchstaben die Groß- und Kleinschreibung nicht berücksichtigt, und bei einer Suche mit Großbuchstaben wird zwischen Groß- und Kleinschreibung unterschieden.
undofile setzen
Speichern von Aktionen, auch wenn Sie Vim schließen und öffnen, sodass Aktionen zum Rückgängigmachen immer verfügbar sind. Sehr praktisch in Kombination mit dem Undotree Plugin.
setze foldcolumn = {n}
Seitensäule mit zusammengeklappten Blöcken. Je größer
n
, desto mehr reduzierte Blöcke werden in der Spalte angezeigt, und im Übrigen wird die Nummer angegeben.
setze Suffixeadd = {str}
gf
bedeutet normalerweise "Gehe zur Datei unter dem Cursor", erfordert jedoch eine Dateierweiterung in der Zeile.
suffixesadd
fügt die angegebene Erweiterung hinzu. Wenn das
suffixesadd=.md
, sucht der Befehl
gf
in der Zeile 'foo' nach den Dateien
foo
und
foo.md
setze inccommand = nosplit
Nur für Neovim. Die
incommand
zeigt in Echtzeit, welche Änderungen das Team vornehmen wird. Derzeit wird nur
s
unterstützt, aber auch dies ist unglaublich nützlich. Wenn Sie
:s/regex
eingeben
:s/regex
, werden alle Übereinstimmungen hervorgehoben. Wenn Sie dann hinzufügen
/change
, werden alle Ersetzungen angezeigt. Funktioniert mit allen Regex-Eigenschaften, einschließlich Backlinks und Gruppen.
Statuszeile einstellen (: h Statuszeile)
Legt fest, was im Bedienfeld am unteren Rand jedes Fensters angezeigt werden soll. Hier ist die Formatierung viel komplizierter und kniffliger als in anderen Einstellungen, daher müssen Sie Zeit damit verbringen, sie zu erklären. Es gibt einige einfache Tricks. Sehen Sie sich zunächst die Standard-Vim-Statusleiste an:
:set statusline=%<%f\ %h%m%r%=%-14.(%l,%c%V%)\ %P
Hier ist es am einfachsten,
%P
(Prozentsatz der Datei über dem Cursor) zu ersetzen. Das Statusleistenformat ist der Wert nach dem Prozentzeichen in geschweiften Klammern. Daher können Sie für Markdown-Dateien Folgendes schreiben:
:set statusline=%<%f\ %h%m%r%=%-14.(%l,%c%V%)\ %{wordcount()[\"words\"]}
Ersetzen Sie den Prozentsatz der Datei durch die Anzahl der Wörter im Dokument.
Oder installieren Sie die
tabline
. Wenn Sie keine Registerkarten verwenden, kann diese Zeile zu einer „globalen Statuszeile“ gemacht werden. Zum Beispiel
set tabline=%{strftime('%c')}
zeigt immer das Datum oben an.
Tastenkombinationen
Ich habe
viele Bindungen.
Viele praktische Schlüssel in Vim sind standardmäßig dumm zugewiesen. Zum Beispiel ist das Speichern der Tastenanschläge
s
gleichbedeutend mit
cl
(Speichern eines Tastenanschlags), und
U
ist dasselbe wie
u
, außer dass das Rückgängigmachen als neue Änderung geschrieben wird, was funktional nutzlos ist.
Q
identisch mit
gQ
und ist auf jeden Fall eine enorme Falle.
Z
nur für
ZZ
und
ZQ
. Meine Güte, sogar im Vim-Handbuch wird empfohlen,
_
und Tasten einigen Funktionen neu
_
, da "Sie sie wahrscheinlich nie verwenden". Ich würde es vorziehen, nicht einen Klick zu speichern, sondern der Tastatur völlig neue Funktionen hinzuzufügen. Hier sind einige meiner Bindungen:
nnoremap Q @@
Wiederholt das letzte Makro, ohne den Übergang in den Ex-Modus zu verlangsamen.
nnoremap s "_d
ss
funktioniert die Taste
s
(mit den entsprechenden Einstellungen für
ss
und
S
) wie d, nur ohne den gelöschten Text im Register zu speichern. Nützlich, um das Register nicht zu verstopfen.
nnoremap <cj> <cw> j
Gehe zum Fenster unten. Geeignete Zuordnungen für
h
,
k
,
l
. Das Arbeiten mit Fenstern ist viel einfacher.
nnoremap <Leiter> e: exe getline (Zeile ('.')) <cr>
Führen Sie die aktuelle Zeile so aus, als wäre es ein Befehl. In Experimenten ist es oft bequemer als
q:
Spezielle Argumente (: h Map-Argumente)
Der
map <buffer> lhs rhs
aktiviert die Schlüsselzuordnung nur für diesen Puffer. Es funktioniert wirklich bequem mit Auto-Befehlen als temporäre Tastenkombination oder beim Definieren von Zuweisungen über eine Funktion. Pufferzuweisungen haben Vorrang vor globalen Zuweisungen, dh Sie können den allgemeinen Befehl überschreiben, der in einer bestimmten Situation nützlicher ist.
Der
map <expr> {lhs} {expr}
überprüft
{expr}
und verwendet den Rückgabewert als endgültige Neuzuordnung der Schlüssel. Ein einfacher Anwendungsfall ist die Bindung basierend auf Bedingungen. Ich habe diese:
nnoremap <expr> k (v:count == 0 ? 'gk' : 'k')
nnoremap <expr> j (v:count == 0 ? 'gj' : 'j')
Dadurch bewegen sich
j
und
k
entlang der Linie,
bis eine Zahl gefunden wird, und danach wird die Taste gelöscht. Daher kann ich durch lange Absätze der Prosa navigieren, ohne Kombinationen wie
10j
.
Das Argument
<silent>
hilft, wenn Bindungen ex-Befehle ausführen.
Inoremaps
Dank
inoremap
Bindungen im Einfügemodus. Dort fangen sie an zu arbeiten, also
inoremap ;a aaaa
führt 'aaaa' anstelle von '; a' ein. Wenn Sie im normalen Modus etwas tun möchten, verwenden Sie
<cO>
. Zum Beispiel, wenn wir haben
inoremap ;1 <co>ma
dann setzt
;1
'a
.
Ich möchte angeben, dass Semikolons als Schlüssel für Neuzuweisungen verwendet werden sollen, da in normalen Texten fast immer ein Leerzeichen oder eine neue Zeile nach dem Semikolon steht.
autocmd
Auto-Befehle eignen sich hervorragend für die Konfiguration. Normalerweise konfigurieren Sie sie wie folgt:
augroup {name} autocmd! " Prevents duplicate autocommands au {events} {file regex} {command} augroup END
Wenn dann eines der Ereignisse {events} in der Datei {file regex} auftritt, wird der Befehl {command} ausgelöst. Ereignisse werden aufgelistet
:h event
. Zum Beispiel, wenn Sie schreiben
augroup every autocmd! au InsertEnter * set norelativenumber au InsertLeave * set relativenumber augroup END
dann deaktiviert vim die relative Nummer nur für den Einfügemodus.
Der Befehl
au {event} <buffer> {ex}
wendet den Befehl auto nur auf den aktuellen Puffer an. Manchmal verwende ich dies, um einer bestimmten Datei kurzfristige Ereignishandler hinzuzufügen.
BufNewFile, BufRead
BufnewFile
startet, wenn eine neue Datei erstellt wird,
BufRead
- wenn der Puffer zum ersten Mal geöffnet wird. Sie werden normalerweise verwendet, um Parameter hinzuzufügen und bestimmten Dateitypen neu zuzuordnen. Ich habe eine solche:
augroup md autocmd! au BufNewFile,BufRead *.md syntax keyword todo TODO au BufNewFile,BufRead *.md inoremap <buffer> ;` ```<cr><cr>```<Up><Up> augroup END
Nur in Markdown-Dateien wird die TODO-Zeile hervorgehoben, und die Zeichen
;`
im Einfügemodus fügen eine Codenotation hinzu.
Mit Auto-Teams können Sie viel komplexere Dinge tun. Beispielsweise überschreibt
au
for
BufWriteCmd
die Standardspeicherung, sodass Sie benutzerdefinierte Logik implementieren können. Dies geht über „Tricks“ hinaus und geht in das Reich der „dunklen Magie“.
Plugins
Die meisten Leute kennen beliebte Plugins wie
vim-surround
und
NERDtree
. Hier ist eine Liste einiger wenig bekannter, die ich sehr nützlich finde.
In den meisten Texteditoren werden Rückgängig-Aktionen linear ausgeführt. Wenn Sie eine Änderung an A vornehmen, diese rückgängig machen und dann eine Änderung an B vornehmen, ist A für immer verloren. Vim speichert jedoch den gesamten Baum rückgängig gemachter Aktionen. Der Befehl
u
die Aktion im aktuellen Ast zurück und
g
zur vorherigen
chronologischen Version. Sie können die Liste der abgebrochenen Aktionen mit dem folgenden Befehl
:undolist
.
Dieses Format ist jedoch nicht sehr klar. Es ist viel besser, den tatsächlichen Baum zu sehen. Genau das macht
Undotree
: Es bietet eine gute ASCII-Darstellung des Baums abgebrochener Aktionen mit bequemer Navigation.
Das Plugin bietet Befehle zum Austauschen von Argumenten, sodass Sie
(a, f(b, c))
(f(b, c), a)
in wenigen Tastenanschlägen durch
(f(b, c), a)
ersetzen können. Ich muss regelmäßig solche Änderungen vornehmen, daher ist dies eine wesentliche Verbesserung der Lebensqualität.
Verbindet eine übergeordnete API mit dem eingebetteten neo / vim-Terminal. Beispiel
:T {text}
sendet {text} an die Konsole. Gut zum Erstellen einer interaktiven Umgebung.
"TODO {{{
Viele Themen werden in diesem Artikel nicht behandelt, da sie zu technisch sind oder eine ausführliche Erläuterung benötigen, z. B. das Schreiben von Funktionen oder das Syntaxsystem. Und ich weiß nicht viel. Ich möchte die folgenden Themen genauer untersuchen:
Vorschau-, Quickfix- und Listenfenster
Ich verwende manchmal Werkzeuge mit diesen Fenstern, weiß aber nicht, wie ich sie bearbeiten soll. Ich möchte meinem
TLA + Plugin Quickfix-Fehler hinzufügen. Mir gefällt auch die Idee, unterstützende Informationen und Rückrufbefehle in das Vorschaufenster einzufügen. Dies eröffnet einige Möglichkeiten, die in der IDE schwer zu reproduzieren sind.
Neovim API
Neovim bietet eine erweiterte API zur Integration von Vim in externe Programme. Ihr Python-Skript kann Befehle an die Neovim-Instanz senden, und Sie können den Editor beispielsweise über den Server steuern. Ich habe einige coole konzeptionelle Demos gesehen, bei denen die automatische Vervollständigung basierend auf Informationen in einem Browser erfolgt. Es scheint sehr cool zu sein!
Textobjekte
Nie so geschaffen.
Dies war also ein kurzer Überblick über einige der impliziten Funktionen von Vim. Ich hoffe, Sie haben etwas Nützliches herausgefunden!