Vim mehrzeilige Bearbeitung wie im Sublimetext?

132

Ich habe angefangen, gvim zu verwenden, und ich kann nicht ganz verstehen, wie die mehrzeilige Bearbeitung in gvim funktioniert.

Beispielsweise:

Original Text:

asd asd asd asd asd;
asd asd asd asd asd;
asd asd asd asd asd;
asd asd asd asd asd;
asd asd asd asd asd;
asd asd asd asd asd;
asd asd asd asd asd;

Strg + q, jjjjjj, $ alles ist ausgewählt, dann drücke ich I, um eine mehrzeilige Einfügung durchzuführen.

Meine Absicht ist es, Anführungszeichen wie in der ersten Zeile einzufügen und dann Esc zu drücken:

asd "asd asd" asd asd;
asd asd asd asd asd;
asd asd asd asd asd;
asd asd asd asd asd;
asd asd asd asd asd;
asd asd asd asd asd;
asd asd asd asd asd;

Was ist passiert? Ich habe ein ähnliches Verhalten wie das von Sublimetext erwartet:

Geben Sie hier die Bildbeschreibung ein

Wenn Sie nicht wissen, wie das funktioniert, werden die Aktionen für jede Zeile wiederholt. Wie kann das erreicht werden? Und was macht vim hier?

AlfredoVR
quelle
Nehmen Sie einfach ein Tastaturmakro auf, um die erste Zeile zu ändern, und spielen Sie das Makro dann für alle anderen Zeilen ab.
High5

Antworten:

213

Tun Sie sich selbst einen Gefallen, indem Sie die Windows-Kompatibilitätsebene löschen.

Die normale Verknüpfung zum Aufrufen des Visual-Block-Modus lautet <C-v>.

Andere haben sich mit Aufnahmemakros befasst, hier einige andere Ideen:

Verwenden Sie nur den Visual-Block- Modus.

  1. Setzen Sie den Cursor auf das zweite Wort:

    asd |a|sd asd asd asd;
    asd asd asd asd asd;
    asd asd asd asd asd;
    asd asd asd asd asd;
    asd asd asd asd asd;
    asd asd asd asd asd;
    asd asd asd asd asd;
    
  2. Drücken Sie, <C-v>um in den Visual-Block- Modus zu wechseln und Ihre Auswahl nach unten zu erweitern:

    asd [a]sd asd asd asd;
    asd [a]sd asd asd asd;
    asd [a]sd asd asd asd;
    asd [a]sd asd asd asd;
    asd [a]sd asd asd asd;
    asd [a]sd asd asd asd;
    asd [a]sd asd asd asd;
    
  3. Hit um I"<Esc>zu erhalten:

    asd "asd asd asd asd;
    asd "asd asd asd asd;
    asd "asd asd asd asd;
    asd "asd asd asd asd;
    asd "asd asd asd asd;
    asd "asd asd asd asd;
    asd "asd asd asd asd;
    
  4. Setzen Sie den Cursor auf das letzte Zeichen des dritten Wortes:

    asd "asd as|d| asd asd;
    asd "asd asd asd asd;
    asd "asd asd asd asd;
    asd "asd asd asd asd;
    asd "asd asd asd asd;
    asd "asd asd asd asd;
    asd "asd asd asd asd;
    
  5. Drücken Sie, <C-v>um in den Visual-Block- Modus zu wechseln und Ihre Auswahl nach unten zu erweitern:

    asd "asd as[d] asd asd;
    asd "asd as[d] asd asd;
    asd "asd as[d] asd asd;
    asd "asd as[d] asd asd;
    asd "asd as[d] asd asd;
    asd "asd as[d] asd asd;
    asd "asd as[d] asd asd;
    
  6. Hit um A"<Esc>zu erhalten:

    asd "asd asd" asd asd;
    asd "asd asd" asd asd;
    asd "asd asd" asd asd;
    asd "asd asd" asd asd;
    asd "asd asd" asd asd;
    asd "asd asd" asd asd;
    asd "asd asd" asd asd;
    

