Come invertire la selezione in vim?


12

Dopo aver selezionato un intervallo di righe con il Vcomando, vorrei eliminare ogni riga del file NON selezionata, quindi è un modo per invertire la selezione: selezionare ogni riga che non è selezionata?

Mi piace come

:g!/FOO/d

elimina ogni riga che NON contiene FOO .

Se avessi in mente un intervallo e volessi usare il suo inverso:

'a,'b

Avrei bisogno di usare le due gamme:

1,'a-1

e

'b+1,$

Ho il sospetto che questo non possa essere fatto in un solo passaggio, ma sarebbe bello!


quindi vuoi un'operazione in stile "ritaglio"?
Quack Quixote,

Risposte:


7

Innanzitutto creare il seguente mapping (ad esempio associato alla <F4>chiave)

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

quindi, dopo aver selezionato un intervallo in modalità visiva, è sufficiente premere <F4>per attivare il comando associato. Il comando può essere facilmente spiegato in parti:

  • " :" Entra in modalità riga di comando.
  • " <C-U>" Rimuovi tutti i caratteri tra la posizione del cursore e l'inizio della riga.
  • " 1,'<-1" Specificare l'intervallo dalla prima riga del file alla riga prima dell'inizio della selezione corrente.
  • " :delete<CR>" Elimina (l'intervallo di righe precedentemente specificato).
  • " :'>+1,$:delete<CR>" Elimina le righe nell'intervallo " '>+1,$", ovvero dalla riga successiva alla fine della selezione fino alla fine del file.

2
solo per spiegarlo: 1, '<- 1 è l'intervallo dalla riga 1 fino all'inizio della selezione. '> + 1, $ è l'intervallo da 1 riga dopo la selezione fino alla fine ...
Akira,

C'è un modo per farlo con un solo comando "elimina"?
Kevin Panko,

1
@Kevin Panko: avresti bisogno di combinare gli intervalli in una singola espressione. ho esaminato i documenti e non credo che la sintassi dell'intervallo supporti una cosa del genere. vimdoc.sourceforge.net/htmldoc/cmdline.html#cmdline-ranges ,,, vim.wikia.com/wiki/Ranges
quack quixote

15
  1. seleziona il tuo testo
  2. "*yggdG"*p che significa ...

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

9
ygg "_dGP è lo stesso ma più breve.
Kevin Panko,

1
alla fine ottieni lo stesso testo, vero :)
Akira,

Vorrei solo fare riferimento alle risposte di Akira e Kevin Panko (non posso aggiungere commenti). "[o] pposite [d] elete in (v) modalità isual vmap od ygg" _dGP
Marcin

Plugin come github.com/maxbrunsfeld/vim-yankstack rendono questo approccio più semplice. Non devi preoccuparti troppo del fatto che il tuo registro yank venga bloccato dall'eliminazione.
Jack O'Connor,

come può essere aggiunto come mappatura della tastiera .vimrc? Ho provato alcuni tentativi ma non l'ho ancora ottenuto. I miei tentativi furono map <F4> n"*yggdG"*p enmap <F4> "*yggdG"*p
Brad Parks il

7

Solo per i posteri:

:v/\%V/d

Questo fa un globale inverso su linee che non fanno parte della selezione. Si noti che: v è un costrutto basato su linea, quindi qualsiasi linea che contiene una qualsiasi selezione, sia essa linea, flusso o selezione di blocchi verrà risparmiata.


1

dal momento che "invertire" significa fondamentalmente creare "selezioni multiple" (l'area prima e dopo la selezione originale) ho cercato nuovamente i vimscripts http://www.vim.org/scripts/script.php?script_id=953 . prova questo.

 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."
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.