Was sind die dunklen Ecken von Vim, von denen deine Mutter dir nie erzählt hat? [geschlossen]

799

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.

Sasha
quelle
10
: Sex Split Fenster und öffnen Sie den integrierten Datei-Explorer (horizontale Aufteilung)
user3218088
2
Diese Frage scheint ziemlich konstruktiv zu sein - wenn man sich die Anzahl der Upvotes ansieht ..., die für die Wiedereröffnung gestimmt haben -, kommt vielleicht eine noch coolere Antwort - die bei Bedarf upvotiert werden kann - und somit SOF mehr Wert verleiht. Die Antworten nach Stimmen sortieren Ich habe in nur 5 Minuten eine Menge cooler Sachen gelernt ... wirklich wertvolle Sachen hier, warum etwas so Wertvolles schließen? Wie ist das nicht konstruktiv?
Jhegedus
7
Lächerlich, dass diese Frage geschlossen ist. Sprechen Sie über Legalismus.
Lepidopterist
2
Ich denke, diese Frage ist sehr konstruktiv, aber bei Quora angemessener.
Diogo Melo
2
Warum gibt es 2 (ab sofort) Stimmen, um diese Frage zu löschen? Was würde es möglicherweise nützen?
Akavall

Antworten:

782

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.

:w !sudo tee %

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.

Skinp
quelle
116
Das ist wohl sogar noch besser als vim als root auszuführen! Upvoted!
Arafangion
27
Was genau macht Tee für einen Noob? Würde es jemandem etwas ausmachen, diesen Befehl für mich zu analysieren?
AndyL
41
cmap w !! w! sudo tee%
jm666
58
Du solltest niemals rennen sudo vim. Stattdessen sollten Sie EDITORals vim exportieren und ausführen sudoedit.
Gerardo Marset
8
@maximus: vim ersetzt% durch den Namen des aktuellen Puffers / der aktuellen Datei.
Migu
617

Etwas, das ich kürzlich entdeckt habe und das ich für sehr cool hielt:

:earlier 15m

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

Chad Birch
quelle
6
@skinp: Wenn Sie den Rückgängig-Status rückgängig machen und dann weitere Änderungen vornehmen, verlieren Sie diesen Wiederherstellungsverlauf. Auf diese Weise können Sie zu einem Zustand zurückkehren, der sich nicht mehr im Rückgängig-Stapel befindet.
Ephemient
39
Sehr nützlich ist auch g + und g-, um in der Zeit vorwärts und rückwärts zu gehen. Dies ist so viel leistungsfähiger als ein Rückgängig / Wiederherstellen-Stapel, da Sie den Verlauf nicht verlieren, wenn Sie nach einem Rückgängigmachen etwas tun.
Etienne PIERRE
9
Sie verlieren den Wiederherstellungsverlauf nicht, wenn Sie nach dem Rückgängigmachen eine Änderung vornehmen. Es ist einfach nicht leicht zugänglich. Es gibt Plugins, die Ihnen helfen, dies zu visualisieren, wie Gundo.vim
Ehtesh Choudhury
559
Wow, jetzt kann ich es einfach tun :later 8hund bin für heute fertig? : P
Igor Popov
7
Ihr Befehl geht davon aus, dass man mindestens 15 Minuten in vim verbringen wird !
e2-e4
411

