1124 Stimmen

Was ist Ihre produktivste Abkürzung mit Vim?

Ich habe schon viel gehört über Vim sowohl Vor- als auch Nachteile. Es scheint wirklich, dass man (als Entwickler) mit Vim schneller sein sollte als mit jedem anderen Editor. Ich benutze Vim, um einige grundlegende Dinge zu tun und ich bin bestenfalls 10 mal weniger produktiv mit Vim.

Die einzigen zwei Dinge, die Ihnen wichtig sein sollten, wenn Sie über Geschwindigkeit sprechen (vielleicht sind sie Ihnen nicht wichtig genug, aber das sollten Sie), sind:

  1. Abwechselnd links und rechts verwenden Händen ist die schnellste Weg zur Verwendung des k
  2. Niemals die Maus zu berühren ist die zweite Möglichkeit, so schnell wie möglich zu sein. Es dauert ewig, bis Sie Ihre Hand bewegen können, die Maus zu greifen, sie zu bewegen und sie wieder auf die Tastatur zu bringen (und man muss oft auf die Tastatur schauen, um sicher zu sein, dass Sie um sicher zu sein, dass man die Hand wieder an der richtigen Stelle hat)

Hier sind zwei Beispiele, die zeigen, warum ich mit Vim weit weniger produktiv bin.

Kopieren/Ausschneiden & Einfügen. Ich mache das ständig. Mit all den zeitgenössischen Redakteuren, die Sie drücken Shift mit der linken Hand, und Sie bewegen den Cursor mit der rechten Hand, um Text auszuwählen. Dann Ctrl + C Kopien, bewegen Sie den Cursor und Ctrl + V Pasten.

Mit Vim ist es furchtbar:

  • yy um eine Zeile zu kopieren (Sie wollen fast nie die ganze Zeile!)
  • [number xx]yy zum Kopieren xx Zeilen in den Puffer. Aber man weiß nie genau, ob man das ausgewählt hat, was man wollte. Ich muss oft [number xx]dd dann u rückgängig zu machen!

Ein weiteres Beispiel? Suchen und Ersetzen.

  • Sur PSPad : Ctrl + f geben Sie ein, wonach Sie suchen möchten, und drücken Sie dann Enter .
  • In Vim: / ein, dann geben Sie ein, wonach Sie suchen möchten, und wenn es Sonderzeichen gibt, geben Sie \ vor jede Sonderzeichen, dann drücken Sie Enter .

Und alles mit Vim ist so: es scheint, dass ich nicht weiß, wie ich es richtig handhaben soll.

NB : Ich habe bereits den Vim gelesen schummeln Blatt :)

Meine Frage ist:

Was ist die Art und Weise, wie Sie Vim benutzen, die Sie produktiver macht als mit einem modernen Editor?

2851voto

Jim Dennis Punkte 16336

Ihr Problem mit Vim ist, dass du nicht verstehst, was ich meine. vi .

Sie erwähnen das Schneiden mit yy und beschweren sich, dass Sie fast nie ganze Zeilen abschneiden wollen. In der Tat wollen Programmierer bei der Bearbeitung von Quellcode sehr oft ganze Zeilen, Zeilenbereiche und Codeblöcke bearbeiten. Wie auch immer, yy ist nur eine von vielen Möglichkeiten, Text in den anonymen Kopierpuffer (oder "Register", wie es in vi ).

Das "Zen" der vi ist, dass du eine Sprache sprichst. Die anfängliche y ist ein Verb. Die Aussage yy ist ein Synonym für y_ . Die y wird verdoppelt, um die Eingabe zu erleichtern, da es sich um einen sehr häufigen Vorgang handelt.

Dies kann auch wie folgt ausgedrückt werden dd P (Löschen der aktuellen Zeile und Einfügen einer Kopie an dieser Stelle; als Nebeneffekt bleibt eine Kopie im anonymen Register zurück). Die Website y y d "Verben" nehmen jede Bewegung als "Subjekt". So yW ist "von hier (dem Cursor) bis zum Ende des aktuellen/nächsten (großen) Wortes ziehen" und y'a ist "von hier bis zu der Zeile, die die Marke mit dem Namen ' a '."

Wenn Sie nur die grundlegenden Bewegungen des Cursors nach oben, unten, links und rechts verstehen, dann vi wird für Sie nicht produktiver sein als eine Kopie von "notepad". (Okay, Sie haben immer noch die Syntaxhervorhebung und die Möglichkeit, Dateien zu bearbeiten, die größer sind als die läppischen ~45KB oder so; aber arbeiten Sie mit mir hier).

vi hat 26 "Marken" und 26 "Register". Eine Markierung wird an eine beliebige Cursorposition gesetzt, indem die m Befehl. Jedes Zeichen wird durch einen einzelnen Kleinbuchstaben gekennzeichnet. Also ma setzt die ' a Markierung für den aktuellen Standort, und mz setzt die ' z ' Zeichen. Sie können zu der Zeile, die eine Markierung enthält, mit der Taste ' (einfaches Anführungszeichen). Also 'a springt an den Anfang der Zeile, die den ' a ' Zeichen. Sie können die genaue Position jeder Markierung mit der Taste ` (Anführungszeichen). Also `z direkt an die genaue Stelle des ' z ' mark.