Mit Visual-Block- Modus und Surround.vim .

  1. Setzen Sie den Cursor auf das zweite Wort:

    asd |a|sd asd asd asd;
    asd asd asd asd asd;
    asd asd asd asd asd;
    asd asd asd asd asd;
    asd asd asd asd asd;
    asd asd asd asd asd;
    asd asd asd asd asd;
    
  2. Drücken Sie, <C-v>um in den Visual-Block- Modus zu wechseln und Ihre Auswahl nach unten und rechts zu erweitern:

    asd [asd asd] asd asd;
    asd [asd asd] asd asd;
    asd [asd asd] asd asd;
    asd [asd asd] asd asd;
    asd [asd asd] asd asd;
    asd [asd asd] asd asd;
    asd [asd asd] asd asd;
    
  3. Drücken Sie S", um Ihre Auswahl mit "zu umgeben:

    asd "asd asd" asd asd;
    asd "asd asd" asd asd;
    asd "asd asd" asd asd;
    asd "asd asd" asd asd;
    asd "asd asd" asd asd;
    asd "asd asd" asd asd;
    asd "asd asd" asd asd;
    

Mit Visual-Line- Modus und :normal.

  1. Drücken Sie V, um die gesamte Zeile auszuwählen und nach unten zu erweitern:

    [asd asd asd asd asd;]
    [asd asd asd asd asd;]
    [asd asd asd asd asd;]
    [asd asd asd asd asd;]
    [asd asd asd asd asd;]
    [asd asd asd asd asd;]
    [asd asd asd asd asd;]
    
  2. Führen Sie diesen Befehl aus: um :'<,'>norm ^wi"<C-v><Esc>eea"<CR>zu erhalten:

    asd "asd asd" asd asd;
    asd "asd asd" asd asd;
    asd "asd asd" asd asd;
    asd "asd asd" asd asd;
    asd "asd asd" asd asd;
    asd "asd asd" asd asd;
    asd "asd asd" asd asd;
    
    • :norm[al]Ermöglicht die Ausführung von Normalmodusbefehlen in einer Reihe von Zeilen (der '<,'>Teil wird automatisch von Vim hinzugefügt und bedeutet "auf den ausgewählten Bereich einwirken").

    • ^ setzt den Cursor auf das erste Zeichen der Zeile

    • w bewegt sich zum nächsten Wort

    • i"fügt ein "vor dem Cursor ein

    • <C-v><Esc>ist der Weg der Vim ein Steuerzeichen in diesem Zusammenhang an dem Eingang, hier ist es <Esc>zum Ausgang verwendet Insert - Modus

    • ee bewegt sich zum Ende des nächsten Wortes

    • a"Hängt ein "nach dem Cursor an

    • <CR> führt den Befehl aus

    Mit Surround.vim wird der obige Befehl

    :'<,'>norm ^wvees"<CR>
    
romainl
quelle
7
Für die Schritte 4 und 5 würde ich empfehlen, gvzu drücken , um Ihre vorherige visuelle Auswahl wiederherzustellen, und sich dann horizontal zu bewegen, vielleicht mit 2e. (Je mehr Zeilen, desto wertvoller gvist!)
joeytwiddle
4
Surround.vim verwendet einen kleinen sim normalen Modus, aber einen großen Sim visuellen Modus, daher sollten in Schritt 3 der Surround.vim-Methode die Tastenanschläge seinS"
joeytwiddle
1
Punkt 3 von Visual-Block + Surround.vim sollte sein S", nichts"
Zool
1
Anstelle der Schritte 5 und 6 im Visual-Block-Modus können Sie einfach den Cursor nach dem dritten Wort setzen und drücken ..
Jonas
2
Das ist cool, funktioniert aber nur in einigen Fällen, in denen sich die Zeichen, die Sie in den verschiedenen Zeilen bearbeiten möchten, in jeder Zeile genau an der gleichen horizontalen Position befinden und die bearbeiteten Zeilen nacheinander richtig sind. Können wir nicht auswählen, wo im Bearbeitungsmodus in welcher Zeile in Vim eingegeben werden soll? Wir können in Sublim ... EDIT: Eigentlich ist die zweite Antwort, wonach ich gesucht habe
Alexandre Bourlier
30

Dies sind einige gute Out-of-the-Box-Lösungen, die oben angegeben wurden. Wir können jedoch auch einige Plugins ausprobieren, die mehrere Cursor wie Sublime bereitstellen.

