it-swarm.com.de

Was ist Ihre produktivste Verknüpfung mit Vim?

Ich habe viel über Vim gehört, sowohl für als auch für. Es scheint wirklich, dass Sie (als Entwickler) mit Vim schneller sein sollten als mit jedem anderen Editor. Ich benutze Vim, um einige grundlegende Dinge zu erledigen, und ich bin mit Vim höchstens zehnmal weniger produktiv .

Die einzigen zwei Dinge, die Sie beachten sollten, wenn Sie über Geschwindigkeit sprechen (Sie interessieren sich vielleicht nicht genug dafür, aber Sie sollten):

  1. Die Verwendung der linken und rechten Hand ist die schnellste Möglichkeit, die Tastatur zu verwenden.
  2. Niemals die Maus berühren ist der zweite Weg, um so schnell wie möglich zu sein. Es dauert eine Ewigkeit, bis Sie Ihre Hand bewegen, die Maus greifen, bewegen und zur Tastatur zurückbringen (und Sie müssen oft auf die Tastatur schauen, um sicherzugehen, dass Sie Ihre Hand wieder richtig an den richtigen Ort gebracht haben).

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

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

Mit Vim ist es schrecklich:

  • yy um eine Zeile zu kopieren (Sie wollen fast nie die ganze Zeile!)
  • [number xx]yy, um xx-Zeilen in den Puffer zu kopieren. Aber Sie wissen nie genau, ob Sie ausgewählt haben, was Sie wollten. Ich muss oft [number xx]dd dann u rückgängig machen !

Ein anderes Beispiel? Suchen & Ersetzen.

  • In PSPadCtrl+f Geben Sie dann ein, wonach Sie suchen möchten, und drücken Sie dann Enter.
  • Geben Sie in Vim: / ein, wonach Sie suchen möchten, und geben Sie ggf. Sonderzeichen ein \ vor jedem Sonderzeichen und drücken Sie dann Enter.

Und bei Vim ist alles so: Es scheint, ich weiß nicht, wie ich richtig damit umgehen soll.

NB: Ich habe bereits die Vim gelesen betrügenBogen :)

Meine Frage ist:

Wie setzen Sie Vim ein, um produktiver zu sein als mit einem modernen Editor?

1127
Olivier Pons

Ihr Problem mit Vim ist, dass Sie nicht vi grok.

Sie erwähnen das Schneiden mit yy und beklagen sich, dass Sie fast nie ganze Linien schneiden wollen. Tatsächlich möchten Programmierer, die den Quellcode bearbeiten, sehr oft ganze Zeilen, Zeilenbereiche und Codeblöcke bearbeiten. yy ist jedoch nur eine von vielen Möglichkeiten, Text in den anonymen Kopierpuffer zu ziehen (oder "zu registrieren", wie es in vi genannt wird).

Das "Zen" von vi ist, dass Sie eine Sprache sprechen. Das anfängliche y ist ein Verb. Die Anweisung yy ist ein Synonym für y_. Das y ist verdoppelt, um die Eingabe zu vereinfachen, da es sich um eine so häufige Operation handelt.

Dies kann auch als ddP ausgedrückt werden (Löschen Sie die aktuelle Zeile und fügen Sie eine Kopie wieder ein; Belassen Sie eine Kopie im anonymen Register als Nebeneffekt). Die y und d "Verben" nehmen jede Bewegung als "Subjekt". Somit ist yW "von hier (dem Cursor) bis zum Ende des aktuellen/nächsten (großen) Wortes" und y'a ist "von hier bis zu der Zeile mit der Markierung 'a '. "

Wenn Sie nur grundlegende Cursorbewegungen nach oben, unten, links und rechts verstehen, ist vi für Sie nicht produktiver als eine Kopie von "notepad". (Okay, Sie haben immer noch Syntax-Hervorhebungen und die Möglichkeit, Dateien zu verarbeiten, die größer als ca. 45 KB sind. Aber arbeiten Sie hier mit mir zusammen.).

vi hat 26 "Marken" und 26 "Register". Eine Markierung wird mit dem Befehl m auf eine beliebige Cursorposition gesetzt. Jede Marke wird durch einen einzelnen Kleinbuchstaben gekennzeichnet. Somit setzt ma die Markierung 'a' auf die aktuelle Position, und mz setzt die Markierung 'z'. Sie können mit dem Befehl ' (einfaches Anführungszeichen) in die Zeile mit der Markierung wechseln. So bewegt sich 'a an den Anfang der Zeile, die die Markierung 'a' enthält. Sie können mit dem Befehl ` (backquote) zur genauen Position einer beliebigen Marke wechseln. Somit bewegt sich `z direkt zur genauen Position der Markierung 'z'.

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

Eine Möglichkeit, eine beliebige Textauswahl auszuschneiden, besteht darin, eine Markierung zu entfernen (ich verwende normalerweise 'a' als meine "erste" Markierung, 'z' als meine nächste Marke, 'b' als eine weitere und 'e' als eine weitere Marke (ich kann mich nicht erinnern, dass ich in 15 Jahren der Verwendung von = jemals mehr als vier Marken interaktiv verwendet habe) vi ; man erstellt eigene Konventionen darüber, wie Markierungen und Register von Makros verwendet werden, die den interaktiven Kontext nicht stören.) Dann gehen wir zum anderen Ende unseres gewünschten Textes, wir kann an beiden Enden beginnen, egal, dann können wir einfach d`a zum Ausschneiden oder y`a zum Kopieren verwenden "Modus und benötigt Esc out Befehlsmodus). Sobald wir ausgeschnitten oder kopiert haben, ist das Einfügen einer Kopie ein einziger Tastendruck: p.

