Es gibt eine Vielzahl von Fragen, bei denen über gängige Tricks gesprochen wird, insbesondere über " Tipps und Tricks zu Vim + ctags ".
Ich beziehe mich jedoch nicht auf häufig verwendete Verknüpfungen, die jemand, der neu bei Vim ist, cool finden würde. Ich spreche von einem erfahrenen Unix-Benutzer (sei es ein Entwickler, Administrator, beides usw.), der glaubt, etwas zu wissen, von dem 99% von uns noch nie etwas gehört oder geträumt haben. Etwas, das nicht nur ihre Arbeit erleichtert, sondern auch COOL und hackisch ist . Immerhin befindet sich Vim in dem Betriebssystem mit den dunkelsten Ecken der Welt. Daher sollte es Feinheiten aufweisen, die nur wenige Privilegierte kennen und mit uns teilen möchten.
Antworten:
Könnte nicht einer sein, von dem 99% der Vim-Benutzer nichts wissen, aber es ist etwas, das ich täglich benutze und das jeder Linux + Vim-Poweruser wissen muss.
Grundbefehl, aber äußerst nützlich.
Ich vergesse oft sudo, bevor ich eine Datei bearbeite, für die ich keine Schreibberechtigung habe. Wenn ich diese Datei speichere und einen Berechtigungsfehler erhalte, gebe ich einfach diesen Befehl vim aus, um die Datei zu speichern, ohne sie in einer temporären Datei speichern und dann erneut kopieren zu müssen.
Sie müssen sich offensichtlich auf einem System mit installiertem sudo befinden und über sudo-Rechte verfügen.
quelle
sudo vim
. Stattdessen sollten SieEDITOR
als vim exportieren und ausführensudoedit
.Etwas, das ich kürzlich entdeckt habe und das ich für sehr cool hielt:
Setzt das Dokument auf den Stand vor 15 Minuten zurück. Kann verschiedene Argumente für die Zeit verwenden, die Sie zurücksetzen möchten, und ist abhängig von Undolevels. Kann mit dem entgegengesetzten Befehl umgekehrt werden
:later
quelle
:later 8h
und bin für heute fertig? : P:! [command]
führt einen externen Befehl aus, während Sie sich in Vim befinden.Fügen Sie jedoch nach dem Doppelpunkt einen Punkt hinzu
:.! [command]
, und die Ausgabe des Befehls wird in Ihrem aktuellen Fenster gespeichert. Das ist: . !
Zum Beispiel:
Ich benutze dies häufig, um beispielsweise das aktuelle Datum in ein Dokument einzufügen, das ich schreibe:
quelle
:.!date
besteht darin, "Datum" in eine Zeile zu schreiben und dann auszuführen!$sh
(alternativ mit dem Befehl gefolgt von einer leeren Zeile und Ausführen!jsh
). Dadurch wird die Zeile an die "sh" -Shell weitergeleitet und durch die Ausgabe des Befehls ersetzt.:.!
ist eigentlich ein Sonderfall von:{range}!
, der einen Zeilenbereich (die aktuelle Zeile, wenn der Bereich ist.
) durch einen Befehl filtert und diese Zeilen durch die Ausgabe ersetzt. Ich finde es:%!
nützlich, ganze Puffer zu filtern.sed
, wenn Sie die ähnlichen integriertened
/ex
Befehle verwenden können? Versuchen Sie zu laufen:.s/old/new/g
;-)Nicht gerade dunkel, aber es gibt mehrere "Löschen in" -Befehle, die äußerst nützlich sind, wie z.
diw
um das aktuelle Wort zu löschendi(
innerhalb der aktuellen Parens zu löschendi"
um den Text zwischen den Anführungszeichen zu löschenAndere finden Sie auf
:help text-objects
quelle
de Löschen Sie alles bis zum Ende des Wortes, indem Sie drücken. auf Wunsch deines Herzens.
ci (xyz [Esc] - Dies ist eine seltsame. Hier bedeutet das 'i' nicht den Einfügemodus. Stattdessen bedeutet es innerhalb der Klammer. Diese Sequenz schneidet also den Text in der Klammer, in der Sie stehen, und ersetzt ihn durch "xyz". Es funktioniert auch in eckigen Klammern und Zahlen - machen Sie einfach ci [oder ci {entsprechend. Natürlich können Sie di tun (wenn Sie nur den gesamten Text löschen möchten, ohne etwas einzugeben. Sie können dies auch tun,
a
anstatti
wenn Sie Ich möchte auch die Klammern löschen und nicht nur den darin enthaltenen Text.ci " - schneidet den Text in aktuelle Anführungszeichen
ciw - schneidet das aktuelle Wort. Dies funktioniert genauso wie das vorherige, außer dass
(
es durch ersetzt wirdw
.C - Schneiden Sie den Rest der Leitung ab und wechseln Sie in den Einfügemodus.
ZZ - Aktuelle Datei speichern und schließen (viel schneller als Strg-F4, um die aktuelle Registerkarte zu schließen!)
ddp - verschiebt die aktuelle Zeile eine Zeile nach unten
xp - Verschiebe das aktuelle Zeichen um eine Position nach rechts
U - Großbuchstaben, so
viwU
upercases das Wort~ - schaltet die Groß- und Kleinschreibung um, um
viw~
das ganze Wort umzukehrenStrg + U / Strg + D Scrollen Sie die Seite einen halben Bildschirm nach oben oder unten. Dies scheint nützlicher zu sein als das übliche Vollbild-Paging, da es einfacher ist, die Beziehung zwischen den beiden Bildschirmen zu erkennen. Für diejenigen, die immer noch den gesamten Bildschirm gleichzeitig scrollen möchten, gibt es Strg + f für Vorwärts und Strg + b für Rückwärts. Strg + Y und Strg + E scrollen zeilenweise nach unten oder oben.
Der verrückte, aber sehr nützliche Befehl ist zz - er scrollt den Bildschirm, damit diese Zeile in der Mitte angezeigt wird. Dies ist hervorragend geeignet, um den Code, an dem Sie arbeiten, in den Mittelpunkt Ihrer Aufmerksamkeit zu stellen. Geschwisterbefehle - zt und zb - machen diese Zeile zur oberen oder unteren Zeile auf dem Bildschirm, was nicht ganz so nützlich ist.
% findet und springt zur passenden Klammer.
de - löscht von Cursor an das Ende des Wortes (Sie können auch tun
dE
bis zum nächsten Raum löschen)bde - löscht das aktuelle Wort vom linken zum rechten Trennzeichen
df [Leerzeichen] - Löschen bis einschließlich des nächsten Leerzeichens
dt. - bis zum nächsten Punkt löschen
dd - löscht die gesamte Zeile
ye (oder yE) - zieht den Text von hier bis zum Ende des Wortes
ce - schneidet das Ende des Wortes durch
bye - kopiert das aktuelle Wort (ich frage mich, was "hi" macht!)
yy - kopiert die aktuelle Zeile
cc - schneidet die aktuelle Zeile, Sie können dies auch
S
stattdessen tun . Es gibt auch eine untere Kappe,s
die das aktuelle Zeichen abschneidet und in den Einfügemodus wechselt.viwy oder viwc . Ziehen oder ändern Sie das aktuelle Wort. Drücken Sie
w
mehrmals, um jedes nachfolgende Wort auszuwählen,b
und bewegen Sie sich rückwärtsvi { - Wählen Sie den gesamten Text in Zahlenklammern aus. va {- wähle den gesamten Text einschließlich {} s aus
vi (p - Markiere alles in den () s und ersetze es durch den eingefügten Text
b und e bewegen den Cursor wortweise, ähnlich wie dies normalerweise bei Strg + Pfeilen der Fall ist . Die Definition des Wortes ist jedoch etwas anders, da mehrere aufeinanderfolgende Delmiter als ein Wort behandelt werden. Wenn Sie in der Mitte eines Wortes beginnen, gelangen Sie durch Drücken von b immer zum Anfang des aktuellen Wortes, und jedes aufeinanderfolgende b springt zum Anfang des nächsten Wortes. In ähnlicher Weise und leicht zu merken
e
wird der Cursor an das Ende des aktuellen und jedes nachfolgenden Wortes gesetzt.Ähnlich wie bei
b
/e
, Groß-B
undE
Kleinschreibung und bewegen Sie den Cursor Wort für Wort, wobei Sie nur Leerzeichen als Trennzeichen verwenden.Großbuchstabe D (tief durchatmen) Löscht den Rest der Zeile rechts vom Cursor, wie bei normalen Editoren auch Umschalt + Ende / Entf (beachten Sie 2 Tastendrücke - Umschalt + D - anstelle von 3).
quelle
vity
undvitc
kann verkürzt werdenyit
undcit
jeweils..
).bye
funktioniert nicht, wenn Sie sich im ersten Zeichen des Wortes befinden.yiw
macht immer.Eine, die ich in den meisten Vim-Tutorials selten finde, die aber (zumindest für mich) UNGLAUBLICH nützlich ist, ist die
g; and g,
sich (vorwärts, rückwärts) durch die Änderungsliste bewegen.
Lassen Sie mich zeigen, wie ich es benutze. Manchmal muss ich einen Code oder eine Zeichenfolge kopieren und einfügen, z. B. einen hexadezimalen Farbcode in einer CSS-Datei, also suche ich, springe (ohne Rücksicht darauf, wo die Übereinstimmung ist), kopiere sie und springe dann zurück (g;) dorthin Ich habe den Code bearbeitet, um ihn endgültig einzufügen. Keine Notwendigkeit, Markierungen zu erstellen. Einfacher.
Nur meine 2 Cent.
quelle
'.
wird zur zuletzt bearbeiteten Zeile und`.
zur zuletzt bearbeiteten Position<C-o>
/<C-i>
dafür die ganze Zeit - oder markiere meinen Platz.Machen Sie vim zu einem Hex-Editor.
Zurückkehren.
Warnung: Wenn Sie nicht mit Binär (-b) bearbeiten, kann die Datei beschädigt werden. - Josh Lee in den Kommentaren.
quelle
:%!xxd -r
, es zurückzusetzenWählt die letzte visuelle Auswahl erneut aus.
quelle
Manchmal wird eine Einstellung in Ihrer .vimrc durch ein Plugin oder einen automatischen Befehl überschrieben. Um dies zu debuggen, ist es ein nützlicher Trick, den Befehl: verbose in Verbindung mit: set zu verwenden. Um beispielsweise herauszufinden, wo cindent gesetzt / nicht gesetzt wurde:
Dies gibt ungefähr Folgendes aus:
Dies funktioniert auch mit Karten und Highlights. (Danke joeytwiddle für den Hinweis.) Zum Beispiel:
quelle
:verbose
kann auch verwendet werden, bevornmap l
oderhighlight Normal
um herauszufinden, wo diel
Keymap oder dasNormal
Highlight zuletzt definiert wurden. Sehr nützlich zum Debuggen!:%TOhtml
Erstellt ein HTML-Rendering der aktuellen Datei.
quelle
Ich bin mir nicht sicher, ob dies überhaupt als dunkle Ecke gilt, aber ich habe es gerade erst gelernt ...
zieht (kopiert) alle Zeilen, die "match" enthalten, in das Register
"a
/@a
. (Die Kapitalisierung alsA
Marken vim append yankings statt der bisherigen Registerinhalte ersetzt werden .) Habe ich es viel vor kurzem , als Internet Explorer Sheets zu machen.quelle
:v/PATTERN/d
Erläuterung::v
ist eine Abkürzung für:g!
, und der:g
Befehl wendet einen beliebigen ex-Befehl auf Zeilen an.:y[ank]
funktioniert und funktioniert auch:normal
, aber hier ist das Natürlichste, was zu tun ist, einfach:d[elete]
.:g/match/normal "Ayy
- mit demnormal
Schlüsselwort können Sie festlegen, dass Befehle im normalen Modus ausgeführt werden sollen (mit denen Sie wahrscheinlich besser vertraut sind).Möchten Sie sich Ihren Befehlsverlauf ansehen?
Dann durchsuchen, bearbeiten und schließlich den Befehl ausführen.
Nehmen Sie jemals ähnliche Änderungen an zwei Dateien vor und wechseln Sie zwischen ihnen hin und her? (Sagen wir, Quell- und Header-Dateien?)
Wechseln Sie dann zwischen diesen Dateien hin und her.
quelle
q:
ganze Zeit versehentlich getroffen ...Vim öffnet beispielsweise eine URL
Schön, wenn Sie die Quelle einer Seite als Referenz aufrufen müssen.
quelle
Makros können andere Makros aufrufen und sich selbst aufrufen.
z.B:
... löscht das erste Wort aus jeder Zeile bis zum Ende der Datei.
Dies ist ein recht einfaches Beispiel, aber es zeigt eine sehr leistungsstarke Funktion von vim
quelle
qqqqqifuu<Esc>h@qq@q
:normal! @a
einzugeben, um Ihr Makro auf jede Zeile in Ihrer Auswahl anzuwenden.Angenommen, Sie haben Perl- und / oder Ruby-Unterstützung kompiliert
:rubydo
und:perldo
führen in jeder Zeile eines Bereichs (standardmäßig den gesamten Puffer) einen Ruby- oder Perl-Einzeiler aus, der$_
an den Text der aktuellen Zeile (abzüglich der neuen Zeile) gebunden ist. Manipulieren$_
wird der Text dieser Zeile geändert.Sie können dies verwenden, um bestimmte Dinge zu tun, die in einer Skriptsprache einfach zu erledigen sind, aber mit Vim-Integrationen nicht so offensichtlich sind. Um beispielsweise die Reihenfolge der Wörter in einer Zeile umzukehren:
So fügen Sie am Ende jeder Zeile eine zufällige Zeichenfolge mit 8 Zeichen (AZ) ein:
Sie können nur eine Zeile gleichzeitig bearbeiten und keine neuen Zeilen hinzufügen.
quelle
pydo
undpy3do
arbeiten Sie für Python, wenn Sie die erforderliche Unterstützung kompiliert haben.^ O und ^ I.
Gehen Sie zu einer älteren / neueren Position. Wenn Sie sich durch die Datei bewegen (durch Suchen, Verschieben von Befehlen usw.), erinnern Sie sich an diese "Sprünge", damit Sie diese Sprünge rückwärts (^ O - O für alt) und vorwärts (^ I - direkt neben I auf der Tastatur) wiederholen können ). Ich finde es sehr nützlich, wenn ich Code schreibe und viele Suchen durchführe.
gi
Gehen Sie zu der Position, an der der Einfügemodus zuletzt gestoppt wurde. Ich finde mich oft dabei, etwas zu bearbeiten und dann zu suchen. Um zum Bearbeitungsort zurückzukehren, drücken Sie gi.
gf
Setzen Sie den Cursor auf den Dateinamen (z. B. Header-Datei einschließen), drücken Sie gf und die Datei wird geöffnet
gF
ähnlich wie gf, erkennt jedoch das Format "[Dateiname]: [Zeilennummer]". Durch Drücken von gF wird [Dateiname] geöffnet und der Cursor auf [Zeilennummer] gesetzt.
^ P und ^ N.
Text während der Bearbeitung automatisch vervollständigen (^ P - vorherige Übereinstimmung und ^ N nächste Übereinstimmung)
^ X ^ L.
Während der Bearbeitung wird dieselbe Zeile ausgeführt (nützlich für die Programmierung). Sie schreiben Code und erinnern sich dann daran, dass Sie denselben Code irgendwo in der Datei haben. Drücken Sie einfach ^ X ^ L und die vollständige Zeile ist fertig
^ X ^ F.
Vollständige Dateinamen. Sie schreiben "/ etc / pass" Hmm. Sie haben den Dateinamen vergessen. Drücken Sie einfach ^ X ^ F und der Dateiname ist fertig
^ Z oder: sh
Vorübergehend in die Shell verschieben. Wenn Sie ein schnelles Bashing benötigen:
quelle
^X^F
meinem Haustier ist es so, dass Dateinamen=
Zeichen enthalten, die dazu führen, dass es in vielen Fällen faule Dinge tut (INI-Dateien, Makefiles usw.). Ich benutzese isfname-==
, um dieses Ärgernis zu beendenquelle
i10.0.0.1<Esc>Y254p$<C-v>}g<C-a>
Dies ist ein guter Trick, um die aktuelle Datei mit einer anderen Codierung erneut zu öffnen:
Nützlich, wenn Sie mit Legacy-Codierungen arbeiten müssen. Die unterstützten Codierungen sind in einer Tabelle unter
encoding-values
(siehehelp
encoding-values
) aufgeführt. Ähnliches funktioniert auch für++ff
, so dass Sie Dateien mit Windows / Unix-Zeilenenden erneut öffnen können, wenn Sie es zum ersten Mal falsch machen (siehehelp
ff
).quelle
Durch Eingabe von == wird der Einzug der aktuellen Zeile basierend auf der obigen Zeile korrigiert.
Tatsächlich können Sie ein = Zeichen gefolgt von einem beliebigen Bewegungsbefehl ausführen. = {Bewegung}
Sie können beispielsweise die% -Bewegung verwenden, die sich zwischen übereinstimmenden Klammern bewegt. Positionieren Sie den Cursor im folgenden Code auf {:
Und drücken Sie =% , um dies sofort zu erhalten:
Alternativ können Sie = a { innerhalb des Codeblocks ausführen, anstatt sich direkt auf dem {-Zeichen zu positionieren.
quelle
=}
odervaBaB=
weil es weniger abhängig ist. Außerdemv}}:!astyle -bj
paßt meinen Code - Stil besser, aber ich kann es wieder in Ihren Stil mit einem einfachen bekommen%!astyle -aj
gg=G
ist ziemlich ordentlich beim Einfügen von etwas.ggVG=
.quelle
ii
undjj
werden häufig für Zählervariablen verwendet, dai
undj
für komplexe Zahlen reserviert sind.Lassen Sie uns sehen, wie ein hübscher kleiner IDE-Editor die Spaltenumsetzung durchführt.
Erläuterung
\(
und\)
wie man sich an Dinge im Regex-Land erinnert. Und\1
,\2
usw. ist , wie die Erinnerung Sachen zu holen.Denken Sie an alles, gefolgt von
^I
(Tab) gefolgt von allem.Ersetzen Sie das obige Zeug durch "2. Zeug, an das Sie sich erinnert haben", gefolgt von "1. Zeug, an das Sie sich erinnert haben" - im Wesentlichen durch Transponieren.
quelle
Nicht gerade ein dunkles Geheimnis, aber ich möchte die folgende Zuordnung in meine .vimrc-Datei einfügen, sodass ich jederzeit auf "-" (Minus) klicken kann, um den Datei-Explorer zu öffnen und Dateien neben der gerade bearbeiteten anzuzeigen . Im Datei-Explorer kann ich ein anderes "-" drücken, um ein Verzeichnis nach oben zu verschieben und so ein nahtloses Durchsuchen komplexer Verzeichnisstrukturen zu ermöglichen (wie sie heutzutage von den MVC-Frameworks verwendet werden):
Diese können auch für jemanden nützlich sein. Ich mag es, den Bildschirm zu scrollen und gleichzeitig den Cursor zu bewegen:
Tab-Navigation - Ich liebe Tabs und muss einfach zwischen ihnen wechseln können:
Nur unter Mac OS X: Safari-ähnliche Tab-Navigation:
quelle
Ich benutze gerne 'sudo bash' und mein Sysadmin hasst das. Er hat 'sudo' gesperrt, sodass es nur mit einer Handvoll Befehlen (ls, chmod, chown, vi usw.) verwendet werden kann, aber ich konnte vim verwenden, um trotzdem eine Root-Shell zu erhalten:
quelle
Oft ändere ich gerne aktuelle Verzeichnisse während der Bearbeitung - daher muss ich weniger Pfade angeben.
quelle
Ich benutze oft viele Fenster, wenn ich an einem Projekt arbeite, und manchmal muss ich die Größe ändern. Folgendes verwende ich:
Mit diesen Zuordnungen können Sie das aktuelle Fenster vergrößern und verkleinern. Es ist ganz einfach, aber es ist schnell.
quelle
Keine obskure Funktion, aber sehr nützlich und zeitsparend.
Wenn Sie eine Sitzung Ihrer geöffneten Puffer, Registerkarten, Markierungen und anderen Einstellungen speichern möchten, können Sie Folgendes ausgeben:
Sie können Ihre Sitzung öffnen mit:
quelle
:so session.vim
in vim.Fügt die Ausgabe eines externen Befehls in den Puffer ein.
Rechnen Sie nach und erhalten Sie das Ergebnis direkt im Text:
Rufen Sie die Liste der zu kompilierenden Dateien ab, wenn Sie ein Makefile schreiben:
Schauen Sie nicht nach, was Sie auf Wikipedia gelesen haben, sondern lassen Sie es direkt in das Dokument einfügen, das Sie schreiben:
quelle
Ordnen Sie F5 zu, um Ihren Puffer schnell zu verrotten:
Sie können es als Boss-Schlüssel verwenden :).
quelle
nmap i ggg?G``
. Oder das teuflische :nmap i ggg?G``i
!Ich habe diesen heute über NSFAQ gefunden :
Codeblöcke kommentieren.
Rufen Sie den blockweisen visuellen Modus auf, indem Sie STRG-V drücken.
Markieren Sie den Block, den Sie kommentieren möchten.
Drücken Sie I (Großbuchstabe I) und geben Sie Ihre Kommentarzeichenfolge am Anfang der Zeile ein. (// für C ++)
Wenn Sie ESC drücken, werden // alle ausgewählten Zeilen vor die Zeile gestellt.
quelle
git checkout
). Für eine bessere Verwendung des Blockeinsatzes gibt es keine in Stein gemeißelten. Sie verwenden es nur, wenn Sie mehrere Zeilen haben, in die Sie dieselbe Zeichenfolge an derselben Stelle einfügen möchten.Ich verwende vim für fast jede Textbearbeitung, die ich mache, daher verwende ich oft das Kopieren und Einfügen. Das Problem ist, dass vim standardmäßig häufig importierten Text durch Einfügen verzerrt. Der Weg, dies zu stoppen, ist zu verwenden
bevor Sie Ihre Daten einfügen. Dies verhindert, dass es durcheinander kommt.
Beachten Sie, dass Sie Probleme haben müssen
:set nopaste
, um die automatische Einrückung wiederherzustellen. Alternative Möglichkeiten zum Einfügen von vorformatiertem Text sind die Register der Zwischenablage (*
und+
) und:r!cat
(Sie müssen das eingefügte Fragment mit ^ D beenden).Manchmal ist es auch hilfreich, ein kontrastreiches Farbschema zu aktivieren. Dies kann mit erfolgen
Ich habe festgestellt, dass es nicht auf allen von mir verwendeten Versionen von vim funktioniert, aber auf den meisten.
quelle
set paste
oder Angabe eines Schlüssels für diepastetoggle
Option ist eine übliche Methode, um dies zu umgehen. Der gleiche Effekt kann jedoch erzielt werden,set mouse=a
da Vim weiß, dass die angezeigte Textflut eine von der Maus ausgelöste Einfügung ist."*p
zum Einfügen von der X xlipboard. (Es funktioniert auch von Terminal Vim, es ist nur so, dass Sie möglicherweise das GVIM-Paket benötigen, wenn sie getrennt sind)*
ist dasPRIMARY
Register ("Middle-Click"). Die Zwischenablage ist+