Ich denke, dieser sieht vielversprechend aus:

Es schien für eine Weile aufgegeben zu sein, hat aber 2014 einige Beiträge geleistet.

Es ist ziemlich mächtig, obwohl ich eine Weile gebraucht habe, um mich an den Fluss zu gewöhnen (der ziemlich erhaben ist, aber immer noch modal wie Vim).

Wenn Sie nach meiner Erfahrung viele andere Plugins installiert haben, können Konflikte auftreten!

Es gibt einige andere Versuche mit dieser Funktion:

Bitte zögern Sie nicht zu bearbeiten, wenn Sie feststellen, dass eine dieser Verbesserungen vorgenommen wird.

joeytwiddle
quelle
Es sieht so aus, als ob github.com/osyo-manga/vim-over derzeit der aktivste ist.
Wernight
Ausgezeichnet, das habe ich gesucht
Alexandre Bourlier
1
Nachdem die meisten von ihnen getestet wurden, scheint hlissner / vim-multiedit der beste AFAIAC zu sein
Alexandre Bourlier
1
Überprüfen Sie mg979 / vim-visual-multi als guten Ersatz für vim-multiple-Cursor
Mushex Antaranian
29

Es gibt verschiedene Möglichkeiten, dies in Vim zu erreichen. Ich weiß allerdings nicht, welche Sublime Text am ähnlichsten sind.


Der erste wäre über den mehrzeiligen Einfügemodus . Setzen Sie Ihren Cursor auf das zweite "a" in der ersten Zeile, drücken Sie Ctrl-V, wählen Sie alle Zeilen aus, drücken Sie Iund geben Sie ein doppeltes Anführungszeichen ein. Durch Drücken von <esc>wird der Vorgang in jeder Zeile wiederholt.


Der zweite ist über Makros. Setzen Sie den Cursor auf das erste Zeichen und beginnen Sie mit der Aufnahme eines Makros mit qa. Gehen Sie mit nach rechts llll, arufen Sie den Einfügemodus mit auf , setzen Sie ein doppeltes Anführungszeichen, beenden Sie den Einfügemodus und kehren Sie mit <home>(oder einem gleichwertigen) zum Anfang Ihrer Zeile zurück . Drücken Sie j, um eine Zeile nach unten zu gehen. Beenden Sie die Aufnahme mit q. Und dann das Makro mit abspielen @a. Mehrmals.


Funktioniert einer der oben genannten Ansätze für Sie?

Turm
quelle
15

Wenn Sie den Befehl "global" verwenden, können Sie wiederholen, was Sie online in einer beliebigen Anzahl von Zeilen tun können.

:g/<search>/.<your ex command>

Beispiel:

:g/foo/.s/bar/baz/g

Der obige Befehl findet alle Zeilen mit foo und ersetzt alle Vorkommen von Balken in dieser Zeile durch baz.

:g/.*/

wird in jeder Zeile tun

srini.venigalla
quelle
1
Das ist so nützlich, ich wusste es nicht. Scheint so mächtig und clever Kombination von Befehlen.
0xc0de
Der Einfachheit halber habe ich eine kleine Funktion geschrieben, die das Wort unter den Cursor (oder das visuell ausgewählte Wort) nimmt, nach einem Ersatz fragt und dann den :ghier beschriebenen Befehl ausführt. Ich möchte verwenden /gc, um nach "Bestätigungen" zu fragen, damit ich sie treffen yoder nfür jeden Ersatz oder aalle ändern kann.
Joeytwiddle
11
Ctrl-v ................ start visual block selection
6j .................... go down 6 lines
I" .................... inserts " at the beginning
<Esc><Esc> ............ finishes start
2fdl. ................. second 'd' l (goes right) . (repeats insertion)
SergioAraujo
quelle
In Schritt 3, Ikann nicht in den Einfügemodus wechseln, wissen Sie, warum dies passiert?
Ninja
Versuchen Sie, vim ohne Plugins zu laden: vim -u NONEund versuchen Sie erneut, die gewünschte Aktion auszuführen. Möglicherweise handelt es sich um eine Map oder ein Plugin, die das Verhalten Ihres vim ändern.
SergioAraujo
6