Da es sich um "Bewegungen" handelt, können sie auch als Themen für andere "Aussagen" verwendet werden.

Eine Möglichkeit, eine beliebige Auswahl von Text auszuschneiden, wäre also, eine Markierung zu setzen (ich verwende normalerweise ' a ' als meine "erste" Marke, ' z ' als mein nächstes Ziel, ' b ' als weitere, und ' e (Ich kann mich nicht erinnern, dass ich in den 15 Jahren, in denen ich das Programm benutze, jemals mehr als vier Zeichen interaktiv verwendet habe. vi Man schafft sich seine eigenen Konventionen für die Verwendung von Markierungen und Registern durch Makros, die den eigenen interaktiven Kontext nicht stören). Dann gehen wir an das andere Ende unseres gewünschten Textes; wir können an beiden Enden beginnen, das spielt keine Rolle. Dann können wir einfach verwenden d`a zu schneiden oder y`a zu kopieren. Der gesamte Vorgang hat also einen Overhead von 5 Tastenanschlägen (sechs, wenn wir im "Einfügemodus" beginnen und Esc out Befehlsmodus). Nach dem Ausschneiden oder Kopieren ist das Einfügen einer Kopie nur noch ein Tastendruck: p .

Ich sage, dass dies eine Möglichkeit ist, Text auszuschneiden oder zu kopieren. Es ist aber nur eine von vielen. Häufig können wir den Textbereich knapper beschreiben, ohne den Cursor zu bewegen und eine Markierung zu setzen. Wenn ich mich zum Beispiel in einem Textabsatz befinde, kann ich Folgendes verwenden { y } Bewegungen an den Anfang bzw. das Ende des Absatzes. Um also einen Textabsatz zu verschieben, schneide ich ihn mit { d} (3 Tastenanschläge). (Wenn ich mich bereits in der ersten oder letzten Zeile des Absatzes befinde, kann ich einfach mit d} ou d{ beziehungsweise.

Der Begriff "Absatz" gibt etwas vor, das normalerweise intuitiv sinnvoll ist. Daher funktioniert er oft sowohl für Code als auch für Prosa.

Häufig kennen wir ein Muster (regulärer Ausdruck), das das eine oder andere Ende des Textes, an dem wir interessiert sind, markiert. Vorwärts- oder Rückwärtssuchen sind Bewegungen in vi . Sie können also auch als "Subjekte" in unseren "Aussagen" verwendet werden. Ich kann also verwenden d/foo um von der aktuellen Zeile bis zur nächsten Zeile, die die Zeichenkette "foo" enthält, zu schneiden und y?bar um von der aktuellen Zeile zur letzten (vorherigen) Zeile zu kopieren, die "bar" enthält. Wenn ich keine ganzen Zeilen will, kann ich immer noch die Suchbewegungen (als eigene Anweisungen) verwenden, meine Markierung(en) weglassen und die `x Befehle wie zuvor beschrieben.

Zusätzlich zu "Verben" und "Subjekten" vi hat auch "Objekte" (im grammatikalischen Sinne des Wortes). Bis jetzt habe ich nur die Verwendung des anonymen Registers beschrieben. Ich kann jedoch jedes der 26 "benannten" Register verwenden, indem ich Voranstellen von die "Objekt"-Referenz mit " (der Modifikator für Anführungszeichen). Wenn ich also verwende "add Ich schneide die aktuelle Zeile in die ' a ' registrieren und wenn ich "by/foo dann füge ich eine Kopie des Textes von hier bis zur nächsten Zeile, die "foo" enthält, in die ' b ' registrieren. Um aus einem Register einzufügen, stelle ich dem Einfügen einfach die gleiche Modifizierungssequenz voran: "ap fügt eine Kopie des Dokuments ' a den Inhalt des Registers in den Text nach dem Cursor und "bP fügt eine Kopie von ' b ' vor die aktuelle Zeile zu setzen.

Dieser Begriff der "Präfixe" fügt auch die Analoga der grammatikalischen "Adjektive" und "Adverbien" zu unserer Textmanipulations-"Sprache" hinzu. Die meisten Befehle (Verben) und Bewegungen (Verben oder Objekte, je nach Kontext) können auch numerische Präfixe annehmen. So 3J bedeutet "die nächsten drei Zeilen verbinden" und d5} bedeutet "von der aktuellen Zeile bis zum Ende des fünften Absatzes von hier an löschen".

Dies ist alles Mittelstufe vi . Nichts davon ist Vim spezifisch und es gibt weitaus fortgeschrittenere Tricks in vi wenn Sie bereit sind, sie zu lernen. Wenn Sie nur diese Zwischenkonzepte beherrschen, werden Sie wahrscheinlich feststellen, dass Sie nur selten Makros schreiben müssen, da die Textmanipulationssprache prägnant und ausdrucksstark genug ist, um die meisten Dinge einfach mit der "Muttersprache" des Editors zu erledigen.


Eine Auswahl fortgeschrittener Tricks:

Es gibt eine Reihe von : Befehle, vor allem der :% s/foo/bar/g globale Substitutionstechnik. (Das ist nicht fortschrittlich, aber andere : Befehle sein können). Das Ganze : Reihe von Befehlen wurde historisch vererbt von vi die früheren Inkarnationen der ed (Zeileneditor) und später die ex (erweiterter Zeileneditor) Dienstprogramme. In der Tat vi ist so benannt, weil es die visuelle Schnittstelle zu ex .

: Befehle arbeiten normalerweise über Textzeilen. ed y ex wurden in einer Zeit geschrieben, in der Terminalbildschirme unüblich waren und viele Terminals "Fernschreibgeräte" (TTY) waren. Daher war es üblich, mit gedruckten Kopien des Textes zu arbeiten und Befehle über eine extrem knappe Schnittstelle zu verwenden (die üblichen Verbindungsgeschwindigkeiten betrugen 110 Baud oder, grob gesagt, 11 Zeichen pro Sekunde - was langsamer ist als eine schnelle Schreibkraft; Verzögerungen waren bei interaktiven Sitzungen mit mehreren Benutzern üblich; außerdem gab es oft eine Motivation, Papier zu sparen).

Daher ist die Syntax der meisten : Befehle umfassen eine Adresse oder einen Adressbereich (Zeilennummer), gefolgt von einem Befehl. Natürlich kann man auch wörtliche Zeilennummern verwenden: :127,215 s/foo/bar um das erste Vorkommen von "foo" in "bar" in jeder Zeile zwischen 127 und 215 zu ändern. Man könnte auch einige Abkürzungen verwenden, wie zum Beispiel . ou $ für die aktuelle bzw. letzte Zeile. Man könnte auch relative Präfixe verwenden + y - um sich auf Offsets nach bzw. vor der aktuellen Zeile zu beziehen. Also: :.,$j bedeutet "von der aktuellen Zeile bis zur letzten Zeile alle in einer Zeile zusammenfassen". :% ist gleichbedeutend mit :1,$ (alle Zeilen).

Le site :... g y :... v Befehle bedürfen einer gewissen Erklärung, da sie unglaublich mächtig sind. :... g ist ein Präfix für die "globale" Anwendung eines nachfolgenden Befehls auf alle Zeilen, die einem Muster (regulärer Ausdruck) entsprechen, während :... v wendet einen solchen Befehl auf alle Zeilen an, die NICHT mit dem angegebenen Muster ("v" aus "conVerse") übereinstimmen. Wie bei anderen ex Befehlen können Adressierungs-/Bereichsreferenzen vorangestellt werden. So :.,+21g/foo/d bedeutet "lösche alle Zeilen, die die Zeichenfolge "foo" enthalten, von der aktuellen bis zu den nächsten 21 Zeilen", während :.,$v/bar/d bedeutet: "Lösche von hier bis zum Ende der Datei alle Zeilen, die NICHT die Zeichenfolge "bar" enthalten.

Es ist interessant, dass der gängige Unix-Befehl grep wurde eigentlich durch dieses Buch inspiriert ex Befehl (und ist nach der Art und Weise benannt, wie er dokumentiert wurde). Der ex commande :g/re/p (grep) wurde dokumentiert, wie man Zeilen, die einen "regulären Ausdruck" (re) enthalten, "global" "drucken" kann. Wenn ed y ex verwendet wurden, die :p war einer der ersten Befehle, die man lernte, und oft der erste, der beim Bearbeiten einer Datei verwendet wurde. Mit diesem Befehl wurde der aktuelle Inhalt gedruckt (normalerweise immer nur eine Seite auf einmal mit :.,+25p oder ähnliches).

Beachten Sie, dass :% g/.../d oder (sein reVerse/conVerse-Gegenstück: :% v/.../d sind die häufigsten Verwendungsmuster. Es gibt jedoch noch eine Reihe anderer ex Befehle, die man sich merken sollte:

Wir können verwenden m um Linien zu verschieben, und j um Linien zu verbinden. Wenn Sie z.B. eine Liste haben und alles, was auf ein Muster passt (oder umgekehrt NICHT passt) trennen wollen, ohne es zu löschen, dann können Sie etwas verwenden wie: :% g/foo/m$ ... und alle "foo"-Zeilen sind an das Ende der Datei verschoben worden. (Beachten Sie den anderen Tipp, das Ende der Datei als Leerzeichen zu verwenden). Dadurch wird die relative Reihenfolge aller "foo"-Zeilen beibehalten, während sie aus dem Rest der Liste extrahiert wurden. (Dies wäre gleichbedeutend mit etwas wie: 1G!GGmap!Ggrep foo<ENTER>1G:1,'a g/foo'/d (Kopieren der Datei in ihren eigenen Schwanz, Filtern des Schwanzes durch grep und löschen Sie alles, was im Kopf ist).

Um Zeilen zu verbinden, kann ich normalerweise ein Muster für alle Zeilen finden, die mit ihrem Vorgänger verbunden werden müssen (z. B. alle Zeilen, die mit "^ " und nicht mit "^ * " in einer Aufzählung beginnen). In diesem Fall würde ich verwenden: :% g/^ /-1j (gehen Sie für jede übereinstimmende Zeile eine Zeile nach oben und verbinden Sie sie). (BTW: bei Aufzählungslisten funktioniert die Suche nach den Aufzählungszeilen und das Verbinden mit der nächsten aus mehreren Gründen nicht ... es kann eine Aufzählungszeile mit einer anderen verbinden, und es wird keine Aufzählungszeile mit einer anderen verbinden. alle seiner Fortsetzungen; es wird nur paarweise auf die Übereinstimmungen funktionieren).

Fast überflüssig zu erwähnen, dass Sie unseren alten Freund s (Ersatz) mit dem g y v (global/umgekehrt-global) Befehle. Normalerweise ist dies nicht erforderlich. Denken Sie jedoch an einen Fall, in dem Sie eine Ersetzung nur für Zeilen durchführen wollen, die einem anderen Muster entsprechen. Oft können Sie ein kompliziertes Muster mit Captures verwenden und Rückverweise einsetzen, um die Teile der Zeilen zu erhalten, die Sie NICHT ändern wollen. Oft wird es jedoch einfacher sein, die Übereinstimmung von der Ersetzung zu trennen: :% g/foo/s/bar/zzz/g -- für jede Zeile, die "foo" enthält, alle "bar" durch "zzz" ersetzen. (Etwas wie :% s/\(.*foo.*\)bar\(.*\)/\1zzz\2/g würde nur für die Fälle funktionieren, in denen "bar" von "foo" in derselben Zeile VORANGESTELLT wurde; es ist schon unhandlich genug und müsste noch weiter verfälscht werden, um alle Fälle zu erfassen, in denen "bar" vor "foo" stand)

Der Punkt ist, dass es mehr gibt als nur p , s und d Zeilen im ex Befehlssatz.

Le site : Adressen können sich auch auf Marken beziehen. So können Sie verwenden: :'a,'bg/foo/j um jede Zeile, die die Zeichenkette foo enthält, mit der nachfolgenden Zeile zu verbinden, wenn sie zwischen den Zeilen zwischen den ' a ' und ' b ' Noten. (Ja, alle vorhergehenden ex Befehlsbeispiele können durch Voranstellen dieser Art von Adressierungsausdrücken auf Teilmengen der Dateizeilen beschränkt werden).

Das ist ziemlich obskur (ich habe so etwas in den letzten 15 Jahren nur ein paar Mal benutzt). Ich gebe aber offen zu, dass ich oft Dinge iterativ und interaktiv erledigt habe, die wahrscheinlich effizienter hätten erledigt werden können, wenn ich mir die Zeit genommen hätte, die richtige Beschwörungsformel zu finden.

Eine weitere sehr nützliche vi ou ex Befehl ist :r um den Inhalt einer anderen Datei einzulesen. So: :r foo fügt den Inhalt der Datei mit dem Namen "foo" in die aktuelle Zeile ein.

Stärker ist die :r! Befehl. Damit werden die Ergebnisse eines Befehls gelesen. Es ist dasselbe wie das Anhalten des vi Sitzung, das Ausführen eines Befehls, das Umleiten seiner Ausgabe in eine temporäre Datei, das Fortsetzen Ihrer vi Sitzung und das Einlesen des Inhalts aus der temporären Datei.

Noch leistungsstärker sind die ! (Peng) und :... ! ( ex bang) Befehle. Diese führen ebenfalls externe Befehle aus und lesen die Ergebnisse in den aktuellen Text ein. Allerdings filtern sie auch eine Auswahl unseres Textes durch den Befehl! So können wir alle Zeilen in unserer Datei sortieren mit 1G!Gsort ( G ist die vi "goto"-Befehl; er springt standardmäßig in die letzte Zeile der Datei, kann aber mit einer Zeilennummer versehen werden (z. B. 1, die erste Zeile). Dies ist gleichbedeutend mit dem Befehl ex Variante :1,$!sort . Schriftsteller verwenden oft ! mit dem Unix fmt ou falten Hilfsprogramme für die Neuformatierung oder den "Zeilenumbruch" von Textabschnitten. Ein sehr gebräuchliches Makro ist {!}fmt (Umformatierung des aktuellen Absatzes). Programmierer verwenden es manchmal, um ihren Code oder nur Teile davon durchlaufen zu lassen Einzug oder andere Code-Umformatierungswerkzeuge.

Die Verwendung des :r! y ! Befehle bedeutet, dass jedes externe Dienstprogramm oder jeder Filter als eine Erweiterung unseres Editors behandelt werden kann. Ich habe sie gelegentlich mit Skripten verwendet, die Daten aus einer Datenbank abrufen, oder mit wget ou Luchs Befehle, die Daten von einer Website abrufen, oder ssh Befehle, die Daten von entfernten Systemen abrufen.

Eine weitere nützliche ex Befehl ist :so (kurz für :source ). Damit wird der Inhalt einer Datei als eine Reihe von Befehlen gelesen. Wenn Sie vi führt es normalerweise implizit eine :source auf ~/.exinitrc Datei (und Vim tut dies normalerweise am ~/.vimrc natürlich). Der Vorteil ist, dass Sie Ihr Editorprofil im Handumdrehen ändern können, indem Sie einfach einen neuen Satz von Makros, Abkürzungen und Editoreinstellungen einfügen. Wenn Sie raffiniert sind, können Sie dies sogar als Trick zum Speichern von Sequenzen von ex Bearbeitungsbefehle, die bei Bedarf auf Dateien angewendet werden können.

Ich habe zum Beispiel eine siebenzeilige Datei (36 Zeichen), die eine Datei durchläuft wc und fügt einen Kommentar im C-Stil am Anfang der Datei ein, der diese Wortzahldaten enthält. Ich kann dieses "Makro" auf eine Datei anwenden, indem ich einen Befehl wie: vim +'so mymacro.ex' ./mytarget

(Die + Befehlszeilenoption zu vi y Vim wird normalerweise verwendet, um die Bearbeitungssitzung bei einer bestimmten Zeilennummer zu beginnen. Es ist jedoch eine wenig bekannte Tatsache, dass man die + von jedem gültigen ex Befehl/Ausdruck, wie z.B. ein "source"-Befehl, wie ich es hier getan habe; für ein einfaches Beispiel habe ich Skripte, die aufrufen: vi +'/foo/d|wq!' ~/.ssh/known_hosts um einen Eintrag aus meiner SSH-Datei "Bekannte Hosts" zu entfernen, während ich eine Reihe von Servern neu importiere).

Normalerweise ist es viel einfacher, solche "Makros" mit Perl oder AWK zu schreiben, sed (was in der Tat so ist wie grep ein Dienstprogramm nach dem Vorbild des ed Befehl).

Le site @ ist wahrscheinlich der obskurste Befehl vi Befehl. In den Kursen für fortgeschrittene Systemadministration, die ich seit fast einem Jahrzehnt gelegentlich gebe, habe ich nur sehr wenige Leute getroffen, die ihn jemals benutzt haben. @ führt den Inhalt eines Registers aus, als wäre es ein vi ou ex Befehl.
Beispiel: Ich verwende oft: :r!locate ... um eine Datei auf meinem System zu finden und ihren Namen in mein Dokument einzulesen. Von dort aus lösche ich alle überflüssigen Treffer, so dass nur noch der vollständige Pfad zu der Datei übrig bleibt, an der ich interessiert bin. Anstatt mühsam Tab -durch jede Komponente des Pfades zu gehen (oder schlimmer noch, wenn ich auf einem Rechner festsitze, der keine Unterstützung für Tabulatorvervollständigung in seiner Kopie von vi ) Ich benutze einfach:

  1. 0i:r (um die aktuelle Zeile in eine gültige :r Befehl),
  2. "cdd (um die Zeile im Register "c" zu löschen) und
  3. @c diesen Befehl ausführen.

Das sind nur 10 Tastenanschläge (und der Ausdruck "cdd @c ist für mich praktisch ein Fingermakro, so dass ich es fast so schnell tippen kann wie ein gewöhnliches Wort mit sechs Buchstaben).


Ein ernüchternder Gedanke

Ich habe nur an der Oberfläche gekratzt vi und nichts von dem, was ich hier beschrieben habe, ist auch nur ein Teil der "Verbesserungen", für die vim ist benannt! Alles, was ich hier beschrieben habe, sollte mit jeder alten Kopie von vi von vor 20 oder 30 Jahren.

Es gibt Menschen, die wesentlich mehr von den folgenden Substanzen verwendet haben vi als ich es jemals tun werde.

503voto

Christian C. Salvadó Punkte 763569

Sie sprechen über das Auswählen und Kopieren von Text, ich denke, Sie sollten einen Blick auf die Vim Visueller Modus .

Im visuellen Modus können Sie Text mit Vim-Befehlen auswählen und dann mit der Auswahl machen, was Sie wollen.

Betrachten Sie die folgenden gängigen Szenarien:

Sie müssen bis zur nächsten passenden Klammer auswählen.

Das könnten Sie tun:

  • v% wenn der Cursor auf der beginnenden/endenden Klammer steht
  • vib wenn sich der Cursor innerhalb des Klammerblocks befindet

Sie möchten Text zwischen Anführungszeichen auswählen:

  • vi" für doppelte Anführungszeichen
  • vi' für einfache Anführungszeichen

Sie möchten einen Block mit geschweiften Klammern auswählen (sehr häufig bei Sprachen im Stil von C):

  • viB
  • vi{

Sie möchten die gesamte Datei auswählen:

  • ggVG

Visuelle Blockauswahl ist eine weitere sehr nützliche Funktion, mit der Sie einen rechteckigen Textbereich auswählen können. Ctrl - V um es zu starten, und wählen Sie dann den gewünschten Textblock aus und führen Sie eine beliebige Operation durch, z. B. Ziehen, Löschen, Einfügen, Bearbeiten usw. Es ist großartig zu bearbeiten spaltenorientiert Text.

207voto

vdboor Punkte 20756

Einige Tipps zur Produktivität:

Intelligente Bewegungen

  • * y # Suche nach dem Wort unter dem Cursor vorwärts/rückwärts.
  • w zum nächsten Wort
  • W zum nächsten durch Leerzeichen getrennten Wort
  • b / e zum Anfang/Ende des aktuellen Wortes. ( B / E nur für Leerzeichen getrennt)
  • gg / G zum Anfang/Ende der Datei springen.
  • % Sprung zum passenden { .. } oder ( .. ), usw..
  • { / } zum nächsten Absatz springen.
  • '. zurück zur letzten bearbeiteten Zeile springen.
  • g; zurück zur zuletzt bearbeiteten Position springen.

Schnellbearbeitungsbefehle

  • I am Anfang einfügen.
  • A an das Ende anhängen.
  • o / O eine neue Zeile nach/vor der aktuellen öffnen.
  • v / V / Ctrl+V Visueller Modus (zur Auswahl von Text!)
  • Shift+R Text ersetzen
  • C den restlichen Teil der Zeile ändern.

Kombinierte Befehle

Die meisten Befehle akzeptieren einen Betrag und eine Richtung, zum Beispiel:

  • cW = Änderung bis zum Wortende
  • 3cW = 3 Wörter ändern
  • BcW = zum Anfang des vollständigen Wortes, vollständiges Wort ändern
  • ciW = inneres Wort ändern.
  • ci" = Inneres zwischen ".." ändern
  • ci( = Text zwischen ( .. ) ändern
  • ci< = Text ändern zwischen < .. > (braucht set matchpairs+=<:> in vimrc)
  • 4dd = 4 Zeilen löschen
  • 3x = 3 Zeichen löschen.
  • 3s = 3 Zeichen ersetzen.

Nützliche Befehle für Programmierer

  • r ein Zeichen ersetzen (z. B. rd ersetzt das aktuelle Zeichen durch d ).
  • ~ ändert den Fall.
  • J Verbindet zwei Zeilen
  • Strg+A / Strg+X erhöht/verringert eine Zahl.
  • . letzten Befehl wiederholen (ein einfaches Makro)
  • == Zeileneinzug fixieren
  • > Block einrücken (im visuellen Modus)
  • < Block einrücken (im visuellen Modus)

Makro-Aufnahme

  • Presse q[ key ] um die Aufnahme zu starten.
  • Dann drücken Sie q um die Aufnahme zu beenden.
  • Das Makro kann gespielt werden mit @[ key ] .

Durch die Verwendung ganz bestimmter Befehle und Bewegungen kann VIM genau diese Aktionen für die nächsten Zeilen wiedergeben. (z. B. A für Anhängen bis zum Ende, b / e um den Cursor an den Anfang bzw. das Ende eines Wortes zu setzen)

Beispiel für gut aufgebaute Einstellungen

# reset to vim-defaults
if &compatible          # only if not set before:
  set nocompatible      # use vim-defaults instead of vi-defaults (easier, more user friendly)
endif

# display settings
set background=dark     # enable for dark terminals
set nowrap              # dont wrap lines
set scrolloff=2         # 2 lines above/below cursor when scrolling
set number              # show line numbers
set showmatch           # show matching bracket (briefly jump)
set showmode            # show mode in status bar (insert/replace/...)
set showcmd             # show typed command in status bar
set ruler               # show cursor position in status bar
set title               # show file in titlebar
set wildmenu            # completion with menu
set wildignore=*.o,*.obj,*.bak,*.exe,*.py[co],*.swp,*~,*.pyc,.svn
set laststatus=2        # use 2 lines for the status bar
set matchtime=2         # show matching bracket for 0.2 seconds
set matchpairs+=<:>     # specially for html

# editor settings
set esckeys             # map missed escape sequences (enables keypad keys)
set ignorecase          # case insensitive searching
set smartcase           # but become case sensitive if you type uppercase characters
set smartindent         # smart auto indenting
set smarttab            # smart tab handling for indenting
set magic               # change the way backslashes are used in search patterns
set bs=indent,eol,start # Allow backspacing over everything in insert mode

set tabstop=4           # number of spaces a tab counts for
set shiftwidth=4        # spaces for autoindents
#set expandtab           # turn a tabs into spaces

set fileformat=unix     # file mode is unix
#set fileformats=unix,dos    # only detect unix file format, displays that ^M with dos files

# system settings
set lazyredraw          # no redraws in macros
set confirm             # get a dialog when :q, :w, or :wq fails
set nobackup            # no backup~ files.
set viminfo='20,\"500   # remember copy registers after quitting in the .viminfo file -- 20 jump links, regs up to 500 lines'
set hidden              # remember undo after quitting
set history=50          # keep 50 lines of command history
set mouse=v             # use mouse in visual mode (not normal,insert,command,help mode

# color settings (if terminal/gui supports it)
if &t_Co > 2 || has("gui_running")
  syntax on          # enable colors
  set hlsearch       # highlight search (very useful!)
  set incsearch      # search incremently (search while typing)
endif

# paste mode toggle (needed when using autoindent/smartindent)
map <F10> :set paste<CR>
map <F11> :set nopaste<CR>
imap <F10> <C-O>:set paste<CR>
imap <F11> <nop>
set pastetoggle=<F11>

# Use of the filetype plugins, auto completion and indentation support
filetype plugin indent on

# file type specific settings
if has("autocmd")
  # For debugging
  #set verbose=9

  # if bash is sh.
  let bash_is_sh=1

  # change to directory of current file automatically
  autocmd BufEnter * lcd %:p:h

  # Put these in an autocmd group, so that we can delete them easily.
  augroup mysettings
    au FileType xslt,xml,css,html,xhtml,javascript,sh,config,c,cpp,docbook set smartindent shiftwidth=2 softtabstop=2 expandtab
    au FileType tex set wrap shiftwidth=2 softtabstop=2 expandtab

    # Confirm to PEP8
    au FileType python set tabstop=4 softtabstop=4 expandtab shiftwidth=4 cinwords=if,elif,else,for,while,try,except,finally,def,class
  augroup END

  augroup perl
    # reset (disable previous 'augroup perl' settings)
    au!  

    au BufReadPre,BufNewFile
    \ *.pl,*.pm
    \ set formatoptions=croq smartindent shiftwidth=2 softtabstop=2 cindent cinkeys='0{,0},!^F,o,O,e' " tags=./tags,tags,~/devel/tags,~/devel/C
    # formatoption:
    #   t - wrap text using textwidth
    #   c - wrap comments using textwidth (and auto insert comment leader)
    #   r - auto insert comment leader when pressing <return> in insert mode
    #   o - auto insert comment leader when pressing 'o' or 'O'.
    #   q - allow formatting of comments with "gq"
    #   a - auto formatting for paragraphs
    #   n - auto wrap numbered lists
    #   
  augroup END

  # Always jump to the last known cursor position. 
  # Don't do it when the position is invalid or when inside
  # an event handler (happens when dropping a file on gvim). 
  autocmd BufReadPost * 
    \ if line("'\"") > 0 && line("'\"") <= line("$") | 
    \   exe "normal g`\"" | 
    \ endif 

endif # has("autocmd")

Die Einstellungen können gespeichert werden in ~/.vimrc oder systemweit in /etc/vimrc.local und dann durch Lesen aus dem /etc/vimrc Datei verwenden:

source /etc/vimrc.local

(Sie müssen die # Kommentarzeichen mit " damit es in VIM funktioniert, wollte ich hier eine richtige Syntaxhervorhebung geben).

Die Befehle, die ich hier aufgelistet habe, sind ziemlich grundlegend und die wichtigsten, die ich bisher verwendet habe. Sie machen mich schon jetzt wesentlich produktiver, ohne dass ich den ganzen Schnickschnack kennen muss.

98voto

kev Punkte 145226

Le site Control + R Mechanismus ist sehr nützlich :-) In entweder Einfügemodus ou Befehlsmodus (d.h. auf der : Zeile bei der Eingabe von Befehlen), weiter mit einem nummerierten oder benannten Register:

  • a - z den genannten Registern

  • " das unbenannte Register, das den Text des letzten Löschens oder Zurückziehens enthält

  • % den aktuellen Dateinamen

  • # den alternativen Dateinamen

  • * den Inhalt der Zwischenablage (X11: Primärauswahl)

  • + den Inhalt der Zwischenablage

  • / das letzte Suchmuster

  • : die letzte Befehlszeile

  • . der zuletzt eingefügte Text

  • - die letzte kleine (weniger als eine Zeile) löschen

  • =5*5 25 in Text einfügen (Mini-Rechner)

参照 :help i_CTRL-R y :help c_CTRL-R für weitere Details, und schauen Sie sich in der Nähe nach weiteren CTRL-R-Vorteilen um.

91voto

Benson Punkte 22021

Vim-Plugins

Hier gibt es viele gute Antworten, und eine erstaunliche über das Zen von vi. Eine Sache, die ich nicht erwähnt sehe, ist, dass vim über Plugins extrem erweiterbar ist. Es gibt Skripte und Plugins, mit denen man alle möglichen verrückten Dinge tun kann, an die der ursprüngliche Autor nie gedacht hat. Hier sind ein paar Beispiele für unglaublich praktische vim-Plugins:

schienen.vim

Rails.vim ist ein von tpope geschriebenes Plugin. Es ist ein unglaubliches Werkzeug für Leute, die Rails entwickeln. Es macht magische kontextabhängige Dinge, die es einem erlauben, einfach von einer Methode in einem Controller zur zugehörigen Ansicht zu springen, hinüber zu einem Modell und hinunter zu den Unit-Tests für dieses Modell. Es hat mir als Rails-Entwickler Dutzende, wenn nicht Hunderte von Stunden erspart.

gist.vim

Mit diesem Plugin können Sie einen Textbereich im visuellen Modus auswählen und einen Schnellbefehl eingeben, um ihn in gist.github.com . Dies ermöglicht einen einfachen Pastebin-Zugriff, was unglaublich praktisch ist, wenn Sie mit jemandem über IRC oder IM zusammenarbeiten.

space.vim

Dieses Plugin bietet spezielle Funktionen für die Leertaste. Es verwandelt die Leertaste in etwas, das dem Punkt entspricht, aber statt Aktionen zu wiederholen, wiederholt es Bewegungen. Dies kann sehr praktisch sein, um sich schnell durch eine Datei zu bewegen, so wie Sie es gerade brauchen.

umgeben.vim

Dieses Plugin gibt Ihnen die Möglichkeit, mit Text zu arbeiten, der auf irgendeine Weise abgegrenzt ist. Es gibt Ihnen Objekte, die Dinge innerhalb von Parens, Dinge innerhalb von Anführungszeichen, etc. bezeichnen. Es kann sich als nützlich erweisen, um begrenzten Text zu bearbeiten.

supertab.vim

Dieses Skript bringt ausgefallene Tabulator-Vervollständigungsfunktionen in den Vim. Die Autovervollständigung ist bereits im Kern von vim vorhanden, aber dies bringt sie zu einer schnellen Registerkarte, anstatt mehrere verschiedene Tastenkombinationen. Sehr praktisch, und es macht unglaublich viel Spaß, es zu benutzen. Es ist zwar nicht die Intellisense von VS, aber es ist ein großer Schritt und bringt einen großen Teil der Funktionalität, die man von einem Tab-Vervollständigungswerkzeug erwarten würde.

syntastic.vim

Dieses Werkzeug bringt externe Syntaxprüfungsbefehle in vim. Ich habe es nicht persönlich benutzt, aber ich habe viel Gutes darüber gehört und das Konzept ist schwer zu übertreffen. Die Überprüfung der Syntax, ohne sie manuell durchführen zu müssen, ist eine große Zeitersparnis und kann Ihnen helfen, syntaktische Fehler zu finden, wenn Sie sie einführen und nicht erst, wenn Sie endlich aufhören zu testen.

fluechtig.vim

Direkter Zugriff auf git aus vim heraus. Nochmals, ich habe dieses Plugin nicht benutzt, aber ich kann den Nutzen sehen. Leider bin ich in einer Kultur, in der svn als "neu" angesehen wird, also werde ich git bei der Arbeit wahrscheinlich noch eine ganze Weile nicht sehen.

nerdtree.vim

Ein Baum-Browser für Vim. Ich habe vor kurzem angefangen, ihn zu benutzen, und er ist wirklich praktisch. Damit kann man eine Baumansicht in einen vertikalen Split setzen und Dateien einfach öffnen. Das ist großartig für ein Projekt mit vielen Quelldateien, zwischen denen man häufig hin und her springt.

FuzzyFinderTextmate.vim

Dieses Plugin wird nicht gewartet, ist aber dennoch sehr nützlich. Es bietet die Möglichkeit, Dateien mit einer "unscharfen" beschreibenden Syntax zu öffnen. Das bedeutet, dass Sie in einem spärlichen Dateibaum nur genügend Zeichen eingeben müssen, um die Dateien, an denen Sie interessiert sind, vom Rest des Mülls zu unterscheiden.

Schlussfolgerung

Es gibt eine Menge unglaublicher Werkzeuge für vim. Ich bin sicher, dass ich hier nur an der Oberfläche gekratzt habe, und es lohnt sich, nach Werkzeugen zu suchen, die für Ihren Bereich geeignet sind. Die Kombination aus dem mächtigen Werkzeugsatz des traditionellen vi, den Verbesserungen von vim und den Plugins, die vim noch weiter ausbauen, ist eine der mächtigsten Möglichkeiten, Text zu bearbeiten, die je erdacht wurden. Vim ist leicht so leistungsfähig wie Emacs, Eclipse, Visual Studio und Textmate.

Gracias

Dank an duwanis für seine vim-Konfigurationen von dem ich viel gelernt habe und von dem ich die meisten der hier aufgeführten Plugins übernommen habe.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X