Was ist Ihre produktivste Verknüpfung mit Vim?

1126

Ich habe viel über Vim gehört , sowohl Vor- als auch Nachteile. 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 tun, und ich bin bestenfalls zehnmal weniger produktiv mit Vim.

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

  1. Die Verwendung der linken und rechten Hand ist die schnellste Möglichkeit, die Tastatur zu verwenden.
  2. Niemals die Maus zu berühren ist der zweite Weg, um so schnell wie möglich zu sein. Es dauert ewig, bis Sie Ihre Hand bewegen, die Maus greifen, sie bewegen und zur Tastatur zurückbringen (und Sie müssen häufig auf die Tastatur schauen, um sicherzustellen, dass Sie Ihre Hand wieder richtig an die richtige Stelle gebracht haben).

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

Kopieren / Ausschneiden & Einfügen. Das mache ich die ganze Zeit. Bei allen modernen Editoren drücken Sie Shift mit der linken Hand und bewegen den Cursor mit der rechten Hand, um Text auszuwählen. Dann Ctrl+ Ckopieren, bewegen Sie den Cursor und Ctrl+ Vfügen ein.

Mit Vim ist es schrecklich:

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

Ein anderes Beispiel? Suchen und ersetzen.

  • Geben Sie im PSPad : Ctrl+ ein, fwonach Sie suchen möchten, und drücken Sie dann Enter.
  • Geben /Sie in Vim: das ein , wonach Sie suchen möchten. Wenn \vor jedem Sonderzeichen einige Sonderzeichen stehen , drücken Sie Enter.

Und alles mit Vim ist so: Ich weiß anscheinend nicht, wie ich richtig damit umgehen soll.

NB: Ich habe bereits die Vim gelesen Cheat Blatt :)

Meine Frage ist:

Wie verwenden Sie Vim, das Sie produktiver macht als mit einem zeitgenössischen Editor?

Olivier Pons
quelle
"Die Verwendung der Tastatur abwechselnd mit der linken und rechten Hand ist der schnellste Weg." Seltsamerweise nicht für mich. Wenn ich ein Wort mit einer Hand eingeben kann, bin ich viel schneller.
Ben Mordecai

Antworten:

2860

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

Sie erwähnen das Schneiden mit yyund beschweren sich, dass Sie fast nie ganze Linien schneiden wollen. Tatsächlich möchten Programmierer, die Quellcode bearbeiten, sehr oft ganze Zeilen, Zeilenbereiche und Codeblöcke bearbeiten. Es yyist 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. Die Initiale yist ein Verb. Die Aussage yyist ein Synonym für y_. Das ywird verdoppelt, um die Eingabe zu vereinfachen, da es sich um eine so übliche Operation handelt.

Dies kann auch ausgedrückt werden als dd P(Löschen der aktuellen Zeile und Einfügen einer Kopie an die richtige Stelle; Belassen einer Kopie im anonymen Register als Nebeneffekt). Die yund d"Verben" nehmen jede Bewegung als ihr "Subjekt". Somit yWist "von hier (der Cursor) bis zum Ende des aktuellen / nächsten (großen) Wortes ziehen" und y'a"von hier bis zur Zeile mit der Markierung" a "ziehen".

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 Syntaxhervorhebung und die Möglichkeit, Dateien zu verarbeiten, die größer als etwa 45 KB sind; aber arbeiten Sie hier mit mir zusammen).

vi hat 26 "Markierungen" und 26 "Register". Mit dem mBefehl wird eine Markierung auf eine beliebige Cursorposition gesetzt . Jede Marke ist durch einen einzelnen Kleinbuchstaben gekennzeichnet. Somit masetzt die ‚ eine ‘ Markierung der aktuellen Position und mzsetzt die ‚ z ‘ Zeichen. Mit dem 'Befehl (in einfachen Anführungszeichen) können Sie zu der Zeile mit einer Markierung wechseln . Bewegt 'asich also an den Anfang der Zeile mit der Markierung ' a '. Mit dem `Befehl (backquote) können Sie zur genauen Position einer beliebigen Markierung wechseln . Dadurch `zwird direkt an die genaue Position der ' z' -Markierung verschoben .

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

