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!


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.

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 
    

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.


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."
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.