Jak odwrócić zaznaczenie w vimie?

12

Po wybraniu zakresu wierszy za pomocą Vpolecenia chciałbym usunąć każdy wiersz pliku, który NIE jest zaznaczony, więc jest sposób na odwrócenie wyboru - wybierz każdą linię, która nie została wybrana?

Jak jak

:g!/FOO/d

usuwa każdą linię, która NIE zawiera FOO .

Gdybym miał na myśli zasięg i chciałem użyć jego odwrotności:

'a,'b

Musiałbym użyć dwóch zakresów:

1,'a-1

i

'b+1,$

Podejrzewam, że nie da się tego zrobić jednym krokiem - ale byłoby miło!

Kevin Panko
źródło
więc chcesz operacji w stylu „przycinania”?
quack quixote

Odpowiedzi:

7

Najpierw utwórz następujące mapowanie (na przykład powiązane z <F4>kluczem)

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

następnie, po wybraniu zakresu w trybie wizualnym, wystarczy nacisnąć, <F4>aby wywołać powiązane polecenie. Polecenie można łatwo wyjaśnić w częściach:

  • :” Wejdź w tryb wiersza poleceń.
  • " <C-U>" Usuń wszystkie znaki między pozycją kursora a początkiem linii.
  • 1,'<-1” Określ zakres od pierwszego wiersza pliku do wiersza przed rozpoczęciem bieżącego wyboru.
  • :delete<CR>” Usuń (poprzednio określony zakres linii).
  • :'>+1,$:delete<CR>„ Usuń linie z zakresu ” '>+1,$”, tj. Od linii po końcu zaznaczenia do końca pliku.
mrucci
źródło
2
aby to wyjaśnić: 1, „<- 1 to zakres od linii 1 do początku wyboru. '> + 1, $ to zakres od 1 linii po selekcji do końca ...
akira
Czy można to zrobić za pomocą tylko jednego polecenia „usuń”?
Kevin Panko
1
@Kevin Panko: musisz połączyć zakresy w jedno wyrażenie. przeglądałem dokumenty i nie sądzę, że składnia zakresu obsługuje takie rzeczy. vimdoc.sourceforge.net/htmldoc/cmdline.html#cmdline-ranges ,,, vim.wikia.com/wiki/Ranges
quack
15
  1. wybierz swój tekst
  2. "*yggdG"*p co znaczy ...

    "*y    " yank it to the selection register
    ggdG   " delete everything
    "*p    " and paste the selection again 
    
akira
źródło
9
ygg "_dGP jest taki sam, ale krótszy.
Kevin Panko
1
w końcu dostajesz ten sam tekst, prawda :)
akira,
Chciałbym po prostu odnieść się do odpowiedzi Akira i Kevin Panko (nie mogę dodawać komentarzy). „[o] pposite [d] elete in (v) isual mode vmap od ygg” _dGP
Marcin Rogacki
Wtyczki takie jak github.com/maxbrunsfeld/vim-yankstack ułatwiają to podejście. Nie musisz się tak bardzo martwić, że twój rejestr yank zostanie zablokowany przez usunięcie.
Jack O'Connor,
jak można to dodać jako mapowanie klawiatury .vimrc? Próbowałem kilka prób, ale jeszcze nie dostałem. Moje próby były map <F4> n"*yggdG"*p inmap <F4> "*yggdG"*p
Brad Parks
7

Tylko dla potomności:

:v/\%V/d

Robi to odwrotność globalną dla linii, które nie są częścią zaznaczenia. Zauważ, że: v jest konstrukcją opartą na linii, więc każda linia zawierająca dowolne zaznaczenie, niezależnie od tego, czy będzie to linia, strumień czy wybór bloku, zostanie oszczędzona.

Gary Fixler
źródło
1

ponieważ „odwracanie” oznacza w zasadzie tworzenie „multiselections” (obszar przed i po pierwotnym zaznaczeniu) ponownie przeszukałem vimscripts http://www.vim.org/scripts/script.php?script_id=953 . Spróbuj tego.

 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."
akira
źródło