Wie invertiere ich die Auswahl in vim?


12

Nachdem Vich mit dem Befehl einen Zeilenbereich ausgewählt habe, möchte ich jede Zeile der Datei löschen, die NICHT ausgewählt ist. Ist dies also eine Möglichkeit, die Auswahl umzukehren - wählen Sie jede Zeile aus, die nicht ausgewählt ist?

Wie wie

:g!/FOO/d

löscht jede Zeile, die NICHT FOO enthält .

Wenn ich einen Bereich im Sinn hätte und dessen Umkehrung verwenden wollte:

'a,'b

Ich müsste die beiden Bereiche verwenden:

1,'a-1

und

'b+1,$

Ich vermute, dass dies nicht in einem Schritt möglich ist - aber es wäre schön!


Sie möchten also eine Operation im Crop-Stil?
Quacksalber Quijote

Antworten:


7

Erstellen Sie zunächst die folgende Zuordnung (z. B. an den <F4>Schlüssel gebunden ).

map <F4> :<C-U>1,'<-1:delete<CR>:'>+1,$:delete<CR>

Nachdem Sie im visuellen Modus einen Bereich ausgewählt haben, drücken Sie einfach <F4>, um den zugehörigen Befehl auszulösen. Der Befehl kann in Teilen leicht erklärt werden:

  • " :" Kommandozeilenmodus aufrufen.
  • " <C-U>" Entfernen Sie alle Zeichen zwischen der Cursorposition und dem Zeilenanfang.
  • " 1,'<-1" Geben Sie den Bereich von der ersten Zeile der Datei bis zur Zeile vor dem Beginn der aktuellen Auswahl an.
  • " :delete<CR>" Löschen (der zuvor angegebene Zeilenbereich).
  • " :'>+1,$:delete<CR>" Löschen Sie die Zeilen im Bereich " '>+1,$", dh von der Zeile nach dem Ende der Auswahl bis zum Ende der Datei.

2
Nur um es zu erklären: 1, '<- 1 ist der Bereich von Zeile 1 bis zum Beginn der Auswahl. '> + 1, $ ist der Bereich von 1 Zeile nach der Auswahl bis zum Ende ...
akira

Gibt es eine Möglichkeit, dies mit nur einem "Löschen" -Befehl zu tun?
Kevin Panko

1
@ Kevin Panko: Sie müssten die Bereiche in einem einzigen Ausdruck kombinieren. Ich habe mir die Dokumente angesehen und glaube nicht, dass die Bereichssyntax so etwas unterstützt. vimdoc.sourceforge.net/htmldoc/cmdline.html#cmdline-ranges ,,, vim.wikia.com/wiki/Ranges
Quack quixote

15
  1. Wählen Sie Ihren Text
  2. "*yggdG"*p was bedeutet ...

    "*y    " yank it to the selection register
    ggdG   " delete everything
    "*p    " and paste the selection again 
    

9
ygg "_dGP ist das gleiche, aber kürzer.
Kevin Panko

1
Am

Ich möchte mich nur auf die Antworten von Akira und Kevin Panko beziehen (ich kann keine Kommentare hinzufügen). "[o] pposite [d] elete in (v) isual mode vmap od ygg" _dGP
Marcin Rogacki

Plugins wie github.com/maxbrunsfeld/vim-yankstack erleichtern diesen Ansatz. Sie müssen sich nicht so viele Sorgen machen, dass Ihr Ruckregister durch das Löschen überlastet wird.
Jack O'Connor

Wie kann dies als Tastaturzuordnung hinzugefügt werden .vimrc? Ich habe ein paar Versuche versucht, aber noch nicht verstanden. Meine Versuche waren map <F4> n"*yggdG"*p undnmap <F4> "*yggdG"*p
Brad Parks

7

Nur für die Nachwelt:

:v/\%V/d

Dies führt zu einer inversen globalen Verknüpfung von Zeilen, die nicht Teil der Auswahl sind. Beachten Sie Folgendes: v ist ein zeilenbasiertes Konstrukt, sodass jede Zeile, die eine Auswahl enthält, sei es eine Zeilen-, Stream- oder Blockauswahl, vom Löschen verschont bleibt.


1

da "invertieren" im Grunde bedeutet, "Mehrfachauswahl" (den Bereich vor und nach der ursprünglichen Auswahl) zu erstellen, habe ich die vimscripts erneut durchsucht http://www.vim.org/scripts/script.php?script_id=953 . Versuche dies.

 There are a number of operations to very
 easily manipulate selections such as modifying 
 the regions (add/delete/inverte/clear), hiding, 
 refreshing, saving and restoring etc."
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.