:! [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:

:.! ls

Ich benutze dies häufig, um beispielsweise das aktuelle Datum in ein Dokument einzufügen, das ich schreibe:

:.! date
Jeffrey Knight
quelle
74
Dies ist ziemlich ähnlich zu: r! Der einzige Unterschied, soweit ich das beurteilen kann, ist: r! öffnet eine neue Zeile,:.! überschreibt die aktuelle Zeile.
Saffsd
6
Eine Alternative dazu :.!datebesteht 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.
Hlovdal
43
:.!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.
Nefrubyr
2
@sundar: Warum eine Zeile an übergeben sed, wenn Sie die ähnlichen integrierten ed/ exBefehle verwenden können? Versuchen Sie zu laufen :.s/old/new/g;-)
Jabirali
4
Und beachte auch, dass '!' ist wie 'y', 'd', 'c' usw. dh Sie können Folgendes tun: !!, number !!,! motion (zB! Gshell_command <cr> von der aktuellen Zeile bis zum Ende der Datei ('G') durch ersetzen Ausgabe von shell_command).
aqn
312

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öschen
  • di( innerhalb der aktuellen Parens zu löschen
  • di" um den Text zwischen den Anführungszeichen zu löschen

Andere finden Sie auf :help text-objects

dbr
quelle
8
tupfen Sie "Löschen von Klammern", daB für lockige Klammern, t für Tags vom Typ XML, Kombinationen mit normalen Befehlen sind wie erwartet cib / yaB / dit / vat usw.
sjh
15
@Masi: yi (va (p löscht nur die Klammern
Don Reba
42
Dies ist möglicherweise der Hauptgrund für mich, bei Vim zu bleiben. Das und seine äquivalenten "Änderungs" -Befehle: ciw, ci (, ci "sowie dt <Leerzeichen> und ct <Leerzeichen>
Thomasrutter
4
@thomasrutter: Warum nicht dW / cW statt dt <Leerzeichen>?
9
@Masi: Mit dem Surround-Plugin: ds (.
237

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, aanstatt iwenn 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 wird w.

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 viwUupercases das Wort

~ - schaltet die Groß- und Kleinschreibung um, um viw~das ganze Wort umzukehren

Strg + 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 dEbis 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 Sstattdessen tun . Es gibt auch eine untere Kappe, sdie das aktuelle Zeichen abschneidet und in den Einfügemodus wechselt.

viwy oder viwc . Ziehen oder ändern Sie das aktuelle Wort. Drücken Sie wmehrmals, um jedes nachfolgende Wort auszuwählen, bund bewegen Sie sich rückwärts

vi { - 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 ewird der Cursor an das Ende des aktuellen und jedes nachfolgenden Wortes gesetzt.

Ähnlich wie bei b/ e, Groß- Bund EKleinschreibung 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).

Ultraman
quelle
15
zt ist sehr nützlich, wenn Sie es zu Beginn einer Funktions- oder Klassendefinition verwenden.
Nick Lewis
9
vityund vitckann verkürzt werden yitund citjeweils.
Nathan Fellman
33
Alles, was Sie "schneiden" nennen, ist "ändern". Beispiel: C wird bis zum Ende der Zeile geändert. Vims Äquivalent zu "cut" ist "delete", erledigt mit d / D. Der Hauptunterschied zwischen Ändern und Löschen besteht darin, dass Sie durch Löschen im normalen Modus bleiben, aber durch Ändern in eine Art Einfügemodus versetzt werden (obwohl Sie sich noch im Änderungsbefehl befinden, was praktisch ist, da die gesamte Änderung mit wiederholt werden kann .).
Laurence Gonsalves
11
Ich dachte, dies sei eine Liste von Dingen, die nicht viele Menschen kennen. yy ist sehr verbreitet, hätte ich gedacht.
Almo
19
byefunktioniert nicht, wenn Sie sich im ersten Zeichen des Wortes befinden. yiwmacht immer.
Andrea Francia
204

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.

Xavier Guardiola
quelle
29
In ähnlicher Weise '.wird zur zuletzt bearbeiteten Zeile und `.zur zuletzt bearbeiteten Position
gewechselt
8
Strg-O und Strg-I (Registerkarte) funktionieren ähnlich, aber nicht gleich. Sie bewegen sich in der "Sprungliste" vor und zurück, die Sie anzeigen können, indem Sie Folgendes tun: Sprünge oder: ju Für weitere Informationen machen Sie eine: Hilfe-Jumplist
Kimball Robinson
17
Sie können die Änderungsliste auflisten, indem Sie Folgendes tun: Änderungen
Kimball Robinson
Hot Dang, das ist nützlich. Ich benutze <C-o>/ <C-i>dafür die ganze Zeit - oder markiere meinen Platz.
Wayne Werner
187
:%!xxd

Machen Sie vim zu einem Hex-Editor.

:%!xxd -r

Zurückkehren.

Warnung: Wenn Sie nicht mit Binär (-b) bearbeiten, kann die Datei beschädigt werden. - Josh Lee in den Kommentaren.

sharth
quelle
9
Und wie können Sie es zurücksetzen?
Christian
40
:! xxd -r // Um ​​von HEX zurückzukehren
Naga Kiran
21
Ich denke tatsächlich, es ist :%!xxd -r, es zurückzusetzen
Andreas Grech
@JoshLee: Wenn man darauf achtet, keine Zeilenumbrüche zu durchlaufen, ist es sicher, die Option -b nicht zu verwenden? Ich frage, weil ich manchmal eine Hex-Änderung vornehmen möchte, aber ich möchte die Datei nicht schließen und erneut öffnen, um dies zu tun.
Dotancohen
4
@dotancohen: Wenn Sie die Datei nicht schließen / erneut öffnen möchten, können Sie Folgendes tun: Binär einstellen
Bambu
129
gv

Wählt die letzte visuelle Auswahl erneut aus.

AaronS
quelle
119

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:

:verbose set cindent?

Dies gibt ungefähr Folgendes aus:

cindent
    Last set from /usr/share/vim/vim71/indent/c.vim

Dies funktioniert auch mit Karten und Highlights. (Danke joeytwiddle für den Hinweis.) Zum Beispiel:

:verbose nmap U
n  U             <C-R>
        Last set from ~/.vimrc

:verbose highlight Normal
Normal         xxx guifg=#dddddd guibg=#111111 font=Inconsolata Medium 14
        Last set from ~/src/vim-holodark/colors/holodark.vim
Laurence Gonsalves
quelle
8
Hervorragender Tipp - genau das, wonach ich heute gesucht habe.
Artem Russakovskii
Hervorragender Tipp Mann! Wie lernst du diese geekigen Dinge kennen?
Rafid
1
:verbosekann auch verwendet werden, bevor nmap loder highlight Normalum herauszufinden, wo die lKeymap oder das NormalHighlight zuletzt definiert wurden. Sehr nützlich zum Debuggen!
Joeytwiddle
@joeytwiddle Danke! Ich habe diese Informationen zur Antwort hinzugefügt.
Laurence Gonsalves
Wenn Sie anfangen, benutzerdefinierte Zuordnungen zu erstellen, wird dies Ihren Arsch so oft retten, wahrscheinlich eine der nützlichsten hier (IMO)!
SidOfc
98

Ich bin mir nicht sicher, ob dies überhaupt als dunkle Ecke gilt, aber ich habe es gerade erst gelernt ...

:g/match/y A

zieht (kopiert) alle Zeilen, die "match" enthalten, in das Register "a/ @a. (Die Kapitalisierung als AMarken vim append yankings statt der bisherigen Registerinhalte ersetzt werden .) Habe ich es viel vor kurzem , als Internet Explorer Sheets zu machen.

sjh
quelle
zählt, zählt, da ich diesen nicht gesehen habe :)
Schön. Noch nie davon gehört ...
Könnte
5
Sie können verwenden: g! um Zeilen zu finden, die nicht mit einem Muster übereinstimmen, z. B.: g! / set / normal dd (alle Zeilen löschen, die set nicht enthalten)
tsukimi
3
Manchmal ist es besser, das zu tun, was Tsukimi gesagt hat, und einfach Linien herauszufiltern, die nicht zu Ihrem Muster passen. Eine abgekürzte Version dieses Befehls: :v/PATTERN/dErläuterung: :vist eine Abkürzung für :g!, und der :gBefehl 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].
Pandubear
Sie können dies auch tun :g/match/normal "Ayy- mit dem normalSchlüsselwort können Sie festlegen, dass Befehle im normalen Modus ausgeführt werden sollen (mit denen Sie wahrscheinlich besser vertraut sind).
Kimball Robinson
93

Möchten Sie sich Ihren Befehlsverlauf ansehen?

q:

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?)

:set hidden
:map <TAB> :e#<CR>

Wechseln Sie dann zwischen diesen Dateien hin und her.

MikeyB
quelle
131
Ich habe die q:ganze Zeit versehentlich getroffen ...
Josh Lee
11
Alternativ können Sie im Ex-Editor (:) STRG-F drücken, um das Befehlsverlaufsfenster aufzurufen.
Jason Down
6
@jleedev mich auch. Ich hasse diesen Befehl fast, nur weil ich ihn versehentlich viel zu oft benutze.
Bradlis7
9
q / und q? kann verwendet werden, um etwas Ähnliches für Ihre Suchmuster zu tun.
bpw1621
5
Wenn Sie <Cf> nach: oder / drücken (oder wenn Sie sich im Befehlsmodus befinden), wird dasselbe Verlaufsmenü angezeigt. Sie können also q neu zuordnen: Wenn Sie versehentlich viel getroffen haben und trotzdem auf diesen fantastischen Modus zugreifen.
idbrii
82

Vim öffnet beispielsweise eine URL

vim http://stackoverflow.com/

Schön, wenn Sie die Quelle einer Seite als Referenz aufrufen müssen.

Cercerilla
quelle
2
Für mich hat es die Quelle nicht geöffnet; Stattdessen wurden anscheinend elinks verwendet, um gerenderte Seiten in einen Puffer zu kopieren, und dieser wurde dann geöffnet.
Ivan Vučica
Es gibt einen Fehler bei der Ausführung dieses Befehls
Dzung Nguyen
5
Funktioniert besser mit einem Schrägstrich am Ende. Ordentlicher Trick!
Thomas
@Vdt: Es wäre nützlich, wenn Sie Ihren Fehler posten würden. Wenn dies der Fall ist : " Fehler (netrw), weder der Befehl wget noch der Befehl fetch sind verfügbar", müssen Sie offensichtlich eines dieser Tools in Ihrer Umgebungsvariablen PATH verfügbar machen.
Isaac Nequittepas
Ich finde dies besonders nützlich, wenn Leute Links an einen Einfügedienst senden und vergessen haben, eine Syntaxhervorhebung auszuwählen. Im Allgemeinen muss ich den Link nur in vim öffnen, nachdem ich "& raw" angehängt habe.
Dettorer
68

Makros können andere Makros aufrufen und sich selbst aufrufen.

z.B:

qq0dwj@qq@q

... 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

spence91
quelle
2
Ich wusste nicht, dass sich Makros wiederholen können. Cool. Hinweis: qx beginnt mit der Aufzeichnung in Register x (er verwendet qq für Register q). 0 bewegt sich zum Zeilenanfang. dw löscht ein Wort. j bewegt sich eine Linie entlang. @q führt das Makro erneut aus (Definition einer Schleife). Sie haben jedoch vergessen, die Aufnahme mit einem abschließenden "q" zu beenden und dann das Makro durch Eingabe von @q auszuführen.
Kimball Robinson
2
Ich denke, das ist beabsichtigt, als verschachteltes und rekursives Makro.
Yktula
7
qqqqqifuu<Esc>h@qq@q
Gerardo Marset
6
Eine andere Möglichkeit, dies zu erreichen, besteht darin, ein Makro in Register a aufzuzeichnen, das eine Transformation in eine einzelne Zeile durchführt, und dann eine Reihe von Zeilen mit V in Zeilenrichtung hervorzuheben und :normal! @aeinzugeben, um Ihr Makro auf jede Zeile in Ihrer Auswahl anzuwenden.
Nathan Long
Ich fand diesen Beitrag, der rekursive VIM-Makros googelt. Ich konnte keine andere Möglichkeit finden, das Makro zu stoppen, als den VIM-Prozess zu beenden.
Dotancohen
55

Angenommen, Sie haben Perl- und / oder Ruby-Unterstützung kompiliert :rubydound :perldofü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:

:perldo $_ = join ' ', reverse split

So fügen Sie am Ende jeder Zeile eine zufällige Zeichenfolge mit 8 Zeichen (AZ) ein:

:rubydo $_ += ' ' + (1..8).collect{('A'..'Z').to_a[rand 26]}.join

Sie können nur eine Zeile gleichzeitig bearbeiten und keine neuen Zeilen hinzufügen.

Brian Carper
quelle
Was ist, wenn ich möchte, dass Perldo nur in einer bestimmten Zeile ausgeführt wird? oder ein paar ausgewählte Zeilen?
Sujoy
5
Sie können ihm einen Bereich wie jedem anderen Befehl geben. Zum Beispiel: 1,5perldo wird nur auf den Linien 1-5 betrieben.
Brian Carper
Könnten Sie $ _ + = '\ nNEWLINE !!!' um eine neue Zeile nach der aktuellen zu bekommen?
Greg
Leider nicht, es fügt dem Ende der Zeile nur einen funky Steuercharakter hinzu. Sie können dann eine Vim-Suche / Ersetzung verwenden, um alle diese Steuerzeichen in echte Zeilenumbrüche umzuwandeln.
Brian Carper
3
Ebenso pydound py3doarbeiten Sie für Python, wenn Sie die erforderliche Unterstützung kompiliert haben.
Derecho
54

^ 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:

  • Drücken Sie ^ Z (um vi in ​​den Hintergrund zu stellen), um zur ursprünglichen Shell zurückzukehren, und drücken Sie fg, um zu vim zurückzukehren
  • Drücken Sie: sh, um zur Sub-Shell zu gelangen, und drücken Sie ^ D / exit, um zu vi zurückzukehren
dimba
quelle
Bei ^X^Fmeinem 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 benutze se isfname-==, um dieses Ärgernis zu beenden
sehe
3
+1 Die eingebaute Autovervollständigung sitzt nur da und wartet darauf, entdeckt zu werden.
Joeytwiddle
48
" insert range ip's
"
"          ( O O )
" =======oOO=(_)==OOo======

:for i in range(1,255) | .put='10.0.0.'.i | endfor
Benutzer107745
quelle
2
Ich verstehe nicht, wofür das gut ist (abgesehen davon, dass es wie eine Scherzantwort aussieht). Kann mich sonst noch jemand aufklären?
Ryan Edwards
2
öffne vim und mache dann ": für i im Bereich (1.255) | .put = '10 .0.0. '. i | endfor"
codygman
2
@ RyanEdwards Füllung / etc / Hosts vielleicht
Ruslan
26
Dies ist eine großartige Antwort. Nicht das Bit zum Erstellen der IP-Adressen, sondern das Bit, das impliziert, dass VIM für Schleifen in Befehlen verwendet werden kann .
Dotancohen
4
Ohne Ex-Modus:i10.0.0.1<Esc>Y254p$<C-v>}g<C-a>
BlackCap
47

Dies ist ein guter Trick, um die aktuelle Datei mit einer anderen Codierung erneut zu öffnen:

:e ++enc=cp1250 %:p

Nützlich, wenn Sie mit Legacy-Codierungen arbeiten müssen. Die unterstützten Codierungen sind in einer Tabelle unter encoding-values(siehe help 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 (siehe help ff).

Zoul
quelle
Ich musste so etwas nie benutzen, aber wir werden sicherlich mein Arsenal an Tricks erweitern ...
toller Tipp, danke. Fügen Sie für Bonuspunkte eine Liste allgemein gültiger Codierungen hinzu.
Adriano Varoli Piazza
2
Ich habe dies heute verwendet, aber ich glaube, ich musste nicht "%: p" angeben; Nur die Datei zu öffnen und: e ++ enc = cp1250 war genug. I
Ivan Vučica
würde: set encoding = cp1250 den gleichen Effekt haben?
Laz
1
`: e + b% 'ist ähnlich nützlich für das Wiedereröffnen im Binärmodus (kein Munging von Zeilenumbrüchen)
intuitiv
47

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 {:

if (thisA == that) {
//not indented
if (some == other) {
x = y;
}
}

Und drücken Sie =% , um dies sofort zu erhalten:

if (thisA == that) {
    //not indented
    if (some == other) {
        x = y;
    }
}

Alternativ können Sie = a { innerhalb des Codeblocks ausführen, anstatt sich direkt auf dem {-Zeichen zu positionieren.

Kimball Robinson
quelle
Hm, ich wusste das nicht über die Einrückung.
Ehtesh Choudhury
Normalerweise müssen Sie nicht genau auf den Zahnspangen sitzen. Ich dachte häufig, ich würde nur =}oder vaBaB=weil es weniger abhängig ist. Außerdem v}}:!astyle -bjpaßt meinen Code - Stil besser, aber ich kann es wieder in Ihren Stil mit einem einfachen bekommen%!astyle -aj
sähe
7
gg=Gist ziemlich ordentlich beim Einfügen von etwas.
Cyrias
@kyrias Oh, ich habe es so gemacht ggVG=.
Braden Best
42
imap jj <esc>
Trumpi
quelle
7
Wie wirst du dann jj eingeben? : P
hasen
6
Wie oft tippst du jj? Zumindest auf Englisch?
Ojblass
50
Ich habe stattdessen den Capslock auf esc neu zugeordnet, da es sich um einen ansonsten nutzlosen Schlüssel handelt. Mein Mapping war jedoch betriebssystemweit, sodass es den zusätzlichen Vorteil hat, dass ich mir keine Sorgen machen muss, es versehentlich zu treffen. Der einzige Nachteil ist, dass es schwieriger ist, Menschen anzuschreien. :)
Alex
7
@ Alex: Auf jeden Fall ist Capslock der Tod. "warte, wtf? oh, das war ZZ? .... Mist."
Intuitiert
5
@ojblass: Ich bin mir nicht sicher, wie viele Personen jemals Matlab-Code in Vim richtig eingestellt haben, aber iiund jjwerden häufig für Zählervariablen verwendet, da iund jfür komplexe Zahlen reserviert sind.
Brianmearns
37

Lassen Sie uns sehen, wie ein hübscher kleiner IDE-Editor die Spaltenumsetzung durchführt.

:%s/\(.*\)^I\(.*\)/\2^I\1/

Erläuterung

\(und \)wie man sich an Dinge im Regex-Land erinnert. Und \1, \2usw. ist , wie die Erinnerung Sachen zu holen.

>>> \(.*\)^I\(.*\)

Denken Sie an alles, gefolgt von ^I(Tab) gefolgt von allem.

>>> \2^I\1

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.

Jeffrey Jose
quelle
4
Schaltet ein Paar von durch Tabulatoren getrennten Spalten (Trennzeichen willkürlich, es ist alles Regex) miteinander.
Chaos
39
Dies ist nur eine Regex; Viele IDEs haben Regex-Suchen und Ersetzen.
Rlbond
7
@rlbond - Es kommt darauf an, wie gut die Regex-Engine in der IDE ist. Vims Regexe sind ziemlich mächtig; andere .. manchmal nicht so sehr.
Romandas
3
Das * wird gierig sein, daher geht dieser reguläre Ausdruck davon aus, dass Sie nur zwei Spalten haben. Wenn Sie möchten, dass es nicht gierig ist, verwenden Sie {-} anstelle von * (weitere Informationen zum Multiplikator {} finden Sie unter: Nicht gierig helfen)
Kimball Robinson
4
Dies ist eigentlich ein ziemlich einfacher regulärer Ausdruck, der nur den Gruppenklammern entgeht und ihn kompliziert aussehen lässt.
mk12
30

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):

map - :Explore<cr>

Diese können auch für jemanden nützlich sein. Ich mag es, den Bildschirm zu scrollen und gleichzeitig den Cursor zu bewegen:

map <c-j> j<c-e>
map <c-k> k<c-y>

Tab-Navigation - Ich liebe Tabs und muss einfach zwischen ihnen wechseln können:

map <c-l> :tabnext<enter>
map <c-h> :tabprevious<enter>

Nur unter Mac OS X: Safari-ähnliche Tab-Navigation:

map <S-D-Right> :tabnext<cr>
map <S-D-Left> :tabprevious<cr>
KKovacs
quelle
Sie können auch Dateien in Vim selbst durchsuchen, indem Sie
Folgendes
Hallo Roman, genau das macht dieses Mapping, weist es aber einem "Hotkey" zu. :)
KKovacs
27

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:

bash$ sudo vi +'silent !bash' +q
Password: ******
root#
zu viel PHP
quelle
9
FWIW, sudoedit (oder sudo -e) bearbeitet privilegierte Dateien, führt jedoch Ihren Editor als normalen Benutzer aus.
RJHunter
12
yeah ... ich würde dich auch hassen;) du solltest nur SEHR SELTEN eine Root-Shell brauchen, es sei denn, du hast bereits die Angewohnheit, zu viele Befehle als root auszuführen, was bedeutet, dass deine Berechtigungen alle durcheinander sind.
Wir sind alle Monica
5
Warum gibt dir dein Sysadmin überhaupt Wurzel? : D
d33tah
26

Oft ändere ich gerne aktuelle Verzeichnisse während der Bearbeitung - daher muss ich weniger Pfade angeben.

cd %:h
Rampion
quelle
Was macht das? Und funktioniert es mit autchdir?
Leonard
2
Ich nehme an, es würde Autochdir vorübergehend überschreiben (bis Sie die Puffer wieder gewechselt haben). Grundsätzlich wird das Verzeichnis in das Stammverzeichnis der aktuellen Datei geändert. Es gibt mir ein bisschen mehr manuelle Kontrolle als Autochdir.
Rampion
1
: set autochdir // dies dient auch der gleichen Funktionalität und es ändert das aktuelle Verzeichnis in das der Datei im Puffer
Naga Kiran
25

Ich benutze oft viele Fenster, wenn ich an einem Projekt arbeite, und manchmal muss ich die Größe ändern. Folgendes verwende ich:

map + <C-W>+
map - <C-W>-

Mit diesen Zuordnungen können Sie das aktuelle Fenster vergrößern und verkleinern. Es ist ganz einfach, aber es ist schnell.

Stier Olson
quelle
16
Es gibt auch Strg-W =, wodurch die Fenster gleich breit sind.
Bill Lynch
2
Vergessen Sie nicht, dass Sie Zahlen voranstellen können, um eine Aktion in Vim mehrmals auszuführen. Also, um die aktuelle Fensterhöhe um 8 Zeilen zu erweitern: 8 <CW> +
joeytwiddle
23

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:

mksession session.vim

Sie können Ihre Sitzung öffnen mit:

vim -S session.vim
mohi666
quelle
5
Sie können auch :so session.vimin vim.
TankorSmash
22
:r! <command>

Fügt die Ausgabe eines externen Befehls in den Puffer ein.

Rechnen Sie nach und erhalten Sie das Ergebnis direkt im Text:

:r! echo $((3 + 5 + 8))

Rufen Sie die Liste der zu kompilierenden Dateien ab, wenn Sie ein Makefile schreiben:

:r! ls *.c

Schauen Sie nicht nach, was Sie auf Wikipedia gelesen haben, sondern lassen Sie es direkt in das Dokument einfügen, das Sie schreiben:

:r! lynx -dump http://en.wikipedia.org/wiki/Whatever
Roberto Bonvallet
quelle
14
^ R = 3 + 5 + 8 im Einfügemodus ermöglicht es Ihnen, den Wert des Ausdrucks (3 + 5 + 8) in Text mit weniger Tastenanschlägen einzufügen.
Sudhanshu
Wie kann ich das Ergebnis / die Ausgabe in einen anderen Puffer als den aktuellen bringen?
dcn
21

Ordnen Sie F5 zu, um Ihren Puffer schnell zu verrotten:

map <F5> ggg?G``

Sie können es als Boss-Schlüssel verwenden :).

jqno
quelle
14
Ich weiß nicht, was Sie schreiben ... Aber mein Chef wäre sicherlich neugieriger, wenn er mich ROT13-Durcheinander schreiben sehen würde :)
sehe
oder um deine Freunde zu fälschen : nmap i ggg?G`` . Oder das teuflische : nmap i ggg?G``i!
Romeovs
1
@ Romeovs 2. ist Endlosschleife, verwenden Sie nnoremap
Amit Gold
19

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.

Grant Limberg
quelle
Ich habe # hinzugefügt, um einen Codeblock in Ruby zu kommentieren. Wie mache ich es rückgängig?
Neeraj Singh
3
Sie können einfach erneut Strg + V drücken, die // markieren und x drücken, um "zu kommentieren"
Nr.
6
Ich benutze dafür NERDCommenter.
ZyX
1
Auskommentierter Code ist wahrscheinlich eine der schlechtesten Arten von Kommentaren, die Sie möglicherweise in Ihren Code einfügen könnten. Es gibt bessere Verwendungsmöglichkeiten für den fantastischen Blockeinsatz.
Braden Best
1
@Pie, weil auskommentierter Code toter Code ist . Toter Code dient keinem nützlichen Zweck und schafft Unordnung. Sie denken, Sie behalten Code bei, den Sie später zurückbringen möchten, aber es gibt immer einen besseren Weg. Sie können Ihren Rückgängig-Verlauf verwenden, die Datei betrügen oder git verwenden, in das diese Funktionalität integriert ist ( 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.
Braden Best
17

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

:set paste

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

:color blue

Ich habe festgestellt, dass es nicht auf allen von mir verwendeten Versionen von vim funktioniert, aber auf den meisten.

Ian H.
quelle
10
Die "Verzerrung" tritt auf, weil Sie eine Form der automatischen Einrückung aktiviert haben. Die Verwendung set pasteoder Angabe eines Schlüssels für die pastetoggleOption ist eine übliche Methode, um dies zu umgehen. Der gleiche Effekt kann jedoch erzielt werden, set mouse=ada Vim weiß, dass die angezeigte Textflut eine von der Maus ausgelöste Einfügung ist.
Jamessan
1
Wenn Sie gvim installiert haben, können Sie häufig (obwohl dies von Ihren Optionen abhängt, mit denen Ihre Distribution vim kompiliert) die X-Zwischenablage direkt von vim über das * -Register verwenden. Zum Beispiel "*pzum 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)
Cyrias
2
@kyrias für den Datensatz *ist das PRIMARYRegister ("Middle-Click"). Die Zwischenablage ist+
Braden Best