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:
- Die Verwendung der linken und rechten Hand ist die schnellste Möglichkeit, die Tastatur zu verwenden.
- 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]yy
xx
Zeilen in den Puffer kopieren . Aber Sie wissen nie genau, ob Sie ausgewählt haben, was Sie wollten. Ich muss[number xx]dd
dann oft tun,u
um 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?
Antworten:
Ihr Problem mit Vim ist, dass Sie vi nicht grok .
Sie erwähnen das Schneiden mit
yy
und 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. Esyy
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. Die Initiale
y
ist ein Verb. Die Aussageyy
ist ein Synonym füry_
. Dasy
wird 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). Diey
undd
"Verben" nehmen jede Bewegung als ihr "Subjekt". SomityW
ist "von hier (der Cursor) bis zum Ende des aktuellen / nächsten (großen) Wortes ziehen" undy'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
m
Befehl wird eine Markierung auf eine beliebige Cursorposition gesetzt . Jede Marke ist durch einen einzelnen Kleinbuchstaben gekennzeichnet. Somitma
setzt die ‚ eine ‘ Markierung der aktuellen Position undmz
setzt die ‚ z ‘ Zeichen. Mit dem'
Befehl (in einfachen Anführungszeichen) können Sie zu der Zeile mit einer Markierung wechseln . Bewegt'a
sich 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`z
wird 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`a
zum Ausschneiden odery`a
Kopieren 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 einfachd}
oderd{
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/foo
von der aktuellen Zeile zur nächsten Zeile mit der Zeichenfolge "foo" schneiden undy?bar
von 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`x
Befehle 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"add
ich die aktuelle Zeile in die ‚cutting a ‘ registrieren und wenn ich"by/foo
dann 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:"ap
Fügt eine Kopie des Registers ' a ' ein."bP
Fü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
3J
bedeutet "die nächsten drei Zeilen verbinden" undd5}
"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/g
globale 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/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 bzw. letzte Zeilen verwenden. Man könnte auch relative Präfixe verwenden+
und-
sich auf Offsets nach bzw. vor der aktuellen Linie beziehen. Also::.,$j
bedeutet "von der aktuellen bis zur letzten Zeile, füge sie alle zu einer Zeile zusammen".:%
ist gleichbedeutend mit:1,$
(allen Zeilen).Die Befehle
:... g
und sind:... v
erklärungsbedürftig, da sie unglaublich mächtig sind.:... g
ist ein Präfix für "global", das einen nachfolgenden Befehl auf alle Zeilen anwendet, die einem Muster entsprechen (regulärer Ausdruck), während ein:... v
solcher 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/d
bedeutet "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:p
Befehl 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:.,+25p
oder einem ähnlichen Inhalt ).Beachten Sie, dass
:% g/.../d
oder (sein Gegenstück zu reVerse / conVerse::% v/.../d
die häufigsten Verwendungsmuster sind. Es gibt jedoch einige andereex
Befehle, an die Sie sich erinnern sollten:Wir können
m
Linien verschieben undj
Linien 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 durchgrep
und 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 Befehleng
undv
(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/g
wü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
,s
undd
Linien in demex
Befehlssatz.Die
:
Adressen können sich auch auf Marken beziehen. Sie können also:'a,'bg/foo/j
Folgendes 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 vorhergehendenex
Befehlsbeispiele 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
:r
das Einlesen des Inhalts einer anderen Datei. Also::r foo
fü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 sortieren1G!Gsort
(G
ist 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:source
On-~/.exinitrc
Datei aus (und Vim führt dies normalerweise~/.vimrc
natü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_hosts
um 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:0i:r
(um die aktuelle Zeile in einen gültigen : r- Befehl umzuwandeln ),"cdd
(um die Zeile in das "c" -Register zu löschen) und@c
Führen Sie diesen Befehl aus.Das sind nur 10 Tastenanschläge (und der Ausdruck
"cdd
@c
ist 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.
quelle
@
Befehlq
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 befindetvib
Wenn sich der Cursor innerhalb des Klammerblocks befindetSie möchten Text zwischen Anführungszeichen auswählen:
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 .
quelle
o
zum anderen Ende. Sie können also den Anfang und das Ende der Auswahl beliebig verschieben.Einige Produktivitätstipps:
Intelligente Bewegungen
*
und#
suchen Sie nach dem Wort unter dem Cursor vorwärts / rückwärts.w
zum nächsten WortW
zum nächsten durch Leerzeichen getrennten Wortb
/e
zum Anfang / Ende des aktuellen Wortes. (B
/ nurE
für Leerzeichen getrennt)gg
/G
springe 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+V
Visueller Modus (wählen Text!)Shift+R
Text ersetzenC
Ä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 ändern3cW
= 3 Wörter ändernBcW
= Um mit dem vollständigen Wort zu beginnen, ändern Sie das vollständige WortciW
= inneres Wort ändern.ci"
= inneres wechseln zwischen ".."ci(
= Text ändern zwischen (..)ci<
= Text zwischen <..> ändern (Bedürfnisseset matchpairs+=<:>
in vimrc)4dd
= 4 Zeilen löschen3x
= 3 Zeichen löschen.3s
= 3 Zeichen ersetzen.Nützliche Programmierbefehle
r
Ersetzen Sie ein Zeichen (z. B.rd
ersetzt das aktuelle Zeichen durchd
).~
ändert den Fall.J
verbindet zwei Zeilen.
letzten Befehl wiederholen (ein einfaches Makro)==
Fix Line Indent>
Einrückungsblock (im visuellen Modus)<
unindent Block (im visuellen Modus)Makroaufnahme
q[ key ]
, um die Aufnahme zu starten.q
, um die Aufnahme zu beenden.@[ 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
/e
um den Cursor an den Anfang bzw. das Ende eines Wortes zu bewegen)Beispiel für gut gebaute Einstellungen
Die Einstellungen können in
~/.vimrc
oder systemweit in gespeichert/etc/vimrc.local
und dann aus der/etc/vimrc
Datei gelesen werden, indem:(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.
quelle
'.
istg;
, was durch die zurückspringtchangelist
. Geht zur zuletzt bearbeiteten Position anstelle der zuletzt bearbeiteten ZeileDer 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:Sehen
:help i_CTRL-R
und:help c_CTRL-R
für weitere Einzelheiten und schnüffelt in der Nähe für mehr STRG + R Güte.quelle
Control-A
Funktioniert auch im Einfügemodus für zuletzt eingefügten Text undControl-@
zum Einfügen des zuletzt eingefügten Textes und zum sofortigen Umschalten in den normalen Modus.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.
quelle
.
Wiederholen Sie den letzten TextänderungsbefehlIch 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).
quelle
.
Taste drücken .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.quelle
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!
quelle
CTRL+A erhöht die Zahl, auf der Sie stehen.
quelle
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.
quelle
ct(
löscht sie beispielsweise das Wort und versetzt Sie in den Einfügemodus, aber behalten Sie die Klammern!Session
ein. Sitzung speichern
b. Sitzung speichern erzwingen
c. Sitzung laden
Addieren und Subtrahieren
ein. Addieren und Subtrahieren
b. Aufheben der Zuordnung von Fenstertasten
c. Mit Makro
quelle
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
Der letzte verdient eine Erklärung:
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.vim
und 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))
infoo(xxx).bar()
. Vim war perfekt für die Aufgabe.quelle
%s/\(bar\)(\(.\+\))/\2.\1()/
würde das auch tun. (Escapes sind kompatibel mit:set magic
.) Nur für die Aufzeichnung. :)%s/\v(bar)\((.+)\)/\2.\1()/
if bar(foo(xxx)) or wibble(xxx):
wirdif foo(xxx)) or wibble(xxx.bar():
was völlig falsch ist.Verwenden Sie den eingebauten Datei-Explorer! Der Befehl ist
:Explore
und ermöglicht es Ihnen, sehr, sehr schnell durch Ihren Quellcode zu navigieren. Ich habe diese Zuordnung in meinem.vimrc
: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:cd ..
)quelle
:find
,:tag
und 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? :))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:
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 undy
zieht 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 undp
fü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:
:
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 dentr
Befehl, um alles außer Großbuchstaben, densed
Befehl zum Drucken jedes Buchstabens in einer einzelnen Zeile und den Befehl zu entfernensort
Befehl , diese Zeilen zu sortieren, zu entfernen Duplikate, und danntr
abstreift 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: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.
quelle
:
in den Befehlsmodus wechseln, aber dann geben Sie immer Befehle im normalen Modus (wiey}}p
) an, die möglicherweise nicht im Befehlsmodus funktionieren können?!:se tw=1 fo=
(Vorbereitung)VG:s/./& /g
(Leerzeichen einfügen),gvgq
(in separate Zeilen aufgeteilt),V{:sort u
(Duplikate sortieren und entfernen)Massentextmanipulationen!
Entweder durch Makros:
qq
q
@q
(das erste Mal),@@
danach.20@@
Oder durch reguläre Ausdrücke:
:%s/[fo]+/bar/g
(Aber seien Sie gewarnt: Wenn Sie Letzteres tun, haben Sie 2 Probleme :).)
quelle
:% g/foo/-1j
oder:'a,'z v/bar/-1j
zum 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 einemg
oderv
ex-Befehl kann ein beliebiger anderer ex-Befehl sein. -1j ist nur eine relative Zeilenbewegung und ein Join-Befehl.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 Bashsset -o vi
, aber für Vim selbst (heh!).Siehe
:help q:
für interessantere Bits für hin und her.quelle
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
quelle
Dies sind keine Abkürzungen, aber sie hängen zusammen:
Sie steigern meine Produktivität.
quelle
Capslock::Escape
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.
quelle
Xp
in die andere Richtung gehen<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
quelle
<C-w>n
oder<C-w>s
ist ein neues horizontales Fenster,<C-w>b
ist ein Fenster unten rechts<C-w>c
oder<C-w>q
ist ein Fenster zum Schließen,<C-w>x
vergrößert und verkleinert die Fensterbreite (??),<C-w>p
ist das letzte Fenster,<C-w>backspace
bewegt sich nach links (ish):help ctrl-w
FTW ... tun Sie sich selbst einen Gefallen und zwingen Sie sich, diese Dinge mindestens 15 Minuten lang auszuprobieren!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.
quelle
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 :)
quelle
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.
quelle
Verwenden Sie eine
\c
beliebige Stelle in einer Suche, um Groß- und Kleinschreibung zu ignorieren (Überschreiben Ihrer Ignorier- oder Smartcase-Einstellungen). Eg/\cfoo
oder/foo\c
passt auffoo
,Foo
,fOO
,FOO
, usw.Verwenden Sie eine
\C
beliebige Stelle in einer Suche, um die Fallanpassung zu erzwingen. ZB/\Cfoo
oder/foo\C
passt nur zu foo.quelle
Ich war überrascht, dass niemand die
t
Bewegung erwähnte . Ich benutze es häufig mit Parameterlisten in Form vondt,
oderyt,
quelle
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.
quelle
Automatische Einrückung:
gg
(gehe zum Anfang des Dokuments)=
(Einrückungszeit!)shift-g
(gehe zum Ende des Dokuments)Sie benötigen in Ihrer
.vimrc
Datei den Einzug "Dateityp-Plugin ein" und wahrscheinlich die entsprechenden Einstellungen für "Shiftwidth" und "Expandtab".quelle
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.
quelle
Mehrere Puffer und insbesondere ein schneller Sprung zwischen ihnen, um zwei Dateien mit
:bp
und 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.
quelle
Einverstanden mit dem Top-Poster - das : r! Befehl ist sehr nützlich.
Meistens benutze ich es, um Dinge "einzufügen":
Auf diese Weise muss ich nicht herumspielen
:set paste
.quelle
clipboard
Optionunnamed
(set clipboard=unnamed
in 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
.:set paste
nicht, wenn die automatische Einrückung aktiviert ist.