Eine Möglichkeit, eine beliebige Textauswahl auszuschneiden, besteht darin, eine Markierung zu löschen (normalerweise verwende ich " a " als "erste" Markierung, " z " als nächste Markierung, " b " als andere und " e " als noch eine (ich erinnere mich nicht, dass ich in 15 Jahren mit vi jemals mehr als vier Markierungen interaktiv verwendet habe ; man erstellt seine eigenen Konventionen darüber, wie Markierungen und Register von Makros verwendet werden, die den interaktiven Kontext nicht stören). Dann geht es los zum anderen Ende unseres gewünschten Textes, wir können an beiden Enden beginnen, es spielt keine Rolle. Dann können wir einfach d`azum Ausschneiden oder y`aKopieren verwenden. Somit hat der gesamte Prozess 5 Tastenanschläge (sechs, wenn wir mit "Einfügen" begonnen haben ""Modus und benötigtEscout 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 eines von vielen. Häufig können wir den Textbereich prägnanter beschreiben, ohne den Cursor zu bewegen und eine Markierung fallen zu lassen. Zum Beispiel , wenn ich in einem Absatz des Textes bin ich verwenden kann , {und }jeweils an den Anfang oder das Ende des Absatzes Bewegungen. Um einen Textabschnitt zu verschieben, schneide ich ihn mit { d}(3 Tastenanschlägen). (Wenn ich mich gerade in der ersten oder letzten Zeile des Absatzes befinde, kann ich einfach d}oder d{verwenden.

Der Begriff "Absatz" verwendet standardmäßig etwas, was normalerweise intuitiv sinnvoll 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 markiert, an dem wir interessiert sind. Vorwärts oder rückwärts suchen sind Bewegungen in vi . Somit können sie auch als "Subjekte" in unseren "Aussagen" verwendet werden. So kann ich d/foovon der aktuellen Zeile zur nächsten Zeile mit der Zeichenfolge "foo" schneiden und y?barvon der aktuellen Zeile in die letzte (vorherige) Zeile mit "bar" kopieren. Wenn ich keine ganzen Zeilen möchte, kann ich trotzdem die Suchbewegungen (als eigene Anweisungen) verwenden, meine Markierung (en) löschen und die `xBefehle wie zuvor beschrieben verwenden.

Neben "Verben" und "Subjekten" hat vi auch "Objekte" (im grammatikalischen Sinne des Wortes). Bisher habe ich nur die Verwendung des anonymen Registers beschrieben. Allerdings kann ich eine der 26 „Namen“ Register verwenden , indem prefixing das „Objekt“ Referenz mit "(der doppelten Anführungszeichen Modifikator). Also wenn ich verwende "addich die aktuelle Zeile in die ‚cutting a ‘ registrieren und wenn ich "by/foodann eine Kopie des Textes von hier in die nächste Zeile ich zerren „foo“ in die ‚enthalten , b ‘ registrieren. Um aus einem Register einzufügen, stelle ich dem Einfügen einfach dieselbe Modifikatorsequenz voran: "apFügt eine Kopie des Registers ' a ' ein."bPFügt eine Kopie von ' b ' bis vor die aktuelle Zeile ein.

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

Dies ist alles Zwischenstufe 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 selten Makros schreiben müssen, da die Textbearbeitungssprache ausreichend präzise und ausdrucksstark ist, um die meisten Dinge mit der "Muttersprache" des Editors leicht genug zu erledigen.


Eine Auswahl fortgeschrittener Tricks:

Es gibt eine Reihe von :Befehlen, insbesondere die :% s/foo/bar/gglobale Substitutionstechnik. (Das ist nicht fortgeschritten, aber andere :Befehle können sein). Der gesamte :Befehlssatz wurde historisch von den früheren Inkarnationen von vi als Dienstprogramme ed (Zeileneditor) und später ex (erweiterter Zeileneditor) geerbt. 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 Zeit geschrieben, in der Terminalbildschirme ungewöhnlich waren und viele Terminals "Telety Type" (TTY) -Geräte waren. Daher war es üblich, aus gedruckten Kopien des Textes mit Befehlen über eine extrem knappe Oberfläche zu arbeiten (übliche Verbindungsgeschwindigkeiten waren 110 Baud oder ungefähr 11 Zeichen pro Sekunde - was langsamer ist als bei einem schnellen Schreibkraft; Verzögerungen waren häufig interaktive Sitzungen für mehrere Benutzer (zusätzlich gab es häufig eine gewisse Motivation, Papier zu sparen).

Die Syntax der meisten :Befehle enthält daher eine Adresse oder einen Adressbereich (Zeilennummer), gefolgt von einem Befehl. Natürlich könnte man wörtliche Zeilennummern verwenden: :127,215 s/foo/barum 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 bzw. letzte Zeilen verwenden. Man könnte auch relative Präfixe verwenden +und -sich auf Offsets nach bzw. vor der aktuellen Linie beziehen. Also: :.,$jbedeutet "von der aktuellen bis zur letzten Zeile, füge sie alle zu einer Zeile zusammen". :%ist gleichbedeutend mit :1,$(allen Zeilen).

Die Befehle :... gund sind :... verklärungsbedürftig, da sie unglaublich mächtig sind. :... gist ein Präfix für "global", das einen nachfolgenden Befehl auf alle Zeilen anwendet, die einem Muster entsprechen (regulärer Ausdruck), während ein :... vsolcher Befehl auf alle Zeilen angewendet wird, die NICHT mit dem angegebenen Muster übereinstimmen ("v" von "conVerse"). Wie bei anderen ex- Befehlen können diesen Adress- / Bereichsreferenzen vorangestellt werden. Dies :.,+21g/foo/dbedeutet "alle Zeilen löschen, die die Zeichenfolge" foo "enthalten, von der aktuellen bis zu den nächsten 21 Zeilen", während :.,$v/bar/d"von hier bis zum Ende der Datei alle Zeilen löschen, die die Zeichenfolge" bar "NICHT enthalten.

Es ist interessant, dass der allgemeine Unix-Befehl grep tatsächlich von diesem Ex- Befehl inspiriert wurde (und nach der Art und Weise benannt ist, in der er dokumentiert wurde). 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 :pBefehl einer der ersten, die jemand gelernt hat, und oft der erste, der beim Bearbeiten einer Datei verwendet wurde. Auf diese Weise haben Sie den aktuellen Inhalt gedruckt (normalerweise nur jeweils eine Seite mit :.,+25poder einem ähnlichen Inhalt ).

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

Wir können mLinien verschieben und jLinien verbinden. Wenn Sie beispielsweise eine Liste haben und alle übereinstimmenden (oder umgekehrt NICHT mit einem Muster übereinstimmenden) Elemente trennen möchten, ohne sie zu löschen, können Sie Folgendes verwenden: :% g/foo/m$... und alle "foo" -Zeilen wurden verschoben das Ende der Datei. (Beachten Sie den anderen Tipp zur Verwendung des Endes Ihrer Datei als Arbeitsbereich). Dadurch bleibt die relative Reihenfolge aller "foo" -Zeilen erhalten, 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(Kopieren Sie die Datei in ihren eigenen Schwanz, filtern Sie den Schwanz durch grepund löschen Sie alle Inhalte aus dem Kopf).

Um Linien normalerweise zu verbinden, kann ich ein Muster für alle Linien finden, die mit ihrem Vorgänger verbunden werden müssen (zum Beispiel alle Linien, die in einer Aufzählungsliste mit "^" anstelle von "^ *" beginnen). In diesem Fall würde ich Folgendes verwenden: :% g/^ /-1j(Gehen Sie für jede übereinstimmende Zeile eine Zeile nach oben und verbinden Sie sie). (Übrigens: Bei Aufzählungslisten funktioniert der Versuch, nach Aufzählungslinien zu suchen und mit der nächsten zu verbinden, aus mehreren Gründen nicht. Es kann eine Aufzählungslinie mit einer anderen verbinden und es wird keine Aufzählungslinie mit allen verknüpft seine Fortsetzung; es wird nur paarweise bei den Spielen funktionieren).

Fast unnötig zu erwähnen, dass Sie unseren alten Freund s(Ersatz) mit den Befehlen gund v(global / converse-global) verwenden können. Normalerweise müssen Sie dies nicht tun. Stellen Sie sich jedoch einen Fall vor, in dem Sie eine Ersetzung nur für Zeilen durchfü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 beizubehalten, 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, die "foo" enthält, alle "Balken" durch "zzz". (Etwas wie:% s/\(.*foo.*\)bar\(.*\)/\1zzz\2/gwürde nur für die Fälle funktionieren, in denen "bar" in derselben Zeile von "foo" vorangestellt wurde; es ist schon unansehnlich genug und müsste weiter verstümmelt werden, um alle Fälle zu erfassen, in denen "bar" vor "foo" stand)

Der Punkt ist , dass es mehr als nur p, sund dLinien in dem exBefehlssatz.

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

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 iterativ und interaktiv Dinge getan habe, die wahrscheinlich effizienter hätten erledigt werden können, wenn ich mir die Zeit genommen hätte, die richtige Beschwörung auszudenken.

Ein weiterer sehr nützlicher Befehl vi oder ex ist :rdas Einlesen des Inhalts einer anderen Datei. Also: :r foofügt den Inhalt der Datei mit dem Namen "foo" in die aktuelle Zeile ein.

Stärker ist der :r!Befehl. Dies liest die Ergebnisse eines Befehls. Dies entspricht dem Unterbrechen der vi- Sitzung, dem Ausführen eines Befehls, dem Umleiten der Ausgabe in eine temporäre Datei, dem Fortsetzen der vi- Sitzung und dem Einlesen des Inhalts aus der temporären Datei . 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 jedoch auch eine Auswahl unseres Textes über den Befehl! Auf diese Weise können wir alle Zeilen in unserer Datei mit sortieren 1G!Gsort( Gist der Befehl vi "goto"; standardmäßig wird zur letzten Zeile der Datei gewechselt, es kann jedoch eine Zeilennummer vorangestellt werden, z. B. 1, die erste Zeile). Dies entspricht der Ex- Variante :1,$!sort. Autoren verwenden häufig !die Unix- Dienstprogramme fmt oder fold , um Textauswahlen neu zu formatieren oder in Zeilenumbrüche umzuwandeln . Ein sehr verbreitetes Makro ist{!}fmt(Formatieren Sie den aktuellen Absatz neu). Programmierer verwenden es manchmal, um ihren Code oder nur Teile davon durch Einrückungen oder andere Tools zur Neuformatierung des Codes auszuführen.

Die Verwendung der Befehle :r!und !bedeutet, dass jedes externe Dienstprogramm oder jeder externe Filter als Erweiterung unseres Editors behandelt werden kann. Ich habe diese gelegentlich mit Skripten verwendet, die Daten aus einer Datenbank abgerufen haben , oder mit wget- oder lynx- Befehlen, mit denen Daten von einer Website abgerufen wurden , oder mit ssh- Befehlen, mit denen Daten von Remote-Systemen abgerufen wurden.

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 implizit eine :sourceOn- ~/.exinitrcDatei aus (und Vim führt dies normalerweise ~/.vimrcnatürlich ein). Dies dient dazu, dass Sie Ihr Editorprofil im laufenden Betrieb ändern können, indem Sie einfach neue Makros, Abkürzungen und Editoreinstellungen eingeben. Wenn Sie hinterhältig sind, können Sie dies sogar als Trick zum Speichern von Sequenzen von Ex- Bearbeitungsbefehlen verwenden, die bei Bedarf auf Dateien angewendet werden.

Zum Beispiel habe ich eine siebenzeilige Datei (36 Zeichen), die eine Datei über wc ausführt und oben in der Datei, die diese Wortzählungsdaten enthält , einen Kommentar im C-Stil einfügt. Ich kann dieses "Makro" mit einem Befehl wie dem folgenden auf eine Datei anwenden:vim +'so mymacro.ex' ./mytarget

(Die +Befehlszeilenoption für vi und Vim wird normalerweise verwendet, um die Bearbeitungssitzung bei einer bestimmten Zeilennummer zu starten. Es ist jedoch wenig bekannt, dass man +jedem gültigen ex- Befehl / Ausdruck folgen kann , z. B. einem "Quell" -Befehl als Ich habe es hier getan: Für ein einfaches Beispiel habe ich Skripte, die Folgendes aufrufen: vi +'/foo/d|wq!' ~/.ssh/known_hostsum einen Eintrag aus meiner SSH-Datei für bekannte Hosts nicht interaktiv zu entfernen, während ich eine Reihe von Servern neu abbilde).

Normalerweise ist es viel einfacher, solche "Makros" mit Perl, AWK, sed zu schreiben (was in der Tat wie grep ein Dienstprogramm ist, das vom Befehl ed inspiriert ist ).

Der @Befehl ist wahrscheinlich der dunkelste vi- Befehl. Ich habe fast ein Jahrzehnt lang gelegentlich Kurse für fortgeschrittene Systemadministration unterrichtet und nur sehr wenige Leute getroffen, die es 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 aus lösche ich alle überflüssigen Treffer und lasse nur den vollständigen Pfad zu der Datei, an der ich interessiert bin. Anstatt mühsam Tabdurch jede Komponente des Pfads zu blättern (oder schlimmer noch, wenn ich zufällig auf einem Computer ohne Unterstützung für die Tab-Vervollständigung stecke in seiner Kopie von vi ) benutze ich nur:

  1. 0i:r(um die aktuelle Zeile in einen gültigen : r- Befehl umzuwandeln ),
  2. "cdd (um die Zeile in das "c" -Register zu löschen) und
  3. @c Führen Sie diesen Befehl aus.

Das sind nur 10 Tastenanschläge (und der Ausdruck "cdd @cist für mich praktisch ein Fingermakro, sodass ich ihn fast so schnell eingeben kann wie jedes übliche Wort aus sechs Buchstaben).


Ein ernüchternder Gedanke

Ich habe nur an die Oberfläche von vi gekratzt und nichts von dem, was ich hier beschrieben habe, ist auch nur ein Teil der "Verbesserungen", nach denen vim benannt ist! 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 Macht verbraucht haben als ich jemals.

Jim Dennis
quelle
440
Heilige Code-Affen, ... das ist eine ausführliche Antwort. Was großartig ist, ist, dass Sie wahrscheinlich in ungefähr 10 Tastenanschlägen in vim geschrieben haben.
EightyOne Unite
48
@Wahnfieden - grok ist genau das, was ich gemeint habe: en.wikipedia.org/wiki/Grok (Es ist anscheinend sogar in der OED - das, was wir Anglophone einem kanonischen Lexikon am nächsten haben). Um einen Editor zu "groken", müssen Sie seine Befehle fließend verwenden ... als ob sie Ihre natürliche Sprache wären.
Jim Dennis
22
Wow, eine sehr gut geschriebene Antwort! Ich konnte nicht mehr zustimmen, obwohl ich den @Befehl q
oft benutze
63
Hervorragende Antwort, die eine wirklich schreckliche Frage völlig löst. Ich werde diese Frage, die ich normalerweise ablehnen würde, positiv bewerten, damit diese Antwort leichter zu finden ist. (Und ich bin ein Emacs-Typ! Aber auf diese Weise kann ich neue Leute aufzeigen, die eine gute Erklärung dafür wünschen, was vi-Power-User an vi Spaß machen. Dann erzähle ich ihnen von Emacs und sie können entscheiden.)
Brandon Rhodes
8
Können Sie eine Website erstellen und dieses Tutorial dort platzieren, damit es hier beim Stackoverflow nicht vergraben wird? Ich habe noch keine bessere Einführung in vi als diese gelesen.
Marko
504

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

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

Betrachten Sie die folgenden allgemeinen Szenarien:

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

Du könntest es tun:

  • v% wenn sich der Cursor in der Start- / Endklammer 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 geschweiften Klammerblock auswählen (sehr häufig in Sprachen im C-Stil):

  • viB
  • vi{

Sie möchten die gesamte Datei auswählen:

  • ggVG

Visuelle Blockauswahl eine andere wirklich nützliche Funktion ist, ermöglicht es Ihnen einen rechteckigen Bereich von Text zu markieren, müssen Sie nur noch zu drücken Ctrl- um Ves zu starten, und wählen Sie dann den Textblock Sie wollen , und jede Art von Operation auszuführen wie Yank, löschen, Einfügen, Bearbeiten usw. Es ist großartig, spaltenorientierten Text zu bearbeiten .

CMS
quelle
2
Jeder Editor hat so etwas, es ist nicht spezifisch für vim.
Finnw
22
Ja, aber es war eine spezifische Beschwerde des Plakats. Der visuelle Modus ist Vims beste Methode zur direkten Auswahl und Bearbeitung von Text. Und da die Pufferüberquerungsmethoden von vim hervorragend sind, finde ich die Textauswahl in vim ziemlich angenehm.
Waffen
9
Ich denke, es ist auch erwähnenswert, Strg-V zu erwähnen, um einen Block auszuwählen - dh ein beliebiges Rechteck aus Text. Wenn Sie es brauchen, ist es ein Lebensretter.
Hamish Downer
6
@ Viksit: Ich benutze Camtasia, aber es gibt viele Alternativen: Codinghorror.com/blog/2006/11/screencasting-for-windows.html
CMS
3
Wenn Sie eine visuelle Auswahl haben und diese anpassen möchten, springen Sie ozum anderen Ende. Sie können also den Anfang und das Ende der Auswahl beliebig verschieben.
Nathan Long
207

Einige Produktivitätstipps:

Intelligente Bewegungen

  • *und #suchen Sie 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/ ezum Anfang / Ende des aktuellen Wortes. ( B/ nur Efür Leerzeichen getrennt)
  • gg/ Gspringe zum Anfang / Ende der Datei.
  • % springe zu den passenden {..} oder (..), etc ..
  • {Ich }springe zum nächsten Absatz.
  • '. Springe zurück zur zuletzt bearbeiteten Zeile.
  • g; Zurück zur zuletzt bearbeiteten Position springen.

Schnelle Bearbeitungsbefehle

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

Befehle kombinieren

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

  • cW = bis zum Ende des Wortes ändern
  • 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" = inneres wechseln zwischen ".."
  • ci( = Text ändern zwischen (..)
  • ci<= Text zwischen <..> ändern (Bedürfnisse set matchpairs+=<:>in vimrc)
  • 4dd = 4 Zeilen löschen
  • 3x = 3 Zeichen löschen.
  • 3s = 3 Zeichen ersetzen.

Nützliche Programmierbefehle

  • rErsetzen Sie ein Zeichen (z. B. rdersetzt 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)
  • == Fix Line Indent
  • > Einrückungsblock (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 beenden.
  • Das Makro kann mit gespielt werden @[ key ].

Durch die Verwendung sehr spezifischer Befehle und Bewegungen kann VIM genau diese Aktionen für die nächsten Zeilen wiedergeben. (zB A zum Anhängen an Ende, b/ eum 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 ~/.vimrcoder systemweit in gespeichert /etc/vimrc.localund dann aus der /etc/vimrcDatei gelesen werden, indem:

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 verwende. Sie machen mich schon ziemlich produktiver, ohne all das schicke Zeug kennen zu müssen.

vdboor
quelle
4
Besser als es '.ist g;, was durch die zurückspringt changelist. Geht zur zuletzt bearbeiteten Position anstelle der zuletzt bearbeiteten Zeile
naught101
98

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

  • a- zdie genannten Register
  • " das unbenannte Register, das den Text des letzten Löschens oder Ruckelns enthält
  • % der aktuelle Dateiname
  • # der alternative Dateiname
  • * den Inhalt der Zwischenablage (X11: Primärauswahl)
  • + den Inhalt der Zwischenablage
  • / das letzte Suchmuster
  • : die letzte Kommandozeile
  • . der zuletzt eingefügte Text
  • - das letzte kleine (weniger als eine Zeile) löschen
  • =5*5 25 in Text einfügen (Mini-Rechner)

Sehen :help i_CTRL-Rund :help c_CTRL-Rfür weitere Einzelheiten und schnüffelt in der Nähe für mehr STRG + R Güte.

kev
quelle
10
Zu Ihrer Information, dies bezieht sich auf Strg + R im Einfügemodus . Im normalen Modus wird Strg + R wiederholt.
Vdboor
2
+1 für aktuellen / alternativen Dateinamen. Control-AFunktioniert auch im Einfügemodus für zuletzt eingefügten Text und Control-@zum Einfügen des zuletzt eingefügten Textes und zum sofortigen Umschalten in den normalen Modus.
Aryeh Leib Taurog
91

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 es alle möglichen verrückten Dinge macht, an die der ursprüngliche Autor nie gedacht hat. Hier sind einige Beispiele für unglaublich praktische Vim-Plugins:

Rails.vim

Rails.vim ist ein Plugin von tpope. Es ist ein unglaubliches Werkzeug für Leute, die Schienen entwickeln. Es führt magische kontextsensitive Dinge aus, mit denen Sie problemlos von einer Methode in einem Controller zur zugehörigen Ansicht, zu einem Modell und 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 einen Textbereich im visuellen Modus auswählen und einen Schnellbefehl eingeben , um ihn auf gist.github.com zu veröffentlichen . 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 Periode, aber anstatt Aktionen zu wiederholen, werden Bewegungen wiederholt. Dies kann sehr praktisch sein, um schnell durch eine Datei zu navigieren, wie Sie sie im laufenden Betrieb definieren.

Surround.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 usw. bezeichnen. Es kann nützlich sein, um abgegrenzten Text zu bearbeiten.

supertab.vim

Dieses Skript bietet vim ausgefallene Funktionen zur Vervollständigung von Registerkarten. Das Autocomplete-Zeug befindet sich bereits im Kern von vim, aber dies bringt es zu einer schnellen Registerkarte und nicht zu mehreren verschiedenen Multikey-Verknüpfungen. Sehr praktisch und macht unglaublich viel Spaß. Es ist zwar nicht VS 'Intellisense, aber es ist ein großartiger Schritt und bietet einen Großteil der Funktionen, die Sie von einem Tab-Vervollständigungstool erwarten würden.

syntastic.vim

Dieses Tool bringt externe Befehle zur 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 dies manuell tun zu müssen, spart viel Zeit und kann Ihnen helfen, syntaktische Fehler zu erkennen, wenn Sie sie einführen, anstatt wenn Sie den Test endgültig beenden.

fugitive.vim

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

nerdtree.vim

Ein Baumbrowser für vim. Ich habe vor kurzem damit angefangen und es ist wirklich praktisch. Sie können damit eine Baumansicht vertikal aufteilen 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 Dateien, an denen Sie interessiert sind, vom Rest der Cruft zu unterscheiden.

Fazit

Es gibt viele unglaubliche 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 gelten. 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, der jemals konzipiert wurde. Vim ist genauso leistungsfähig wie Emacs, Eclipse, Visual Studio und Textmate.

Vielen Dank

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

Benson
quelle
Die magische Navigation zwischen Tests und Klassen in Rails.vim ist eines der allgemeineren Dinge, von denen ich mir wünschte, Vim hätte TextMate in allen Sprachen absolut nageln können: Wenn ich an Person.scala arbeite und Cmd + T mache, ist dies normalerweise das erste in der Liste ist PersonTest.scala.
Tom Morris
5
Ich denke, es ist Zeit, dass FuzzyFinderTextmate durch github.com/wincent/Command-T
Gavin Gilmour ersetzt wird.
2
+1 für Syntastic. In Kombination mit JSLint ist mein Javascript dadurch weniger fehleranfällig geworden. Siehe superuser.com/questions/247012/... wie JSLint zur Arbeit mit Syntastic einzurichten.
Nathan Long
1
@Benson Tolle Liste! Ich würde auch snipMate einwerfen . Sehr hilfreiche Automatisierung gängiger Codierungsaufgaben. if <tab> sofort wenn block, etc.
AlG
2
Ich denke, Nerdcommenter ist auch ein gutes Plugin: hier . Wie der Name schon sagt, dient es zum Kommentieren Ihres Codes.
Stephan
53

. 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 viel Zeit beim Bearbeiten von Spalten mit fester Größe in Textdateien gespart. (Zugriff mit Strg-V).

Cooper6581
quelle
3
Wenn Sie den Text mit einem präzisen Befehl (z. B. A zum Anhängen am Ende) bearbeiten, kann vim genau dieselbe Aktion für die nächste Zeile wiederholen, in der Sie die .Taste drücken .
vdboor
48

gi

Zum zuletzt bearbeiteten Speicherort wechseln (sehr nützlich, wenn Sie eine Suche durchgeführt haben und dann zur Bearbeitung zurückkehren möchten)

^ P und ^ N.

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

^ O und ^ I.

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

dimba
quelle
4
@Kungi `. bringt Sie zur letzten Bearbeitung `` bringt Sie zurück zu der Position, an der Sie sich vor dem letzten 'Sprung' befanden - die / könnte / auch die Position der letzten Bearbeitung sein.
Grant McLean
46

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

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

Ronny Brendel
quelle
3
Wenn Sie Vim-Tutorials mögen, sehen Sie sich auch die Vim-Videos von Derek Wyatt an . Sie sind ausgezeichnet.
Jeromy Anglim
42

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

hcs42
quelle
19
... und STRG-X-Dekremente.
InnaM
9
Es ist eine nette Abkürzung, aber bisher habe ich NIE eine Verwendung dafür gefunden.
SolutionYogi
8
Wenn Sie vim auf dem Bildschirm ausführen und sich fragen, warum dies nicht funktioniert - Strg + A, A
Matja
13
@SolutionYogi: Beachten Sie, dass Sie am Anfang jeder Zeile eine Zeilennummer hinzufügen möchten. Lösung: ggI1 <Leerzeichen> <esc> 0qqyawjP0 <ca> 0q9999 @ q
hcs42
10
Sehr nützlich bei Vimperator, wo die letzte Zahl in der URL erhöht (oder verringert, Strg-X) wird. Nützlich für schnelles Surfen durch Bildergalerien usw.
blau am
38

Alles im normalen Modus:

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

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

Bei intelligenter Verwendung können Sie sich mit den beiden oben genannten schnell in einer Linie bewegen.

* auf ein Wort, um nach der nächsten Instanz zu suchen.

# auf ein Wort, um nach der vorherigen Instanz zu suchen.

Eric Smith
quelle
6
Whoa, ich wusste nichts über die Bindung * und # (vorwärts / rückwärts nach Wort unter dem Cursor suchen). Das ist irgendwie cool. Die f / F und t / T und; Befehle sind schnelle Sprünge zu Zeichen in der aktuellen Zeile. f / F setzt den Cursor auf das angegebene Zeichen, während t / T ihn nur "auf" das Zeichen setzt (das Zeichen unmittelbar davor oder danach gemäß der gewählten Richtung; wiederholt einfach das letzte f / F / t / T. Sprung (in die gleiche Richtung).
Jim Dennis
10
:) Der Slogan oben auf der Seite mit den Tipps auf vim.org: "Können Sie sich vorstellen, wie viele Tastenanschläge hätten gespeichert werden können, wenn ich den Befehl" * "nur rechtzeitig gekannt hätte?" - Jürgen Salk, 19.01.2001 "
Yewge
1
Wie Jim erwähnte, ist die "t / T" -Kombination oft genauso gut, wenn nicht sogar besser, ct(löscht sie beispielsweise das Wort und versetzt Sie in den Einfügemodus, aber behalten Sie die Klammern!
Puk
34

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 [count] zur Zahl oder zum alphabetischen Zeichen am oder nach dem Cursor hinzu. {nicht in Vi

STRG-X; Subtrahiere [Anzahl] von der Zahl oder dem alphabetischen Zeichen am oder nach dem Cursor. {nicht in Vi}

b. Aufheben der Zuordnung von Fenstertasten

Im Fenster ist Strg-A bereits für die Auswahl der gesamten Datei zugeordnet, die Sie in der RC-Datei entfernen müssen. Markieren Sie den Zuordnungsteil mswin.vim CTRL-A 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 stellen Sie sicher, dass er mit einer Nummer beginnt.
  2. qa - Aufnahme in Puffer 'a' starten
  3. Y - zieh den Eintrag
  4. p - Legen Sie eine Kopie des Eintrags unter den ersten
  5. STRG-A - Erhöht die Nummer
  6. q - Aufnahme beenden
  7. @a - Wiederhole die Ruck-, Put- und Inkrementierungszeiten
agfe2
quelle
1
Irgendeine Idee, was die Verknüpfungen in Windows sind?
Don Reba
32

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 durchgeführt, die in einer Multithread-Umgebung 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 ungefähr 20 Arten von Korrekturen, die für jede Datei durchgeführt werden mussten. Ich würde schätzen, dass eine Person von Hand 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 Importanweisungen habe ich Python in das vim-Skript eingebettet.

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

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 durch einen Tag mit dem Schreiben dieses Skripts haben wir schätzungsweise Wochen 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 Regex allein nicht in der Lage wäre, damit umzugehen verschachtelte Klammern, zB zum Konvertieren bar(foo(xxx))in foo(xxx).bar(). Vim war perfekt für die Aufgabe.

Dave Kirby
quelle
1
Vielen Dank für das Teilen, das wirklich schön ist, von "nützlichen und nicht klassischen" Makros zu lernen.
Olivier Pons
%s/\(bar\)(\(.\+\))/\2.\1()/würde das auch tun. (Escapes sind kompatibel mit :set magic.) Nur für die Aufzeichnung. :)
Ipsquiggle
1
Wenn Sie keine %s/\v(bar)\((.+)\)/\2.\1()/
Fluchtversuche im
@lpsquiggle: Ihr Vorschlag würde komplexe Ausdrücke mit mehr als einer Klammer nicht verarbeiten. zB if bar(foo(xxx)) or wibble(xxx): wird if foo(xxx)) or wibble(xxx.bar(): was völlig falsch ist.
Dave Kirby
28

Verwenden Sie den eingebauten Datei-Explorer! Der Befehl ist :Exploreund ermöglicht es Ihnen, sehr, 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 werde einige meiner Lieblingstasten posten. Durch Drücken von erhalten <F1>Sie die vollständige Liste:

  • - : Am nützlichsten: Wechseln Sie in das obere Verzeichnis ( cd ..)
  • mf : Markiere eine Datei
  • D : Löschen Sie markierte Dateien oder die Datei, auf der sich der Cursor befindet, wenn nichts markiert ist.
  • R : Benennen Sie die Datei um, auf der sich der Cursor befindet.
  • d : Erstellen Sie ein neues Verzeichnis im aktuellen Verzeichnis
  • % : Erstellen Sie eine neue Datei im aktuellen Verzeichnis
Soulmerge
quelle
1
Ich habe immer gedacht, dass die Standardmethoden für das Surfen für die meisten Dinge irgendwie scheiße sind. Das Stöbern ist nur langsam, wenn Sie wissen, wohin Sie wollen. LustyExplorer aus dem Skriptbereich von vim.org ist eine dringend benötigte Verbesserung.
Svend
Ihre zweite Zuordnung könnte einfacher sein: map <silent> <S-F8>: Sexplore <CR>
Taurus Olson
8
Ich empfehle NERDtree anstelle des eingebauten Explorers. Es hat die Art und Weise, wie ich vim für Projekte verwendet habe, verändert und mich viel produktiver gemacht. Google einfach dafür.
kprobst
Ich habe nie das Bedürfnis, den Quellbaum zu erkunden, den ich nur benutze :find, :tagund die verschiedenen zugehörigen Tastenanschläge, um herumzuspringen. (Vielleicht liegt das daran, dass die Quellbäume, an denen ich arbeite, groß und anders organisiert sind, als ich es getan hätte? :))
Dash-Tom-Bang
25

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

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

Wenn ich mit diesen Sudokus arbeite, verwende ich vi, einfach weil ich Einrichtungen verwende, die vi so wenige andere Editoren hat. Meistens beim Konvertieren des beschrifteten Gitters in ein nummeriertes Gitter, weil ich es leichter zu lösen finde, und dann das fertige nummerierte Gitter zurück in das beschriftete Gitter, um das Lösungswort oder die Lösungswörter zu finden.

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

Das Ergebnis sieht folgendermaßen 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 oben im Block und tippe dann :y}}p. :versetzt mich in den Befehlsmodus und yzieht den nächsten Bewegungsbefehl. Da }es sich um eine Verschiebung zum Ende des nächsten Absatzes handelt, y}wird der Absatz gezogen. Bewegt }dann den Cursor an das Ende des Absatzes und pfügt ein, was wir direkt nach dem Cursor gezogen haben. Damity}}p erstellt eine Kopie des nächsten Absatzes, und endet mit dem Cursor zwischen den beiden Kopien auf.