Ich sage, dass dies eine Möglichkeit ist, Text auszuschneiden oder zu kopieren. Es ist jedoch nur einer von vielen. Häufig können wir den Textbereich prägnanter beschreiben, ohne den Cursor zu bewegen und eine Markierung zu entfernen. Wenn ich mich zum Beispiel in einem Textabschnitt befinde, kann ich die Bewegungen { und } zum Anfang bzw. Ende des Abschnitts verwenden. Um einen Textabschnitt zu verschieben, schneide ich ihn mit {d} (3 Tastenanschläge) aus. (Wenn ich mich bereits in der ersten oder letzten Zeile des Absatzes befinde, kann ich einfach d} oder d{ verwenden.

Der Begriff "Absatz" ist standardmäßig etwas, was normalerweise intuitiv vernünftig ist. Daher funktioniert es 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 kennzeichnet, an dem wir interessiert sind. Vorwärts- oder Rückwärtssuche sind Bewegungen in vi . Sie können daher auch als "Subjekte" in unseren "Aussagen" verwendet werden. Ich kann also d/foo verwenden, um von der aktuellen Zeile zur nächsten Zeile mit der Zeichenfolge "foo" zu wechseln, und y?bar, um von der aktuellen Zeile zur neuesten (vorherigen) Zeile mit "bar" zu kopieren. Wenn ich keine ganzen Zeilen möchte, kann ich die Suchbewegungen (als eigene Anweisungen) weiterhin verwenden, meine Markierungen entfernen und die `x -Befehle wie zuvor beschrieben verwenden.

Neben "Verben" und "Subjekten" hat vi auch "Objekte" (im grammatikalischen Sinne des Begriffs). Bisher habe ich nur die Verwendung des anonymen Registers beschrieben. Ich kann jedoch jedes der 26 "named" -Register mit Präfix der "object" -Referenz mit " (dem Modifikator für doppelte Anführungszeichen) verwenden. Wenn ich also "add verwende, schneide ich die aktuelle Zeile in das 'a' - Register und wenn ich "by/foo verwende, ziehe ich eine Kopie des Textes von hier aus zur nächsten Zeile mit "foo" in das 'b' - Register. Zum Einfügen aus einem Register stelle ich dem Einfügen einfach die gleiche Modifizierersequenz voran: "ap fügt eine Kopie des Inhalts des Registers 'a' in den Text nach dem Cursor und "bP ein. Fügt eine Kopie von 'b' vor der aktuellen Zeile ein.

Dieser Begriff der "Präfixe" fügt unserer Sprache zur Textbearbeitung auch die Analoga der grammatischen "Adjektive" und "Adverbien" hinzu. Die meisten Befehle (Verben) und Bewegungen (Verben oder Objekte, je nach Kontext) können auch numerische Präfixe haben 3J bedeutet "die nächsten drei Zeilen verbinden" und d5} bedeutet "aus der aktuellen Zeile bis zum Ende des fünften Absatzes von hier unten 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 Zwischenbegriffe beherrschen würden, würden Sie wahrscheinlich feststellen, dass Sie selten Makros schreiben müssen, da die Textbearbeitungssprache ausreichend prägnant und ausdrucksstark ist, um die meisten Aufgaben mit der "Muttersprache" des Editors zu erledigen.


Eine Auswahl fortgeschrittener Tricks:

Es gibt eine Reihe von : Befehlen, insbesondere die :% s/foo/bar/g globale Substitutionstechnik. (Das ist nicht fortgeschritten, aber andere : Befehle können es sein). Der gesamte : Befehlssatz wurde historisch von den vorherigen Inkarnationen von vi als ed (Zeileneditor) vererbt. und später die Dienstprogramme ex (Extended Line Editor). Tatsächlich heißt vi so, weil es die visuelle Schnittstelle zu ex ist.

: -Befehle werden normalerweise über Textzeilen ausgeführt. ed und ex wurden in einer Ära geschrieben, in der Terminal-Bildschirme ungewöhnlich waren und viele Terminals "Teletype" (TTY) -Geräte waren. So war es üblich, von gedruckten Kopien des Textes mit Befehlen über eine äußerst knappe Benutzeroberfläche zu arbeiten (übliche Verbindungsgeschwindigkeiten waren 110 Baud oder ungefähr 11 Zeichen pro Sekunde - was langsamer ist als ein schneller Schreiber; Verzögerungen waren üblich) Multi-User-Interaktionssitzungen; außerdem gab es oft Motivation, Papier zu sparen).

Daher enthält die Syntax der meisten : Befehle eine Adresse oder einen Adressbereich (Zeilennummer), gefolgt von einem Befehl. Natürlich könnte man 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 wie . oder $ für aktuelle und letzte Zeile. Man könnte auch relative Präfixe + und - verwenden, um auf Offsets nach bzw. vor der aktuellen Linie zu verweisen. Also: :.,$j bedeutet "von der aktuellen bis zur letzten Zeile, füge sie alle zu einer Zeile zusammen". :% steht für :1,$ (alle Zeilen).

Die Befehle :... g und :... v enthalten eine Erklärung, da sie unglaublich leistungsfähig sind. :... g ist ein Präfix für das "globale" Anwenden eines nachfolgenden Befehls auf alle Zeilen, die einem Muster entsprechen (regulärer Ausdruck), während :... v einen solchen Befehl auf alle Zeilen anwendet, die dem angegebenen Muster NICHT entsprechen ("v "from" conVerse "). Wie bei anderen ex Befehlen können diesen Adress-/Bereichsreferenzen vorangestellt werden. So bedeutet :.,+21g/foo/d "alle Zeilen löschen, die die Zeichenfolge" foo "von der aktuellen bis zur nächsten 21 Zeilen enthalten" während :.,$v/bar/d "von hier bis zum Ende der Datei" bedeutet, alle Zeilen löschen, die DON ' T enthält die Zeichenfolge "bar".

Es ist interessant, dass der allgemeine Unix-Befehl grep tatsächlich von diesem Befehl ex inspiriert wurde (und nach der Art und Weise benannt ist, wie er war) dokumentiert). Mit dem Befehl ex :g/re/p (grep) wurde dokumentiert, wie Zeilen mit einem "regulären Ausdruck" (re) "global" "gedruckt" werden. Wenn ed und ex verwendet wurden, war der Befehl :p einer der ersten, die jemand gelernt hat, und oft der erste Eine, die beim Bearbeiten einer Datei verwendet wird. So haben Sie den aktuellen Inhalt gedruckt (normalerweise nur jeweils eine Seite mit :.,+25p oder einem ähnlichen).

Beachten Sie, dass :% g/.../d oder (sein Gegenstück zu reVerse/conVerse: :% v/.../d die häufigsten Verwendungsmuster sind. Es gibt jedoch einige andere ex Befehle, an die Sie sich erinnern sollten:

Wir können m verwenden, um Linien zu verschieben, und j, um Linien zu verbinden. Wenn Sie beispielsweise eine Liste haben und alle übereinstimmenden Elemente (oder umgekehrt KEINE Muster) trennen möchten, ohne sie zu löschen, können Sie Folgendes verwenden: :% g/foo/m$ ... und alle "foo" -Zeilen wird an das Ende der Datei verschoben. (Beachten Sie den anderen Tipp zum Verwenden des Dateiendes als Arbeitsbereich). Dies hat die relative Reihenfolge aller "foo" -Zeilen beibehalten, während sie aus dem Rest der Liste extrahiert wurden. (Dies wäre gleichbedeutend mit: 1G!GGmap!Ggrep foo<ENTER>1G:1,'a g/foo'/d (kopiere die Datei in ihren eigenen Schwanz, filtere den Schwanz durch grep und lösche alle Daten aus dem Kopf).

Um Zeilen normalerweise zu verbinden, kann ich ein Muster für alle Zeilen finden, die mit ihrem Vorgänger verbunden werden müssen (alle Zeilen, die beispielsweise in einigen Aufzählungszeichen mit "^" statt "^ *" beginnen). In diesem Fall würde ich verwenden: :% g/^ /-1j (für jede übereinstimmende Zeile gehen Sie eine Zeile nach oben und verbinden Sie sie). (Übrigens: Aufzählungslisten, die versuchen, nach Aufzählungslinien zu suchen und sich der nächsten anzuschließen, funktionieren aus mehreren Gründen nicht ... sie können eine Aufzählungslinie mit einer anderen verbinden, und sie verbinden keine Aufzählungslinie mit - all von seinen Fortsetzungen; es wird nur paarweise an den Spielen arbeiten).

Fast unnötig zu erwähnen, dass Sie unseren alten Freund s (Ersatz) mit den Befehlen g und v (global/converse-global) verwenden können. Normalerweise brauchen Sie das nicht zu tun. Betrachten Sie jedoch einen Fall, in dem Sie eine Ersetzung nur für Zeilen ausführen möchten, die mit einem anderen Muster übereinstimmen. Oft können Sie ein kompliziertes Muster mit Captures verwenden und Rückverweise verwenden, um die Teile der Linien zu erhalten, die Sie NICHT ändern möchten. Es ist jedoch oft einfacher, die Übereinstimmung von der Ersetzung zu trennen: :% g/foo/s/bar/zzz/g - Ersetzen Sie für jede Zeile mit "foo" alle "Balken" durch "zzz". (Etwas wie :% s/\(.*foo.*\)bar\(.*\)/\1zzz\2/g würde nur für die Fälle funktionieren, in denen "bar" in derselben Zeile vor "foo" steht. Es ist ungenügend und muss weiter entstellt werden, um alle Fälle zu erfassen, in denen "foo" vorkommt "bar" vor "foo")

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

Die : -Adressen können sich auch auf Marken beziehen. Sie können also :'a,'bg/foo/j verwenden, um eine beliebige Zeile, die den String foo enthält, mit der nachfolgenden Zeile zu verbinden, wenn sie zwischen den Zeilen zwischen 'a' und 'b liegt = 'markiert. (Ja, alle vorhergehenden ex Befehlsbeispiele können auf Teilmengen der Dateizeilen beschränkt werden, indem diese Arten von Adressierungsausdrücken vorangestellt werden.).

Das ist ziemlich dunkel (ich habe so etwas in den letzten 15 Jahren nur ein paar Mal benutzt). Ich gebe jedoch frei zu, dass ich oft Dinge iterativ und interaktiv getan habe, die wahrscheinlich effizienter hätten durchgeführt werden können, wenn ich mir die Zeit genommen hätte, die richtige Beschwörung zu überlegen.

Ein weiterer sehr nützlicher Befehl vi oder ex ist :r, um den Inhalt einer anderen Datei einzulesen. Also: :r foo fügt den Inhalt der Datei mit dem Namen "foo" in die aktuelle Zeile ein.

Stärker ist der Befehl :r!. Dies liest die Ergebnisse eines Befehls. Es ist dasselbe wie das Unterbrechen der vi Sitzung, Ausführen eines Befehls, Umleiten der Ausgabe in eine temporäre Datei und Fortsetzen der vi Sitzung. und Lesen der Inhalte aus dem Temp. Datei.

Noch mächtiger sind die Befehle ! (bang) und :... ! ( ex bang). Diese führen auch externe Befehle aus und lesen die Ergebnisse in den aktuellen Text ein. Sie filtern aber auch Textauswahlen über den Befehl! Damit können wir alle Zeilen in unserer Datei mit 1G!Gsort sortieren (G ist der vi "goto" -Befehl; standardmäßig wird zur letzten Zeile gewechselt der Datei, kann jedoch eine Zeilennummer vorangestellt werden (z. B. 1, die erste Zeile). Dies entspricht der ex Variante :1,$!sort. Schriftsteller verwenden häufig ! mit den Hilfsprogrammen Unix fmt oder fold zum Neuformatieren oder "Zeilenumbruch" von Text. Ein sehr verbreitetes Makro ist {!}fmt (formatieren Sie den aktuellen Absatz neu). Programmierer verwenden es manchmal, um ihren Code oder nur Teile davon mit indent oder anderen Code-Neuformatierungs-Tools auszuführen.

Mit den Befehlen :r! und ! kann jedes externe Dienstprogramm oder Filter als Erweiterung unseres Editors behandelt werden. Ich habe diese gelegentlich mit Skripten verwendet, die Daten aus einer Datenbank abgerufen haben, oder mit wget oder lynx Befehlen, die Daten von einer Website abgerufen haben , oder ssh Befehle, mit denen Daten von fernen Systemen abgerufen werden.

Ein weiterer nützlicher ex Befehl ist :so (kurz für :source). Dies liest den Inhalt einer Datei als eine Reihe von Befehlen. Wenn Sie vi starten, führt es normalerweise implizit einen :source für ~/.exinitrc file (und Vim aus Normalerweise geschieht dies auf ~/.vimrc (natürlich genug). Auf diese Weise können Sie Ihr Editorprofil im Handumdrehen ändern, indem Sie einfach eine Reihe neuer Makros, Abkürzungen und Editoreinstellungen eingeben. Wenn Sie sich nicht sicher sind, können Sie dies sogar als Trick verwenden, um Sequenzen von ex Bearbeitungsbefehlen zu speichern, die bei Bedarf auf Dateien angewendet werden.

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

(Die + Befehlszeilenoption für vi und Vim wird normalerweise verwendet, um die Editiersitzung in einer bestimmten Zeile zu starten Es ist jedoch eine wenig bekannte Tatsache, dass man dem + mit jedem gültigen ex Befehl/Ausdruck folgen kann, beispielsweise mit einem "source" -Befehl, wie ich es getan habe hier, für ein einfaches Beispiel habe ich Skripte, die aufrufen: vi +'/foo/d|wq!' ~/.ssh/known_hosts, um einen Eintrag aus meiner SSH-Datei bekannter Hosts nicht interaktiv zu entfernen, während ich eine Reihe von Servern erneut abbilde.

Normalerweise ist es viel einfacher, solche "Makros" mit Perl, AWK, sed (was in der Tat wie grep a ist Hilfsprogramm, inspiriert vom Befehl ed ).

Der @ Befehl ist wahrscheinlich der dunkelste vi Befehl. Während ich in den letzten zehn Jahren gelegentlich Kurse für fortgeschrittene Systemadministration unterrichtete, traf ich sehr wenige Leute, die sie jemals benutzt haben. @ führt den Inhalt eines Registers so aus, als wäre es ein vi oder ex Befehl.
Beispiel: Ich verwende häufig: :r!locate ..., um eine Datei auf meinem System zu finden und ihren Namen in mein Dokument einzulesen. Von dort lösche ich alle überflüssigen Treffer und lasse nur den vollständigen Pfad zu der Datei, die mich interessiert. Anstatt mühsam Tab-durchläuft jede Komponente des Pfads (oder schlimmer noch, wenn ich auf einem Computer ohne Unterstützung für die Tab-Vervollständigung in der Kopie von vi stecke), verwende ich einfach:

  1. 0i:r (um die aktuelle Zeile in einen gültigen : r Befehl umzuwandeln),
  2. "cdd (um die Zeile im "c" -Register 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, sodass ich ihn fast so schnell wie jedes gängige Wort mit sechs Buchstaben eingeben kann).


Ein ernüchternder Gedanke

Ich habe nur an der Oberfläche von vi 's Power gekratzt, und keines der hier beschriebenen ist auch nur ein Teil der "Verbesserungen", für die vim heißt! Alles, was ich hier beschrieben habe, sollte auf jeder alten Kopie von vi von vor 20 oder 30 Jahren funktionieren.

Es gibt Leute, die wesentlich mehr von vi 's Kraft verbraucht haben, als ich jemals werde.

2862
Jim Dennis

Sie sprechen über das Auswählen und Kopieren von Text. Ich denke, Sie sollten einen Blick auf Vim Visual Mode werfen.

Im visuellen Modus können Sie Text mit Vim-Befehlen auswählen und dann mit der Auswahl nach Belieben arbeiten.

Stellen Sie sich die folgenden allgemeinen Szenarien vor:

Sie müssen die nächste passende Klammer auswählen.

Du könntest es tun:

  • v% wenn sich der Cursor in der Anfangs-/Endeklammer befindet
  • 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 für geschweifte Klammern auswählen (sehr häufig in C-Sprachen):

  • 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, den Sie nur drücken müssen Ctrl-V um es zu starten, und wählen Sie dann den gewünschten Textblock aus und führen Sie eine beliebige Operation aus, wie z. B. Ziehen, Löschen, Einfügen, Bearbeiten usw. Es ist großartig, spaltenorientierten Text zu bearbeiten .

505
CMS

Einige Produktivitätstipps:

Intelligente Bewegungen

  • * und # suchen 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 an den Anfang/das Ende des aktuellen Wortes. (B/E nur durch Leerzeichen getrennt)
  • gg/G Zum Anfang/Ende der Datei springen.
  • % zum passenden {..} oder (..) springen, etc ..
  • {/} zum nächsten Absatz springen.
  • '. springe zurück zur zuletzt bearbeiteten Zeile.
  • g; springe zurück zur zuletzt bearbeiteten Position.

Schnellbearbeitungsbefehle

  • I am Anfang einfügen.
  • A an Ende anhängen.
  • o/O öffne eine neue Zeile nach/vor der aktuellen.
  • v/V/Ctrl+V visueller Modus (um Text auszuwählen!)
  • Shift+R Text ersetzen
  • C verbleibenden Teil der Zeile ändern.

Befehle kombinieren

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

  • cW = Änderung bis zum Ende von Word
  • 3cW = 3 Wörter ändern
  • BcW = Um mit dem vollständigen Wort zu beginnen, ändern Sie das vollständige Wort
  • ciW = Inneres Wort ändern.
  • ci" = wechsle zwischen ".."
  • ci( = Text zwischen (..) ändern
  • ci< = Ändert den Text zwischen <..> (benötigt set matchpairs+=<:> in vimrc)
  • 4dd = 4 Zeilen löschen
  • 3x = 3 Zeichen löschen.
  • 3s = 3 Zeichen ersetzen.

Nützliche Programmierbefehle

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

Makroaufnahme

  • Drücken Sie q[ key ], um die Aufnahme zu starten.
  • Drücken Sie dann q, um die Aufnahme zu stoppen.
  • Das Makro kann mit @[ key ] abgespielt werden.

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

Beispiel für gut gebaute 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 in ~/.vimrc oder systemweit in /etc/vimrc.local gespeichert und anschließend aus der Datei /etc/vimrc gelesen werden.

source /etc/vimrc.local

(Sie müssen das Kommentarzeichen # durch " ersetzen, damit es in VIM funktioniert. Ich wollte hier die richtige Syntax hervorheben.).

Die Befehle, die ich hier aufgelistet habe, sind ziemlich einfach und die wichtigsten, die ich bisher benutze. Sie machen mich schon viel produktiver, ohne dass ich all die ausgefallenen Dinge wissen muss.

207
vdboor

Das Control+R Mechanismus ist sehr nützlich :-) Fahren Sie entweder mit Einfügemodus oder Befehlsmodus (dh in der Zeile : beim Eingeben von Befehlen) mit einem nummerierten oder benannten Register fort :

  • a - z die genannten Register
  • " das unbenannte Register, das den Text des letzten Löschvorgangs enthält
  • % der aktuelle Dateiname
  • # der alternative Dateiname
  • * den Inhalt der Zwischenablage (X11: primäre Auswahl)
  • + den Inhalt der Zwischenablage
  • / das letzte Suchmuster
  • : die letzte Befehlszeile
  • . der zuletzt eingefügte Text
  • - das letzte kleine (weniger als eine Zeile) löschen
  • =5*5 füge 25 in den Text ein (Mini-Rechner)

Weitere Informationen finden Sie unter :help i_CTRL-R und :help c_CTRL-R. Weitere Informationen zu CTRL-R finden Sie in der Nähe.

98
kev

Vim Plugins

Hier gibt es viele gute Antworten und eine erstaunliche über den 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 alle möglichen verrückten Dinge gemacht werden können, die der ursprüngliche Autor nie in Betracht gezogen hat. Hier sind einige Beispiele für unglaublich nützliche Vim-Plugins:

Rails.vim

Rails.vim ist ein Plugin von tpope. Es ist ein unglaubliches Werkzeug für Leute, die Rails entwickeln. Es führt magische kontextsensitive Dinge aus, mit denen Sie einfach von einer Methode in einem Controller zur zugehörigen Ansicht, hinüber zu einem Modell und hinunter zu Komponententests für dieses Modell springen können. Es hat Dutzende, wenn nicht Hunderte von Stunden als Rails Entwickler gespart.

Gist.vim

Mit diesem Plugin können Sie eine Textregion im visuellen Modus auswählen und einen Schnellbefehl eingeben, um sie an Gist.github.com zu senden. 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 Analoges zur Zeit, wiederholt jedoch keine Aktionen, sondern Bewegungen. Dies kann sehr praktisch sein, um sich schnell in einer Datei zu bewegen, wie Sie es im Handumdrehen definieren.

surround.vim

Dieses Plugin gibt Ihnen die Möglichkeit, mit Text zu arbeiten, der in gewisser Weise begrenzt ist. Es gibt Ihnen Objekte, die Dinge innerhalb von Parens bezeichnen, Dinge innerhalb von Anführungszeichen usw. Es kann nützlich sein, um begrenzten Text zu manipulieren.

supertab.vim

Dieses Skript erweitert vim um eine ausgefallene Funktionalität zum Vervollständigen von Registerkarten. Das Autocomplete-Zeug ist bereits im Kern von vim vorhanden, aber dies bringt es zu einer schnellen Registerkarte, anstatt zu mehreren verschiedenen Multikey-Shortcuts. Sehr handlich und unglaublich spaßig zu bedienen. Obwohl es nicht VS 'Intellisense ist, ist es ein großer Schritt und bringt viel von der Funktionalität mit, die Sie von einem Tool zum Vervollständigen von Registerkarten erwarten würden.

syntastic.vim

Dieses Tool bringt Befehle zur externen Syntaxprüfung in vim. Ich habe es nicht persönlich benutzt, aber ich habe großartige Dinge darüber gehört und das Konzept ist schwer zu übertreffen. Das Überprüfen der Syntax ohne manuelle Eingriffe spart viel Zeit und hilft Ihnen dabei, syntaktische Fehler zu erkennen, wenn Sie sie einführen, anstatt sie endgültig zu testen.

fugitive.vim

Direkter Zugriff auf Git von innerhalb von Vim. Auch dieses Plugin habe ich nicht verwendet, aber ich kann das Dienstprogramm sehen. Leider bin ich in einer Kultur, in der svn als "neu" eingestuft wird, so dass ich wahrscheinlich für einige Zeit keinen Git bei der Arbeit sehen werde.

nerdtree.vim

Ein Baumbrowser für vim. Ich habe kürzlich damit angefangen, und es ist wirklich praktisch. Damit können Sie eine Baumansicht in eine vertikale Teilung einfügen und Dateien einfach öffnen. Dies ist ideal für ein Projekt mit vielen Quelldateien, zwischen denen Sie häufig wechseln.

FuzzyFinderTextmate.vim

Dies ist ein nicht gepflegtes Plugin, aber immer noch unglaublich nützlich. Es bietet die Möglichkeit, Dateien mit einer "unscharfen" beschreibenden Syntax zu öffnen. Dies bedeutet, dass Sie in einem spärlichen Dateibaum nur genügend Zeichen eingeben müssen, um die gewünschten Dateien vom Rest der Cruft zu unterscheiden.

Fazit

Es gibt eine Menge unglaublicher Tools für Vim. Ich bin sicher, ich habe hier nur die Oberfläche zerkratzt, und es lohnt sich, nach Tools zu suchen, die für Ihre Domain geeignet sind. Die Kombination aus dem leistungsstarken Toolset von traditionellem VI, den Verbesserungen von VIM und Plugins, die VIM noch weiter erweitern, ist eine der leistungsstärksten Möglichkeiten, Text zu bearbeiten, die jemals konzipiert wurden. Vim ist so mächtig wie Emacs, Eclipse, Visual Studio und Textmate.

Vielen Dank

Vielen Dank an duwanis für seine vim configs , von denen ich viel gelernt und die meisten der hier aufgelisteten Plugins ausgeliehen habe.

91
Benson

. Wiederholen Sie den letzten Textänderungsbefehl

Ich spare viel Zeit mit diesem.

Der visuelle Modus wurde bereits erwähnt, aber der visuelle Blockmodus hat mir beim Bearbeiten von Spalten mit fester Größe in einer Textdatei viel Zeit gespart. (Zugriff mit Strg-V).

53
Cooper6581

gi

Gehe zum zuletzt bearbeiteten Ort (sehr nützlich, wenn Sie eine Suche durchgeführt haben und dann wieder zum Bearbeiten zurückkehren möchten)

^ P und ^ N

Vervollständigen Sie den vorherigen (^ P) oder nächsten (^ N) Text.

^ O und ^ I

Gehe zum vorherigen (^O - "O" für alten) Ort oder zum nächsten (^I - "I" in der Nähe von "O"). Wenn Sie suchen, Dateien bearbeiten usw., können Sie durch diese "Sprünge" vorwärts und rückwärts navigieren.

48
dimba

Ich habe diese Seite kürzlich (entdeckt): http://vimcasts.org/

Es ist ziemlich neu und wirklich sehr gut. Der Typ, der die Site betreibt, wechselte von textmate zu vim und hostet sehr gute und prägnante Casts zu bestimmten vim-Themen. Hör zu!

46
Ronny Brendel

CTRL + A erhöht die Nummer, auf der Sie stehen.

42
hcs42

Alle im normalen Modus:

f <char> um zur nächsten Instanz eines bestimmten Zeichens in der aktuellen Zeile zu gelangen, und ; um zu wiederholen.

F <char> um zur vorherigen Instanz eines bestimmten Zeichens in der aktuellen Zeile zu springen und ; um zu wiederholen.

Bei einer intelligenten Verwendung können Sie sich mit den beiden oben genannten Methoden mörderisch schnell in einer Linie bewegen.

* in einem Wort, um nach der nächsten Instanz zu suchen.

# in einem Wort, um nach der vorherigen Instanz zu suchen.

38
Eric Smith

Session

ein. Sitzung speichern

: mks Sitzungsname

b. Sitzung speichern erzwingen

: mks! Sitzungsname

c. Sitzung laden

gvim oder vim -S Sitzungsname


Addieren und Subtrahieren

ein. Addieren und Subtrahieren

STRG-A; Fügen Sie der Zahl oder dem Buchstaben am oder nach dem Cursor [count] hinzu. nicht in Vi

STRG-X; Subtrahieren Sie [count] von der Zahl oder dem Buchstaben am oder nach dem Cursor. {nicht in Vi}

b. Zuordnung der Fenstertasten aufheben

Im Fenster ist Strg-A bereits für die gesamte Dateiauswahl zugeordnet. Sie müssen die Zuordnung in der RC-Datei aufheben. Markieren Sie mswin.vim STRG-A Mapping Part als Kommentar oder fügen Sie Ihre RC-Datei mit Unmap hinzu

c. Mit Makro

Der Befehl STRG-A ist in einem Makro sehr nützlich. Beispiel: Führen Sie die folgenden Schritte aus, um eine nummerierte Liste zu erstellen.

  1. Erstellen Sie den ersten Listeneintrag und vergewissern Sie sich, dass er mit einer Nummer beginnt.
  2. qa - Aufnahme in Puffer 'a' starten
  3. Y - Ziehe den Eintrag
  4. p - Kopieren Sie den Eintrag unter den ersten
  5. STRG-A - erhöht die Zahl
  6. q - Aufnahme beenden
  7. @a - Wiederholen Sie die Schritte "Ziehen", "Setzen" und "Inkrementieren"
34
agfe2

Letzte Woche bei der Arbeit hat unser Projekt viel Python Code von einem anderen Projekt geerbt. Leider passte der Code nicht in unsere vorhandene Architektur - alles wurde mit globalen Variablen und Funktionen ausgeführt, die in einer Umgebung mit mehreren Threads nicht funktionieren würden.

Wir hatten ~ 80 Dateien, die überarbeitet werden mussten, um objektorientiert zu sein - alle Funktionen wurden in Klassen verschoben, Parameter geändert, Importanweisungen hinzugefügt usw. Wir hatten eine Liste von etwa 20 Arten von Korrekturen, die für jede Datei durchgeführt werden mussten. Ich würde schätzen, dass eine Person, die es von Hand macht, vielleicht 2-4 pro Tag machen könnte.

Also habe ich das erste von Hand gemacht und dann ein vim-Skript geschrieben, um die Änderungen zu automatisieren. Das meiste davon war eine Liste von vim-Befehlen, z.

" delete an un-needed function "
g/someFunction(/ d

" add wibble parameter to function foo "
%s/foo(/foo( wibble,/

" convert all function calls bar(thing) into method calls thing.bar() "
g/bar(/ normal nmaf(ldi(`aPa.

Der letzte verdient eine Erklärung:

g/bar(/  executes the following command on every line that contains "bar("
normal   execute the following text as if it was typed in in normal mode
n        goes to the next match of "bar(" (since the :g command leaves the cursor position at the start of the line)
ma       saves the cursor position in mark a
f(       moves forward to the next opening bracket
l        moves right one character, so the cursor is now inside the brackets
di(      delete all the text inside the brackets
`a       go back to the position saved as mark a (i.e. the first character of "bar")
P        paste the deleted text before the current cursor position
a.       go into insert mode and add a "." 

Für ein paar komplexere Transformationen wie das Generieren aller import-Anweisungen habe ich python in das vim-Skript eingebettet.

Nach ein paar Stunden hatte ich ein Skript, das mindestens 95% der Konvertierung erledigt. Ich öffne einfach eine Datei in vim und führe dann :source fixit.vim aus. Die Datei wird in einem Augenblick transformiert.

Wir haben immer noch die Arbeit, die verbleibenden 5% zu ändern, die es nicht wert waren, automatisiert zu werden, und die Ergebnisse zu testen, aber indem wir einen Tag damit verbringen, dieses Skript zu schreiben, haben wir schätzungsweise Wochen an Arbeit gespart.

Natürlich wäre es möglich gewesen, dies mit einer Skriptsprache wie Python oder Ruby zu automatisieren, aber das Schreiben hätte viel länger gedauert und wäre weniger flexibel gewesen - das letzte Beispiel wäre schwierig gewesen, da allein Regex wäre nicht in der Lage, geschachtelte Klammern zu handhaben, z bar(foo(xxx)) in foo(xxx).bar() konvertieren. Vim war perfekt für die Aufgabe.

32
Dave Kirby

Verwenden Sie den eingebauten Datei-Explorer! Der Befehl ist :Explore und ermöglicht es Ihnen, sehr schnell durch Ihren Quellcode zu navigieren. Ich habe diese Zuordnung in meinem .vimrc:

map <silent> <F8>   :Explore<CR>
map <silent> <S-F8> :sp +Explore<CR>

Mit dem Explorer können Sie auch Dateiänderungen vornehmen. Ich poste einige meiner Lieblingstasten und drücke <F1>, um die vollständige Liste zu erhalten:

  • -: Am nützlichsten: Zum übergeordneten Verzeichnis wechseln (cd ..)
  • mf: Eine Datei markieren
  • D: Löscht markierte Dateien oder die Datei, auf der sich der Cursor befindet, wenn nichts markiert ist.
  • R: Benennt die Datei um, auf der sich der Cursor befindet.
  • d: Erstellt ein neues Verzeichnis im aktuellen Verzeichnis
  • %: Erstellt eine neue Datei im aktuellen Verzeichnis
28
soulmerge

Ich bin Mitglied der American Cryptogram Association. Das zweimonatliche Magazin enthält über 100 Kryptogramme verschiedener Art. Etwa 15 davon sind "Kryptarithmen" - verschiedene arithmetische Probleme, bei denen die Ziffern durch Buchstaben ersetzt werden. Zwei oder drei davon sind Sudokus, außer mit Buchstaben anstelle von Zahlen. Wenn das Gitter fertig ist, werden die neun verschiedenen Buchstaben ein Wort oder Wörter auf einer Linie, einer Diagonale, einer Spirale usw. irgendwo im Gitter buchstabieren.

Anstatt mit Bleistift zu arbeiten oder die Probleme manuell einzugeben, lade ich sie aus dem Mitgliederbereich ihrer Website herunter.

Bei der Arbeit mit diesen Sudokus verwende ich vi, einfach weil ich Funktionen verwende, die nur wenige andere Editoren von vi haben. Meistens beim Umwandeln des mit Buchstaben versehenen Gitters in ein nummeriertes Gitter, da ich es leichter zu lösen finde, und dann das fertig nummerierte Gitter wieder in das mit Buchstaben versehene Gitter, um die Lösung Word oder words zu finden.

Das Problem ist als neun Gruppen von neun Buchstaben formatiert, wobei -s die in zwei Zeilen geschriebenen Leerzeichen darstellen. Der erste Schritt besteht darin, diese in neun Zeilen mit jeweils neun Zeichen zu formatieren. Es gibt nichts Besonderes daran, nur acht Zeilenumbrüche an den entsprechenden Stellen einzufügen.

Das Ergebnis sieht dann so aus:

T-O-----C
-E-----S-
--AT--N-L
---NASO--
---E-T---
--SPCL---
E-T--OS--
-A-----P-
S-----C-T

Der erste Schritt bei der Umwandlung in Zahlen besteht darin, eine Liste der verschiedenen Buchstaben zu erstellen. Zuerst mache ich eine Kopie des Blocks. Ich positioniere den Cursor am oberen Rand des Blocks und gebe dann :y}}p ein. : versetzt mich in den Befehlsmodus, y drückt den nächsten Bewegungsbefehl. Da es sich bei } um eine Bewegung zum Ende des nächsten Absatzes handelt, zieht y} den Absatz an. } bewegt dann den Cursor an das Ende des Absatzes, und p fügt ein, was wir direkt nach dem Cursor gezogen hatten. Also erstellt y}}p eine Kopie des nächsten Absatzes und endet mit dem Cursor zwischen den beiden Kopien.

Als nächstes möchte ich eine dieser Kopien in eine Liste unterschiedlicher Buchstaben umwandeln. Dieser Befehl ist etwas komplexer:

:!}tr -cd A-Z | sed 's/\(.\)/\1\n/g' | sort -u | tr -d '\n'

: versetzt mich erneut in den Befehlsmodus. ! gibt an, dass der Inhalt des nächsten Ruckels über eine Befehlszeile geleitet werden soll. } ruckelt am nächsten Absatz, und die Befehlszeile verwendet dann den Befehl tr, um alle Zeichen außer Großbuchstaben zu entfernen, und den Befehl sed, um jeden Buchstaben in einer einzelnen Zeile zu drucken. und den Befehl sort, um diese Zeilen zu sortieren, doppelte Zeilen zu entfernen, und dann tr, um die neuen Zeilen zu entfernen, wobei die neun verschiedenen Buchstaben in einer einzigen Zeile verbleiben und die neun Zeilen ersetzen, aus denen der Absatz ursprünglich bestand. In diesem Fall lauten die Buchstaben: ACELNOPST.

Der nächste Schritt besteht darin, eine weitere Kopie des Rasters zu erstellen. Und dann, um die Buchstaben zu verwenden, die ich gerade identifiziert habe, um jeden dieser Buchstaben durch eine Ziffer von 1 bis 9 zu ersetzen. Das ist einfach: :!}tr ACELNOPST 0-9. Das Ergebnis ist:

8-5-----1
-2-----7-
--08--4-3
---4075--
---2-8---
--7613---
2-8--57--
-0-----6-
7-----1-8

Dies kann dann auf die übliche Weise gelöst oder in einen beliebigen Sudoku-Löser eingegeben werden, den Sie bevorzugen. Die fertige Lösung kann dann mit :!}tr 1-9 ACELNOPST wieder in Buchstaben umgewandelt werden.

In vi steckt eine Kraft, mit der nur sehr wenige andere mithalten können. Das größte Problem ist, dass nur sehr wenige der Lehrbücher, Websites, Hilfedateien usw. die Oberfläche des Möglichen kaum berühren.

25
Jeff Dege

Bulk-Text-Manipulationen!

Entweder über Makros:

  • Beginnen Sie mit der Aufnahme: qq
  • Sachen machen
  • Aufzeichnung beenden: q
  • Wiederholen Sie: @q (das erste Mal), @@ danach.
  • 20 mal wiederholen: [email protected]@

Oder durch reguläre Ausdrücke:

  • Sachen ersetzen: :%s/[fo]+/bar/g

(Aber sei gewarnt: wenn du das letztere machst, wirst du 2 Probleme haben :).)

23
jqno

Ich habe kürzlich q: entdeckt. Es öffnet das "Befehlsfenster" und zeigt Ihre letzten Ex-Mode (Befehlsmodus) -Befehle an. Sie können sich wie gewohnt innerhalb des Fensters bewegen und durch Drücken von <CR> den Befehl ausführen. Sie können auch usw. bearbeiten. Unbezahlbar, wenn Sie mit einem komplexen Befehl oder Regex herumspielen und nicht alles neu eingeben möchten oder wenn Sie nur 3 Befehle zurückgeben möchten. Es ist fast wie Bashs set -o vi, aber für vim selbst (heh!).

In :help q: finden Sie weitere interessante Informationen zum Hin- und Hergehen.

23
David Pope

Ich habe neulich gerade Vims Omnicompletion entdeckt, und obwohl ich zugeben muss, dass ich ein bisschen dunstig bin, was was tut, habe ich überraschend gute Ergebnisse erzielt, wenn ich auch nur püriere Ctrl + xCtrl + u oder Ctrl + n/Ctrl +p im Einfügemodus. Es ist nicht ganz IntelliSense , aber ich lerne es immer noch.

Versuch es! :help ins-completion

22
Svend

Dies sind keine Abkürzungen, aber sie hängen zusammen:

  1. Mach Capslock zu einem zusätzlichen ESC (oder Ctrl)
  2. map leader zu "," (Komma), mit diesem Befehl: let mapleader = ","

Sie steigern meine Produktivität.

20
tfmoraes

Eine andere nützliche vi "Verknüpfung", die ich häufig benutze, ist "xp". Dadurch wird das Zeichen unter dem Cursor durch das nächste Zeichen ersetzt.

19
Costyn

Visueller Modus

Der visuelle Modus ist die Antwort auf Ihr Problem mit dem Kopieren/Ausschneiden und Einfügen. Vim gibt dir 'v', 'V' und C-v. Kleinbuchstaben 'v' in vim entsprechen im Wesentlichen der Umschalttaste in Notepad. Das Schöne ist, dass Sie es nicht gedrückt halten müssen. Sie können jede Bewegungstechnik verwenden, um effizient zum Start- (oder Endpunkt) Ihrer Auswahl zu navigieren. Drücken Sie dann 'v' und verwenden Sie erneut effiziente Bewegungstechniken, um zum anderen Ende Ihrer Auswahl zu navigieren. Mit 'd' oder 'y' können Sie diese Auswahl ausschneiden oder kopieren.

Der Vorteil, den der visuelle Modus von vim gegenüber der Beschreibung von Jim Dennis für das Ausschneiden/Kopieren/Einfügen in vi hat, ist, dass Sie die Position nicht genau festlegen müssen. Manchmal ist es effizienter, mit einer schnellen Bewegung in die allgemeine Umgebung zu gelangen, in die Sie gehen möchten, und diese dann mit anderen Bewegungen zu verfeinern, als sich einen komplexeren Einzelbewegungsbefehl auszudenken, der Sie genau dahin bringt, wohin Sie wollen.

Der Nachteil der umfassenden Verwendung des visuellen Modus auf diese Weise besteht darin, dass er zu einer Krücke werden kann, die Sie die ganze Zeit über verwenden. Auf diese Weise können Sie keine neuen vi (m) -Befehle lernen, mit denen Sie möglicherweise effizienter arbeiten können. Wenn Sie jedoch sehr proaktiv sind, um neue Aspekte von vi (m) zu lernen, hat dies wahrscheinlich keinen großen Einfluss auf Sie.

Ich werde auch noch einmal betonen, dass der visuelle Linien- und der visuelle Blockmodus Ihnen Variationen desselben Themas bieten, die sehr mächtig sein können ... insbesondere den visuellen Blockmodus.

Zur effizienten Verwendung der Tastatur

Ich bin auch nicht einverstanden mit Ihrer Behauptung, dass abwechselnde Hände der schnellste Weg sind, die Tastatur zu benutzen. Es enthält ein Element der Wahrheit. Ganz allgemein gesagt, ist die wiederholte Verwendung derselben Sache langsam. Das wichtigste Beispiel für dieses Prinzip ist, dass aufeinanderfolgende Tastenanschläge, die mit demselben Finger getippt werden, sehr langsam sind. Ihre Behauptung beruht wahrscheinlich auf der natürlichen Tendenz, die s/finger/hand/transformation für dieses Muster zu verwenden. Bis zu einem gewissen Grad ist es richtig, aber am extrem hohen Ende des Wirkungsgradspektrums ist es falsch.

Fragen Sie einfach einen Pianisten. Fragen Sie sie, ob es schneller ist, mehrere Noten abwechselnd zu spielen oder aufeinanderfolgende Finger einer Hand nacheinander zu verwenden. Der schnellste Weg, um 4 Tastenanschläge einzugeben, besteht nicht darin, die Hände zu wechseln, sondern sie mit 4 Fingern derselben Hand in aufsteigender oder absteigender Reihenfolge einzugeben (nennen Sie dies einen "Lauf"). Dies sollte selbstverständlich sein, wenn Sie über diese Möglichkeit nachgedacht haben.

Das schwierigere Problem ist die Optimierung dafür. Es ist ziemlich einfach, die absolute Entfernung auf der Tastatur zu optimieren. Vim macht das. Es ist viel schwieriger, auf der "Run" -Ebene zu optimieren, aber vi (m) mit seiner modalen Bearbeitung gibt Ihnen eine bessere Chance, dies zu tun, als es ein nicht-modaler Ansatz (ahem, emacs) jemals könnte.

Auf Emacs

Damit die Emacs-Fanatiker meinen ganzen Beitrag wegen dieses letzten Klammerkommentars nicht völlig außer Acht lassen, muss ich die Wurzel des Unterschieds zwischen den Emacs- und den Vim-Religionen beschreiben. Ich habe noch nie in den Editor-Kriegen gesprochen und ich werde es wahrscheinlich nicht wieder tun, aber ich habe noch nie jemanden gehört, der die Unterschiede auf diese Weise beschreibt. Der Unterschied ist der folgende Kompromiss:

Vim bietet Ihnen eine unübertroffene Effizienz bei der Bearbeitung von Rohtext. Emacs bietet Ihnen die unübertroffene Fähigkeit, den Editor anzupassen und zu programmieren

Die blinden Vim-Fanatiker behaupten, dass Vim eine Skriptsprache hat. Aber es ist eine obskure Ad-hoc-Sprache, die für den Herausgeber entwickelt wurde. Emacs hat LISP! Genug gesagt. Wenn Sie die Bedeutung der letzten beiden Sätze nicht schätzen oder genug über funktionale Programmierung und LISP lernen möchten, um diese Wertschätzung zu entwickeln, sollten Sie vim verwenden.

Die Emacs-Eiferer werden behaupten, dass der Emacs den Viper-Modus hat und es sich somit um eine Obermenge von Vim handelt. Der Viper-Modus ist jedoch nicht Standard. Meines Wissens nach wird der Viper-Modus von den meisten Emacs-Benutzern nicht verwendet. Da dies nicht die Standardeinstellung ist, werden die meisten Emacs-Benutzer die Vorteile des modalen Paradigmas wahrscheinlich nicht richtig einschätzen.

Meiner Meinung nach sind diese Unterschiede orthogonal. Ich glaube, dass die Vorteile von vim und emacs, wie ich bereits sagte, beide gültig sind. Dies bedeutet, dass der ultimative Editor noch nicht existiert. Es ist wahrscheinlich richtig, dass Emacs die einfachste Plattform ist, auf der der ultimative Editor basieren kann. Die modale Bearbeitung ist jedoch nicht in der Denkweise des Emacs verankert. Die Emacs-Community könnte sich in Zukunft so bewegen, aber das scheint nicht sehr wahrscheinlich zu sein.

Wenn Sie also Rohdaten bearbeiten möchten, verwenden Sie vim. Wenn Sie die ultimative Umgebung zum Skripten und Programmieren Ihres Editors benötigen, verwenden Sie emacs. Wenn Sie beides mit Schwerpunkt auf Programmierbarkeit möchten, verwenden Sie Emacs mit Viper-Modus (oder programmieren Sie Ihren eigenen Modus). Wenn Sie das Beste aus beiden Welten wollen, haben Sie vorerst Pech.

18
user307058

<Strg> + W, V, um den Bildschirm vertikal zu teilen
<Strg> + W, W, um zwischen den Fenstern zu wechseln

! python% [args], um das Skript auszuführen, das ich in diesem Fenster bearbeite

ZF im visuellen Modus zum Falten beliebiger Linien

18
Peter Ellis

Verbringen Sie 30 Minuten mit dem vim-Tutorial (führen Sie vimtutor anstelle von vim im Terminal aus). Sie lernen die Grundbewegungen und einige Tastenanschläge kennen. Dadurch sind Sie mit vim mindestens so produktiv wie mit dem zuvor verwendeten Texteditor. Lesen Sie danach die Antwort von Jim Dennis noch einmal :)

17
konryd

Ich war überrascht, dass niemand die t Bewegung erwähnte. Ich benutze es häufig mit Parameterlisten in Form von dt, oder yt,

16
David Corbin

Seltsamerweise hat niemand Ctags erwähnt. Laden Sie "exuberant ctags" herunter und setzen Sie es der beschissenen vorinstallierten Version voran, die Sie bereits in Ihrem Suchpfad haben. CD an die Wurzel dessen, woran Sie gerade arbeiten; Zum Beispiel die Android Kernel-Distribution. Geben Sie "ctags -R" ein. Erstellen eines Indexes von Quelldateien unterhalb dieses Verzeichnisses in einer Datei mit dem Namen "tags". Dies enthält alle Tags, weder die Sprache noch die Position im Verzeichnis, in einer Datei, sodass die sprachübergreifende Arbeit einfach ist.

Öffnen Sie dann vim in diesem Ordner und lesen Sie: help ctags für einige Befehle. Ein paar, die ich oft benutze:

  • Stellen Sie den Cursor auf einen Methodenaufruf und geben Sie STRG-] ein, um zur Methodendefinition zu gelangen.

  • Geben Sie: ta name ein, um zur Definition des Namens zu gelangen.

16
Bradjcox

Verwenden Sie \c an einer beliebigen Stelle in einer Suche, um Groß-/Kleinschreibung zu ignorieren (überschreiben Sie Ihre Einstellungen für Groß-/Kleinschreibung oder Smartcase). Z.B. /\cfoo oder /foo\c stimmen mit foo, Foo, fOO, FOO usw. überein.

Verwenden Sie \C überall in einer Suche, um die Übereinstimmung von Groß- und Kleinschreibung zu erzwingen. Z.B. /\Cfoo oder /foo\C stimmen nur mit foo überein.

16
kev

Wie setzen Sie Vim ein, um produktiver zu sein als mit einem modernen Editor?

Komplexe, sich wiederholende Bearbeitungen mit wenigen Tastenanschlägen ausführen zu können (häufig mit Makros ). Schauen Sie sich VimGolf an, um die Kraft von Vim zu erleben!

Nach über zehn Jahren fast täglicher Nutzung ist es kaum vorstellbar, einen anderen Editor zu verwenden.

16
Johnsyweb

Sie haben nach produktiven Verknüpfungen gefragt, aber ich denke, Ihre eigentliche Frage lautet: Lohnt sich vim? Die Antwort auf diese Stackoverflow-Frage lautet -> "Ja"

Sie müssen zwei Dinge bemerkt haben. Vim ist mächtig und Vim ist schwer zu lernen. Ein Großteil der Leistung liegt in der Erweiterbarkeit und der endlosen Kombination von Befehlen. Fühle dich nicht überwältigt. Mach langsam. Jeweils ein Befehl, ein Plugin. Übertreib es nicht.

All diese Investitionen, die Sie in vim stecken, werden sich tausendfach auszahlen. Du wirst viele, viele Stunden in einem Texteditor sein, bevor du stirbst. Vim wird dein Begleiter sein.

14
autodidakto

Automatischer Einzug:

gg (zum Anfang des Dokuments gehen)
= (Einrückungszeit!)
shift-g (zum Ende des Dokuments)

Sie benötigen in Ihrer .vimrc -Datei einen Einzug für das Dateityp-Plug-in sowie wahrscheinlich die entsprechenden Einstellungen für "Shiftwidth" und "Expandtab".

14
David Claridge

Mehrere Puffer, und insbesondere das schnelle Wechseln zwischen ihnen, um zwei Dateien mit :bp und :bn zu vergleichen (ordnungsgemäß einer einzelnen neu zugeordnet) Shift + p oder Shift + n)

vimdiff -Modus (Aufteilung in zwei vertikale Puffer mit Farben, um die Unterschiede anzuzeigen)

Bereichskopie mit Ctrl + v

Und schließlich die Tab-Vervollständigung von Bezeichnern (Suche nach "mosh_tab_or_complete"). Das verändert das Leben.

13
Stefano Borini

Mit dem oberen Poster einverstanden - der Befehl : r! ist sehr nützlich.

Am häufigsten benutze ich es, um Dinge "einzufügen":

:r!cat
**Ctrl-V to paste from the OS clipboard**
^D

Auf diese Weise muss ich nicht mit :set paste herumspielen.

12
David Wolever

cit - Leeren Sie den Inhalt des Tags mit dem Übergang im Einfügemodus

yit - kopiere den Inhalt des Tags

10
Sanek

Ein drittes Kriterium für eine schnellere Bearbeitung ist die Anzahl der erforderlichen Tastenanschläge. Ich würde sagen, dies ist wichtiger als Ihre anderen 2. In vim erfordern fast alle Operationen weniger Tastenanschläge als jeder andere mir vertraute Editor.

Sie erwähnen, dass Sie Probleme beim Ausschneiden und Einfügen haben, aber es scheint, dass Sie mehr Erfahrung mit allgemeinen Bewegungsbefehlen in vim benötigen. 3 Wörter ziehen: y3w vom Cursor zum nächsten Semikolon ziehen: yf; Ruck zu dem nächsten Vorkommen Ihrer letzten Suche: Alle sind viel schneller als der Versuch, mit einer Maus zu navigieren, während Sie eine Modifikatortaste gedrückt halten. Wie in einigen Beispielen in der Antwort von CMS zu sehen ist, sind die Bewegungsbefehle von vim in hohem Maße für eine effiziente Navigation in C- und C++ - Quellcode optimiert.

Bei der Frage "Wie verwende ich vim, das mich produktiver macht?" Hoffe ich, dass die Antwort "effizient" lautet.

10
William Pursell

Mein produktivster vi/Vim-Trick ist:

:%s

Ich liebe es, reguläre Ausdrücke im laufenden Betrieb verwenden zu können, um alles zu ersetzen, was ich in der Datei haben möchte. Jeder Texteditor sollte IMHO reguläre Ausdrücke unterstützen.

10

Sie können\= in einer Ersetzungszeichenfolge verwenden und das mache ich immer wieder.

Wenn Sie eine ungeordnete Liste in vim haben, z. B. # als Markierung, können Sie sie in eine geordnete Liste umwandeln.

# CSSLINT
# PHPCS
# Charlie
# Delta

Wenn es in der ersten Zeile beginnt, können Sie dies tun

:1,6s/#/\=line(".")/g

Um es zu konvertieren

1 CSSLINT
2 PHPCS
3 Charlie
4 Delta

Wenn es nicht in der ersten Zeile startet, rechnen Sie einfach nach:

:16,20s/#/\=line(".") - 15/g

Weitere Informationen unter: help sub-replace-expression

10
kguest

Hier ist eine andere Seite , die ich hilfreich fand, um Vim zu lernen. Es macht auch Spaß! :)

VIM Adventures ist ein Online-Spiel, das auf den Tastaturkürzeln (Befehle, Bewegungen und Operatoren) von VIM basiert. Es ist das Spiel "Zelda trifft Textbearbeitung". Es ist ein Puzzlespiel zum Üben und Auswendiglernen von VIM Befehlen (gutes altes VI wird natürlich auch behandelt). Es ist ein einfacher Weg, VIM ohne steile Lernkurve zu lernen.

9
Alex Lockwood

Nach der Zuordnung des Folgenden zu einer einfachen Tastenkombination sind die folgenden Punkte für mich sehr nützlich:

Springen Sie über den Pfad in eine Datei

gf

ermittelt den vollständigen Pfadnamen der vorhandenen Datei

:r!echo %:p

verzeichnis der vorhandenen Datei abrufen

:r!echo %:p:h

code ausführen:

:!Ruby %:p

Ruby-Abkürzungen:

ab if_do if end<esc>bi<cr><esc>xhxO
ab if_else if end<esc>bi<cr><esc>xhxO else<esc>bhxA<cr> <esc>k$O
ab meth def method<cr>end<esc>k<esc>:s/method/
ab klas class KlassName<cr>end<esc>k<esc>:s/KlassName/
ab mod module ModName<cr>end<esc>k<esc>:s/ModName/

aktuelles Programm ausführen:

   map ,rby :w!<cr>:!Ruby %:p<cr>

überprüfen Sie die Syntax des aktuellen Programms:

   map ,c :w!<cr>:!Ruby -c %:p<cr>

führen Sie alle Spezifikationen für das aktuelle Spezifikationsprogramm aus:

   map ,s :w!<cr>:!rspec %:p<cr>

knack es auf irb:

   map ,i :w!<cr>:!irb<cr>

rspec Abkürzungen:

   ab shared_examples shared_examples_for "behavior here" do<cr>end
   ab shared_behavior describe "description here" do<cr>  before :each do<cr>end<cr>it_should_behave_like "behavior here"<cr><bs>end<cr>
   ab describe_do describe "description here" do<cr>end
   ab context_do describe "description here" do<cr>end
   ab it_do it "description here" do<cr>end
   ab before_each before :each do<cr>end<cr>

Rails Abkürzungen:

benutzerauthentifizierung:

     ab userc <esc>:r $VIMRUNTIME/Templates/Ruby/c-users.rb<cr>
     ab userv <esc>:r $VIMRUNTIME/Templates/Ruby/v-users.erb<cr>
     ab userm <esc>:r $VIMRUNTIME/Templates/Ruby/m-users.rb<cr>

visuell ausgewählte URL in Firefox öffnen:

"function
   function open_url_in_firefox:(copy_text)
     let g:open_url_in_firefox="silent !open -a \"firefox\" \"".a:copy_text."\""
     exe g:open_url_in_firefox
   endfunction

"abbreviations
   map ,d :call open_url_in_firefox:(expand("%:p"))<cr>
   map go y:call open_url_in_firefox:(@0)<cr> 

rspec: führe die Spezifikation mit der aktuellen Zeile aus:

"function
   function run_single_rspec_test:(the_test)
     let g:rake_spec="!rspec ".a:the_test.":".line(".")
     exe g:rake_spec
   endfunction

"abbreviations
   map ,s :call run_single_rspec_test:(expand("%:p"))<cr>

rspec-Rails: führe die Spezifikation aus, die die aktuelle Zeile enthält:

"function
   function run_single_Rails_rspec_test:(the_test)
     let g:rake_spec="!rake spec SPEC=\"".a:the_test.":".line(".")."\""
     exe g:rake_spec
   endfunction

"abbreviations
   map ,r :call run_single_Rails_rspec_test:(expand("%:p"))<cr>

rspec-Rails: führe die Spezifikation mit der aktuellen Zeile mit Debugging aus:

"function
   function run_spec_containing_current_line_with_debugging:(the_test)
     let g:rake_spec="!rake spec SPEC=\"".a:the_test.":".line(".")." -d\""
     exe g:rake_spec
   endfunction

"abbreviations
   map ,p :call run_spec_containing_current_line_with_debugging:(expand("%:p")) <cr>

html

"abbreviations

  "ab htm <html><cr><tab><head><cr></head><cr><body><cr></body><cr><bs><bs></html>
   ab template_html <script type = 'text/template' id = 'templateIdHere'></script>
   ab script_i <script src=''></script>
   ab script_m <script><cr></script>
   ab Tpage <esc>:r ~/.vim/templates/pageContainer.html<cr>
   ab Ttable <esc>:r ~/.vim/templates/listTable.html<cr>

"function to render common html template

   function html:() 
     call feedkeys( "i", 't' )
     call feedkeys("<html>\<cr>  <head>\<cr></head>\<cr><body>\<cr> ", 't')
     call feedkeys( "\<esc>", 't' )
     call feedkeys( "i", 't' )
     call include_js:()
     call feedkeys("\<bs>\<bs></body>\<cr> \<esc>hxhxi</html>", 't')
   endfunction

javascript

"jasmine.js
  "abbreviations
   ab describe_js describe('description here', function(){<cr>});
   ab context_js context('context here', function(){<cr>});
   ab it_js it('expectation here', function(){<cr>});
   ab expect_js expect().toEqual();
   ab before_js beforeEach(function(){<cr>});
   ab after_js afterEach(function(){<cr>});

"function abbreviations

   ab fun1 function(){}<esc>i<cr><esc>ko
   ab fun2 x=function(){};<esc>hi<cr>
   ab fun3 var x=function(){<cr>};

"method for rendering inclusion of common js files

   function include_js:()
     let includes_0  = "  <link   type = 'text\/css' rel = 'stylesheet' href = '\/Users\/johnjimenez\/common\/stylesheets\/jasmine-1.1.0\/jasmine.css'\/>"
     let includes_1  = "  <link   type = 'text\/css' rel = 'stylesheet' href = '\/Users\/johnjimenez\/common\/stylesheets\/screen.css'\/>"
     let includes_2  = "<script type = 'text\/javascript' src = '\/Users\/johnjimenez\/common\/javascripts\/jquery-1.7.2\/jquery-1.7.2.js'><\/script>"
     let includes_3  = "<script type = 'text\/javascript' src = '\/Users\/johnjimenez\/common\/javascripts\/underscore\/underscore.js'><\/script>"
     let includes_4  = "<script type = 'text\/javascript' src = '\/Users\/johnjimenez\/common\/javascripts\/backbone-0.9.2\/backbone.js'><\/script>"
     let includes_5  = "<script type = 'text\/javascript' src = '\/Users\/johnjimenez\/common\/javascripts\/jasmine-1.1.0\/jasmine.js'><\/script>"
     let includes_6  = "<script type = 'text\/javascript' src = '\/Users\/johnjimenez\/common\/javascripts\/jasmine-1.1.0\/jasmine-html.js'><\/script>"
     let includes_7  = "<script>"
     let includes_8  = "  describe('default page', function(){ "
     let includes_9  = "it('should have an html tag', function(){ "
     let includes_10 = "  expect( $( 'head' ).html() ).not.toMatch(\/^[\\s\\t\\n]*$\/);"
     let includes_11  = "});"
     let includes_12 = "});"
     let includes_13 = "$(function(){"
     let includes_14 = "jasmine.getEnv().addReporter( new jasmine.TrivialReporter() );"
     let includes_15 = "jasmine.getEnv().execute();"
     let includes_16 = "});"
     let includes_17 = "\<bs>\<bs><\/script>"

     let j = 0

     while j < 18
       let entry = 'includes_' . j
       call feedkeys( {entry}, 't' )
       call feedkeys( "\<cr>", 't' )
       let j = j + 1
     endwhile

   endfunction

"jquery

  "abbreviations

     ab docr $(document).ready(function(){});
     ab jqfun $(<cr>function(){<cr>}<cr>);
9
kikuchiyo
Ctrl-w Ctrl-f ............ open file under cursor in new window
Ctrl-6 ................... alternate file
'0 ....................... open last file
:x ....................... close if save
7
SergioAraujo

Einfügen von Text in ein Bit im Code:

ctrl + v, (selecting text on multiple lines), I, (type something I want), ESC

Aufzeichnen eines Makros zum Bearbeiten von Text und N-malige Ausführung:

q, a (or some other letter), (do the things I want to record), q, ESC,
(type N, as in the number of times I want to run the macro), @, a
7
Vesa Nieminen

Ignoriere die Frage für einen Moment (meine Antwort ist unten), ein paar Dinge, die bei deinen Problemen mit vim helfen könnten:

:map <C-F> /\V

Dies veranlasst Ctrl-F, eine Suche mit den ersten Zeichen der Suche zu starten, die \V ist, was die ganze 'Magie' ausschaltet, so dass Sie nichts entkommen müssen (genau wie PsPad).

" CTRL-X and SHIFT-Del are Cut
vnoremap <C-X> "+x
vnoremap <S-Del> "+x

" CTRL-C and CTRL-Insert are Copy
vnoremap <C-C> "+y
vnoremap <C-Insert> "+y

" CTRL-V and SHIFT-Insert are Paste
map <C-V>       "+gP
map <S-Insert>      "+gP

cmap <C-V>      <C-R>+
cmap <S-Insert>     <C-R>+

(direkt aus mswin.vim aus der Vim-Distribution entnommen). Dadurch erhalten Sie Strg-C, Strg-V usw. zum Kopieren und Einfügen.

Persönlich finde ich das Kopieren und Einfügen mit dem Standard-Vim viel besser. In Vim kann ich den Cursor auf eine Zeile setzen und yy eingeben, um sie zu kopieren, 10p, um 10 Kopien davon einzufügen. Mit dem Align Plugin kann ich dann Ctrl-V verwenden (vorausgesetzt, die obigen Fensterzuordnungen werden nicht verwendet), um eine Spalte mit Zahlen, die erstellt wurden, visuell zu blockieren. :II erhöht diese Zahlenspalte dann automatisch. In ähnlicher Weise kann ich mit YankRing 10 (oder mehr) Zeilen nacheinander kopieren und sie dann nacheinander wieder einfügen.

In Bezug auf die Art und Weise, wie Vim mich produktiver macht, würde ich sagen, dass die Tags-Datei das ist, worauf ich nicht mehr verzichten könnte. Wenn sich der Cursor über einem Tag befindet, kann ich Ctrl-] drücken, um zur Funktion zu gelangen (und Strg-T, um so viele Ebenen zurückzukehren, wie ich möchte) oder ,p, um die Funktions- oder Makrodefinition zu öffnen ( oder was auch immer) im Vorschaufenster (das dann schnell geschlossen werden kann mit: pcl) oder [i, um nur eine Makrodefinition in der Statusleiste anzuzeigen. Für die Navigation in komplexem Quellcode sind diese Tools von unschätzbarem Wert.

Das Vorschaufenster basiert jedoch auf einem Mapping in .vimrc:

:map ,p :ptag <C-R><C-W><CR>

Die Tags-Datei ermöglicht auch die Verwendung einiger (meiner) Plugins, die eine Syntax-Hervorhebung bieten, die Fehler deutlicher anzeigt (indem erkannte Tags hervorgehoben und nicht erkannte Tags hervorgehoben werden) und Tag-Signaturen , wenn Sie das Symbol verschieben Bewegen Sie die Maus über ein Schlüsselwort.

7
DrAl

http://www.viemu.com/a-why-vi-vim.html ist ein guter Advocacy-Artikel. Es erklärt die Macht der Verwendung der . Befehl, um die letzte Bearbeitung zu wiederholen.

Kopieren/Ausschneiden & Einfügen. Das mache ich die ganze Zeit. Bei allen klassischen Editoren drücken Sie die Umschalttaste mit der linken Hand und bewegen den Cursor mit der rechten Hand, um Text auszuwählen. Dann Ctrl + C kopiert, Sie bewegen den Cursor und Ctrl + V fügt ein.

Mit Vim ist es schrecklich:

* yy to copy one line (you almost never want the whole line!)
* [number xx]yy to copy xx lines into the buffer. But you never know

genau, wenn Sie ausgewählt haben, was Sie wollten. Ich muss oft [Nummer xx] machen, dann machst du es rückgängig!

Ich bin sicher, die anderen Antworten haben es besser erklärt, aber Sie tun es falsch. Ich verwende oft den visuellen Modus, um Text zum Reißen oder Löschen auszuwählen, ähnlich wie in Ihrem Beispiel mit Umschalt + Auswahl. Vim hat hier jedoch einen klaren Vorteil, da Ihre Hände niemals die Startreihe verlassen, um dies zu tun. yy ist ein großartiger Befehl, aber ich mache oft Vy, wenn ich eine ganze Zeile reißen will.

6
Dan Olson

Insbesondere für Kopieren/Ausschneiden und Einfügen erleichtert die Verwendung des visuellen Modus die Anpassung von anderen Editoren. Normalerweise schneide ich also wie folgt aus:

  • Esc - Einfügemodus verlassen (Überspringen, wenn Sie sich bereits im normalen Modus befinden)
  • v - Visuellen Modus einschalten
  • bewegen Sie sich durch die Datei, um den gewünschten Text auszuwählen. Im visuellen Modus werden die ausgewählten Zeichen angezeigt. Für ein paar Wörter sind w, e und b nützlich (bewegen Sie sich zum Anfang des nächsten Wortes, zum Ende des nächsten Wortes bzw. zum Anfang dieses/vorherigen Wortes).
  • d - Schneiden Sie den Text aus (verwenden Sie y, wenn Sie den Text kopieren möchten)
  • bewegen Sie sich dorthin, wo Sie den Text haben möchten
  • p - Einfügen (wird nach dem aktuellen Zeichen eingefügt, P wird vor dem aktuellen Zeichen eingefügt.

Ebenfalls nützlich ist die Verwendung von V, um in den visuellen Modus (Zeile) zu wechseln, in dem ganze Zeilen automatisch ausgewählt werden, wo immer sich der Cursor auf der Zeile befindet.

6
Hamish Downer

Wie wäre es mit weiteren Verknüpfungen?


In deine .vimrc einfügen:
nnoremap;:

Auf diese Weise ist die Eingabe des Befehlsmodus viel einfacher: ;q oder ;w funktionieren, stattdessen nur :q oder :w.

Zwei statt drei Tastenanschläge, und das werden Sie sehr oft brauchen.


Schlecht für Sysadmins , da sie die gleiche Funktionalität benötigen, um überall auf jeder Box gleich zu sein.

Aber eine RIESIGE Verbesserung für Programmierer mit vi.

5
sjas

Eigentlich habe ich immer meine Puffer verloren. Normalerweise kopiere ich also eine Reihe von Zeilen, indem ich sie einfach in eine temporäre Datei schreibe und sie dann an der entsprechenden Stelle einlese.

z.B.

ka (setze die Marke)

'ein,. w! t (alles von der Marke in die Datei t kopieren)

.. bewegen Sie den Cursor herum ..

: .r t (lese t in den aktuellen Punkt ein).

Dies erfordert wahrscheinlich weniger Tastenanschläge als die Verwendung des Puffers, ist einfacher nachzuverfolgen und es können langlebige Einfügedateien vorhanden sein. Ich benutze normalerweise Namen mit 1 Buchstaben für die Akten, für Geschwindigkeit.

Der Hauptgrund für die Schnelligkeit ist, dass Sie zum Bewegen des Cursors einfach die Suchfunktion "/" und "n" verwenden, wenn Sie auf ein anderes Vorkommen des Musters stoßen, bevor Sie das gewünschte Ziel erreichen.

5
Larry Watanabe

Sie können den Inhalt eines Registers durchsuchen.

Angenommen, Ihr Register x enthält

zeichenfolge zum Suchen

Um diese Zeichenfolge zu durchsuchen, müssen Sie den normalen Modus eingeben
/CTRL-rxENTER

Der Inhalt des Registers x wird eingefügt.

4
Luc M

Zusätzlich zu der großartigen Antwort auf das Grokking von vi sollte beachtet werden, dass vim does einige sehr vi-ähnliche Funktionen hinzufügt, die die Verwendung von vi-Befehlen angenehmer machen. Was zuerst in den Sinn kommt, sind Textobjekte: Statt {!}fmt, um den aktuellen Absatz neu zu formatieren, macht !apfmt dasselbe. Es funktioniert, indem Sie zuerst angeben, dass Sie das Textobjekt a auswählen möchten. Dies ist das aktuelle Absatz. Ähnlich, um das aktuelle Zeichenfolgenliteral (foo in bar für ein Beispiel) anstelle von T"ct"bar zu ändern (gehen Sie zu direkt nach dem vorherigen ", change bis kurz vor dem nächsten ", Einfügen Balken) können Sie ci"bar sagen: Ändern Sie in (innersten) Anführungszeichen, Einfügen Balken .

Anstelle von Bewegungsbefehlen in Textobjekten zu denken, ist ganz nett.

4
wolverian

Es gibt jede Menge Vim-Tricks, aber die, die ich wirklich genieße, sind ab sofort Ctrl+A da ich zufällig mit etwas st ** d Code zu tun habe, der den Array-Index fest codiert.

3
lang2

Die Reihe der vim-Befehle ggVGg? wendet eine Rot13-Chiffre auf den Text in Ihrem aktuellen Dokument an.

Gung vf zl zbfg cebqhpgvir fubegphg fvapr V nyjnlf glcr va Ebg13.

3
cytinus

Schnelles Ausschneiden und Überschreiben eines Teils einer Zeile:

Eine sehr häufige Aufgabe beim Bearbeiten einer Zeile besteht darin, von der aktuellen Cursorposition bis zu einer bestimmten Stelle zu schneiden und den neuen Inhalt zu überschreiben.

Sie können die folgenden Befehle verwenden:

ct<identifier> zum Vorwärtsschneiden.

cT<identifier> zum Rückwärtsschneiden.

Wo ist das Zeichen in der Zeile, bis zu der Sie schneiden möchten.

Beispiel: Sagen wir, dass sich die zu bearbeitende Zeile und Ihr Cursor auf I befindet.

Hi There. I am a Coder and I code in : Python and R.

Sie möchten bis : schneiden und mit I am a programmer überschreiben, geben Sie ct: ein und dann I am a programmer. Dies führt zu: Hi There. I am a programmer: Python and R.

Teil einer Zeile schnell löschen:

Genau wie oben löschen die folgenden Befehle den Inhalt von der aktuellen Cursorposition bis zum 'Bezeichner'.

dt<identifier> zum Weiterleiten von Löschvorgängen

dT<identifier> zum Löschen in Rückwärtsrichtung

Hoffe, das ist auch für Sie nützlich.

2
dabsingh
1
David Lam

nnoremap q; q: in meiner .vimrc-Datei behält den Fluss bei, wenn eine komplizierte Suche und Ersetzung erstellt wird.

0
sjas