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.