Als nächstes verwandle ich eine dieser Kopien in eine Liste unterschiedlicher Buchstaben. Dieser Befehl ist etwas komplexer:

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

:versetzt mich wieder in den Befehlsmodus. !gibt an, dass der Inhalt des nächsten Ruckes über eine Befehlszeile geleitet werden soll. }zieht den nächsten Absatz weg, und die Befehlszeile verwendet dann den trBefehl, um alles außer Großbuchstaben, den sedBefehl zum Drucken jedes Buchstabens in einer einzelnen Zeile und den Befehl zu entfernensort Befehl , diese Zeilen zu sortieren, zu entfernen Duplikate, und dann trabstreift die Zeilenumbrüche, 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 wieder in Buchstaben umgewandelt werden :!}tr 1-9 ACELNOPST.

In vi steckt Macht, die nur von sehr wenigen anderen erreicht wird. Das größte Problem ist, dass nur sehr wenige der vi-Lehrbücher, Websites, Hilfedateien usw. die Oberfläche des Möglichen kaum berühren.

Jeff Dege
quelle
und eine Irritation ist, dass einige Distributionen wie Ubuntu Aliase vom Wort "vi" bis "vim" haben, so dass die Leute vi nicht wirklich sehen. Exzellentes Beispiel, muss versuchen ... +1
hhh
1
Überprüft vim nicht den Namen, mit dem es gestartet wurde, damit es im richtigen "Modus" angezeigt wird?
Dash-Tom-Bang
3
Ich bin verblüfft über diesen wiederholten Fehler: Sie sagen, Sie müssen :in den Befehlsmodus wechseln, aber dann geben Sie immer Befehle im normalen Modus (wie y}}p) an, die möglicherweise nicht im Befehlsmodus funktionieren können?!
sehe
Meine Einstellung zur einzigartigen Zeichenherausforderung: :se tw=1 fo=(Vorbereitung) VG:s/./& /g(Leerzeichen einfügen), gvgq(in separate Zeilen aufgeteilt), V{:sort u(Duplikate sortieren und entfernen)
sehe
23

Massentextmanipulationen!

Entweder durch Makros:

  • Beginnen Sie mit der Aufnahme: qq
  • Sachen machen
  • Höre auf, aufzunehmen: q
  • Wiederholen: @q(das erste Mal),@@ danach.
  • 20 mal wiederholen: 20@@

Oder durch reguläre Ausdrücke:

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

(Aber seien Sie gewarnt: Wenn Sie Letzteres tun, haben Sie 2 Probleme :).)

