Mindestens ein Vim-Trick, von dem Sie nichts wussten

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:

ausgewähltctrl-Ag ctrl-A2 g ctrl-A
  a 0
 b 0
 c
 d 0 
  a 1
 b 1
 c
 d 1 
  a 1
 b 2
 c
 d 3 
  a 2
 b 4
 c
 d 6 

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.

Undotree


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.

vim.swap


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.

Neoterm


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!

Source: https://habr.com/ru/post/de454742/


All Articles