Ich bin nicht sicher, was vimtut, aber es ist ein interessanter Effekt. Die Art und Weise, wie Sie beschreiben, was Sie möchten, klingt eher nach der Funktionsweise von Makros ( :help macro). So etwas würde mit Makros machen (was im normalen Modus beginnt):

  1. qa: Makro aufzeichnen a Registrierung .
  2. 0w: 0gehe zum Zeilenanfang,w springe ein Wort.
  3. i"<Esc>: In den Einfügemodus wechseln, einfügen " und kehren Sie zum normalen Modus zurück.
  4. 2e: Zum Ende des zweiten Wortes springen.
  5. a"<Esc>: Fügen Sie a hinzu " .
  6. jq Gehen Sie zur nächsten Zeile und beenden Sie die Makroaufnahme.

Zusammen genommen: qa0wi"<Esc>2ea"<Esc>

Jetzt können Sie das Makro mit ausführen @a letzte Makro mit wiederholen @@. Um auf den Rest der Datei anzuwenden, gehen Sie wie folgt vor99@a folgt vor, vorausgesetzt, Sie haben nicht mehr als 99 Zeilen. Die Makroausführung wird beendet, wenn das Dateiende erreicht ist.

So erreichen Sie, was Sie wollen visual-block-mode (beginnend im normalen Modus):

  1. Navigieren Sie zu der Stelle, an der sich das erste Zitat befinden soll.
  2. Eingeben visual-block-mode , wählen Sie die Linien aus, die Sie beeinflussen möchten.G um zum Ende der Datei zu gelangen.
  3. Schlagen I"<Esc> .
  4. Gehen Sie zum nächsten Punkt, den Sie einfügen möchten " .
  5. Sie möchten wiederholen, was Sie gerade getan haben, damit ein einfacher .Wille ausreicht.
Thor
quelle
4
Keine Notwendigkeit für 99 @ a. Wenn Sie in jeder Zeile einer Datei ein Makro ausführen möchten, versuchen Sie:% norm! @ein.
Turm
Ohne die Punkte (sie sind nur Satzenden, nicht Teil der Befehle)
Rook
9999@amag hässlich sein, ist aber viel einfacher zu tippen als :%norm! @aund wird in der gerade bearbeiteten Zeile nicht erneut ausgeführt. Trotzdem gut zu wissen. :)
joeytwiddle
0

Meine Lösung besteht darin, diese 2 Zuordnungen zu verwenden:

map <leader>n <Esc><Esc>0qq
map <leader>m q:'<,'>-1normal!@q<CR><Down>

Wie man sie benutzt:

  1. Wählen Sie Ihre Linien. Wenn ich die nächsten 12 Zeilen auswählen möchte, drücke ich einfachV12j
  2. Drücken Sie <leader>n
  3. Nehmen Sie Ihre Änderungen an der Linie vor
  4. Stellen Sie sicher, dass Sie sich im normalen Modus befinden, und drücken Sie dann <leader>m

Um eine weitere Bearbeitung vorzunehmen, müssen Sie die Auswahl nicht erneut treffen. Drücken <leader>nSie einfach , nehmen Sie Ihre Bearbeitung vor und drücken Sie <leader>m, um sich zu bewerben.


So funktioniert das:

  • <Esc><Esc>0qq Verlassen Sie die visuelle Auswahl, gehen Sie zum Zeilenanfang und beginnen Sie mit der Aufnahme eines Makros.

  • q Beenden Sie die Aufnahme des Makros.

  • :'<,'>-1normal!@q<CR> Spielen Sie vom Beginn der visuellen Auswahl bis zur Zeile vor dem Ende das Makro in jeder Zeile.

  • <Down> Gehe zurück zur letzten Zeile.


Sie können dieselbe Taste auch nur für verschiedene Modi zuordnen:

vmap <leader>m <Esc><Esc>0qq
nmap <leader>m q:'<,'>-1normal!@q<CR><Down>

Dies beeinträchtigt jedoch Ihre Fähigkeit, eine weitere Bearbeitung vorzunehmen. Sie müssen Ihre Zeilen erneut auswählen.

willmcpherson2
quelle