jqno
quelle
5
+1 für die Jamie Zawinski Referenz. (Es wurden keine Punkte zurückgenommen, wenn keine Verknüpfung hergestellt wurde.) :)
Jim Dennis
1
@ Jim Ich wusste nicht einmal, dass es ein Jamie Zawinski Zitat ist :). Ich werde versuchen, mich von nun an daran zu erinnern.
10.
Ich finde den folgenden Trick immer nützlicher ... für Fälle, in denen Sie Linien, die mit einem Muster übereinstimmen (oder NICHT übereinstimmen), mit der vorherigen Zeile verbinden möchten: :% g/foo/-1joder :'a,'z v/bar/-1jzum Beispiel (wobei erstere "alle Linien und übereinstimmend mit dem Muster" ist). während letzteres "Linien zwischen Markierung a und Markierung z sind, die nicht mit dem Muster übereinstimmen"). Der Teil nach dem Muster in einem goder vex-Befehl kann ein beliebiger anderer ex-Befehl sein. -1j ist nur eine relative Zeilenbewegung und ein Join-Befehl.
Jim Dennis
Wenn Sie Ihr Makro "2" nennen, müssen Sie bei der Verwendung natürlich nicht einmal Ihren Finger von der Taste "@" zur Taste "q" bewegen. Spart wahrscheinlich jedes Mal genau dort 50 bis 100 Millisekunden. = P
JustJeff
@JustJeff Abhängig von Ihrem Tastaturlayout befindet sich meine @ -Taste auf der anderen Seite der Tastatur als meine 2-Tasten.
Simon Steele
23

Ich habe vor kurzem entdeckt q: . Es öffnet das "Befehlsfenster" und zeigt Ihre letzten Ex-Modus-Befehle (Befehlsmodus) an. Sie können sich wie gewohnt innerhalb des Fensters bewegen und durch Drücken von <CR>wird der Befehl ausgeführt. Sie können auch bearbeiten usw. Unbezahlbar, wenn Sie mit einem komplexen Befehl oder Regex herumspielen und nicht das ganze Ding erneut eingeben möchten oder wenn das komplexe Ding, das Sie tun möchten, 3 Befehle zurück war. Es ist fast wie bei Bashs set -o vi, aber für Vim selbst (heh!).

Siehe :help q:für interessantere Bits für hin und her.

David Pope
quelle
22

Ich habe neulich gerade Vims Omnicompletion entdeckt, und obwohl ich zugeben muss, dass ich ein bisschen dunstig bin, was was macht, habe ich überraschend gute Ergebnisse erzielt, indem ich entweder Ctrl+ x Ctrl+ uoder Ctrl+ n/ Ctrl+ pim Einfügemodus püriert habe. Es ist nicht ganz IntelliSense , aber ich lerne es immer noch.

Versuch es! :help ins-completion

Peter Mortensen
quelle
20

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

  1. Machen Sie die Feststelltaste zu einem zusätzlichen Regler (oder Strg).
  2. Ordnen Sie den Anführer mit diesem Befehl "," (Komma) zu: let mapleader = ","

Sie steigern meine Produktivität.

tfmoraes
quelle
Hey netter Hinweis zum "\"! Es ist weitaus besser, "," als "\" einzugeben.
Olivier Pons
2
Versuchen Sie Folgendes
R. Martinho Fernandes
Auf dem Mac benötigen Sie PCKeyboardHack - Details unter superuser.com/questions/34223/…
Tom Morris
1
Unter Windows verwende ich AutoHotKey mitCapslock::Escape
Jeromy Anglim
19

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

Costyn
quelle
3
Xpin die andere Richtung gehen
Tester
5
Ungefähr zu der Zeit, als Windows XP herauskam, scherzte ich, dass dies die einzig gute Verwendung dafür ist.
kguest
18

<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

Peter Ellis
quelle
2
Mit <Strg> + W und j / k können Sie absolut navigieren (j nach oben, k nach unten, wie bei normalem vim). Dies ist großartig, wenn Sie mehr als 3 Splits haben.
Andrew Scagnelli
1
+1 für zf im visuellen Modus, ich mag das Falten von Code, wusste aber nichts davon.
coder_tim
2
Nach dem Schlagen meiner Tastatur habe ich festgestellt, dass <C-w>noder <C-w>sist ein neues horizontales Fenster, <C-w>bist ein Fenster unten rechts <C-w>coder <C-w>qist ein Fenster zum Schließen, <C-w>xvergrößert und verkleinert die Fensterbreite (??), <C-w>pist das letzte Fenster, <C-w>backspacebewegt sich nach links (ish)
puk
:help ctrl-wFTW ... tun Sie sich selbst einen Gefallen und zwingen Sie sich, diese Dinge mindestens 15 Minuten lang auszuprobieren!
Sjas
18

Visueller Modus

Wie mehrere andere bereits gesagt haben, ist der visuelle Modus die Antwort auf Ihr Problem mit dem Kopieren / Ausschneiden und Einfügen. Vim gibt dir 'v', 'V' und Cv. Kleinbuchstaben 'v' in vim entsprechen im Wesentlichen der Umschalttaste im Editor. Das Schöne ist, dass Sie es nicht gedrückt halten müssen. Sie können jede Bewegungstechnik verwenden, um effizient zum Start- (oder End-) Punkt 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 des visuellen Modus von vim gegenüber Jim Dennis 'Beschreibung des Ausschneidens / Kopierens / Einfügens in vi besteht darin, dass Sie den Ort nicht genau richtig einstellen müssen. Manchmal ist es effizienter, eine schnelle Bewegung zu verwenden, um in die allgemeine Umgebung zu gelangen, in die Sie gehen möchten, und diese dann mit anderen Bewegungen zu verfeinern, als sich einen komplexeren Befehl für eine einzelne Bewegung auszudenken, mit dem Sie genau dorthin gelangen, wo Sie hin möchten.

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

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

Zur effizienten Nutzung der Tastatur

Ich bin auch nicht einverstanden mit Ihrer Behauptung, dass das Wechseln der Hände der schnellste Weg ist, die Tastatur zu benutzen. Es enthält ein Element der Wahrheit. Ganz allgemein gesagt ist die wiederholte Verwendung derselben Sache langsam. Dieses wichtigste Beispiel für dieses Prinzip ist, dass aufeinanderfolgende Tastenanschläge, die mit demselben Finger eingegeben 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 Effizienzspektrums ist es falsch.

Fragen Sie einfach einen Pianisten. Fragen Sie sie, ob es schneller ist, eine Reihe von Noten abwechselnd zu spielen oder aufeinanderfolgende Finger einer einzelnen Hand nacheinander zu verwenden. Der schnellste Weg, 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, sobald Sie diese Möglichkeit in Betracht gezogen haben.

Das schwierigere Problem ist die Optimierung dafür. Es ist ziemlich einfach, den absoluten Abstand 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 bietet Ihnen eine bessere Chance, dies zu tun, als es ein nicht-modaler Ansatz (ahem, emacs) jemals könnte.

Auf Emacs

Damit die Emacs-Eiferer meinen gesamten Beitrag aufgrund dieses letzten Kommentars in Klammern nicht völlig außer Acht lassen, muss ich die Wurzel des Unterschieds zwischen den Emacs- und Vim-Religionen beschreiben. Ich habe in den Redaktionskriegen nie gesprochen und werde es wahrscheinlich nicht wieder tun, aber ich habe noch nie gehört, dass jemand die Unterschiede so beschreibt, also geht es los. Der Unterschied ist der folgende Kompromiss:

Mit Vim erhalten Sie eine unübertroffene Effizienz bei der Bearbeitung von Rohtexten. Mit Emacs können Sie den Editor unübertroffen anpassen und programmieren

Die blinden Vim-Fanatiker werden 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 dieser beiden letzten 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-Fanatiker werden behaupten, dass Emacs einen Viper-Modus haben und daher eine Obermenge von Vim sind. Der Viper-Modus ist jedoch nicht Standard. Mein Verständnis ist, dass der Viper-Modus von der Mehrheit der Emacs-Benutzer nicht verwendet wird. Da dies nicht die Standardeinstellung ist, entwickeln die meisten Emacs-Benutzer wahrscheinlich keine echte Wertschätzung für die Vorteile des modalen Paradigmas.

Meiner Meinung nach sind diese Unterschiede orthogonal. Ich glaube, dass die Vorteile von Vim und Emacs, wie ich sie angegeben habe, beide gültig sind. Dies bedeutet, dass der ultimative Editor noch nicht existiert. Es ist wahrscheinlich wahr, dass Emacs die einfachste Plattform ist, auf der der ultimative Editor basiert. Die modale Bearbeitung ist jedoch nicht in der Emacs-Denkweise verankert. Die Emacs-Community könnte sich in Zukunft so bewegen, aber das scheint nicht sehr wahrscheinlich.

Wenn Sie also eine effiziente Bearbeitung wünschen, verwenden Sie vim. Wenn Sie die ultimative Umgebung für die Skripterstellung und Programmierung Ihres Editors wünschen, 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 kein Glück.

user307058
quelle
17

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 noch einmal die Antwort von Jim Dennis :)

konryd
quelle
1
Dies ist das erste, woran ich beim Lesen des OP dachte. Es ist offensichtlich, dass das Poster dies noch nie ausgeführt hat. Ich habe es durchlaufen, als ich vor zwei Jahren zum ersten Mal Vim lernte, und es hat mir die Überlegenheit von Vim gegenüber allen anderen Editoren, die ich verwendet habe, zementiert (einschließlich Emacs, da die Tastenkombinationen für mich auf einem Mac ärgerlich sind). .
Dash-Tom-Bang
16

Wie verwenden Sie Vim, das Sie produktiver macht als mit einem zeitgenössischen Editor?

Komplexe, sich wiederholende Bearbeitungen mit sehr wenigen Tastenanschlägen ausführen 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.

Johnsyweb
quelle
16

Verwenden Sie eine \cbeliebige Stelle in einer Suche, um Groß- und Kleinschreibung zu ignorieren (Überschreiben Ihrer Ignorier- oder Smartcase-Einstellungen). Eg /\cfoooder /foo\cpasst auf foo, Foo, fOO, FOO, usw.

Verwenden Sie eine \Cbeliebige Stelle in einer Suche, um die Fallanpassung zu erzwingen. ZB /\Cfoooder /foo\Cpasst nur zu foo.

kev
quelle
16

Ich war überrascht, dass niemand die tBewegung erwähnte . Ich benutze es häufig mit Parameterlisten in Form von dt,oderyt,

David Corbin
quelle
2
oder dfx, dFx, dtx, ytx usw. wobei x ein
Zeichen
Ja! Und vergiss ct nicht (wechsle zu).
markle976
16

Seltsamerweise hat niemand ctags erwähnt. Laden Sie "üppige ctags" herunter und stellen Sie sie vor die beschissene vorinstallierte Version, 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." um einen Index von Quelldateien irgendwo unter diesem Verzeichnis in einer Datei mit dem Namen "tags" zu erstellen. Dies enthält alle Tags, unabhängig von der Sprache oder der 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. Einige benutze ich oft:

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

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

Bradjcox
quelle
14

Automatische Einrückung:

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

Sie benötigen in Ihrer .vimrcDatei den Einzug "Dateityp-Plugin ein" und wahrscheinlich die entsprechenden Einstellungen für "Shiftwidth" und "Expandtab".

David Claridge
quelle
4
Oder verwenden Sie einfach die Funktion ": set ai" (Auto-Indent), die von Anfang an in vi war.
Xcramps
14

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

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

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

autodidakto
quelle
13

Mehrere Puffer und insbesondere ein schneller Sprung zwischen ihnen, um zwei Dateien mit :bpund zu vergleichen :bn(ordnungsgemäß einem einzelnen Shift+ poder Shift+ zugeordnet n)

vimdiff Modus (wird in zwei vertikale Puffer aufgeteilt, wobei die Farben die Unterschiede anzeigen)

Flächenkopie mit Ctrl+v

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

Stefano Borini
quelle
12

Einverstanden mit dem Top-Poster - das : r! Befehl ist sehr nützlich.

Meistens benutze ich es, um Dinge "einzufügen":

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

Auf diese Weise muss ich nicht herumspielen :set paste.

David Wolever
quelle
3
Wahrscheinlich ist es besser, die clipboardOption unnamed( set clipboard=unnamedin Ihrer .vimrc) festzulegen, um die Systemzwischenablage standardmäßig zu verwenden. Wenn Sie die Systemzwischenablage weiterhin vom unbenannten Register trennen möchten, verwenden Sie das entsprechend benannte Zwischenablage-Register : "*p.
R. Martinho Fernandes
2
Liebe es! Nachdem ich mich über das Einfügen von Codebeispielen aus dem Internet geärgert hatte und mich gerade erst mit vim vertraut fühlte. Das war der Befehl, den ich mir sofort ausgedacht hatte. Dies war, als vim mich total süchtig machte.
Kevpie
Wenn Sie auf einem Mac entwickeln, kopieren und Einfügen mit Befehl + C und Befehl + V mithilfe der Systemzwischenablage, ist keine Neuzuordnung erforderlich.
Ben Mordecai
Nur mit GVIm… Über die Konsole funktioniert das Einfügen ohne :set pastenicht, wenn die automatische Einrückung aktiviert ist.
David Wolever