Jak wymienić tylko w ramach selekcji wizualnej?

27

W jaki sposób można uzyskać vim, aby zastąpić znak w selekcji wizualnej tylko i gdzie indziej na linii? Przykład:

  • Linia: int arr[] = { 00 01 02 03 04 05 05 /* ... lots more like this*/};
  • Wybór wizualny: { 00 01 02 03 04 05 05 /*... lots more like this*/}
  • Dowództwo: :'<,'>s/\ /\,0x/g
  • Spodziewany: int arr[] = {0x00,0x01,0x02,0x03 /* and so on*/};

Po wykonaniu tych czynności rzeczywisty wynik to:

int,0xarr[],0x=,0x{0x00,0x01,0x02,0x03 /* and so on*/};

Czy istnieje sposób zmodyfikowania powyższego polecenia, aby uzyskać oczekiwany wynik? Nie '<i '>określić zakres, w którym wyszukiwarki (i zastąpić) nakazuje pracę?

Bhargav Bhat
źródło
2
Nie znam odpowiedzi, ale wiem, że :substituteoperatory są wiersz po wierszu, co wyjaśnia to, co widzisz w swoim przykładzie.
Karl Yngve Lervåg

Odpowiedzi:

32
:'<,'>s/\%V\ /\,0x/g

%Vpasuje do obszaru wizualnego. Zobaczyć :help %V.

VenkatH
źródło
1
Należy wspomnieć, że to rozwiązanie tylko weryfikuje, czy początek meczu znajduje się w selekcji wizualnej .
Christian Brabandt
7

Jest \%Vna to, patrz :h %V:

\% V.

Dopasuj w obszarze wizualnym. Gdy tryb wizualny został już zatrzymany, dopasuj w obszarze, który gv wybrałby ponownie. Jest to dopasowanie o szerokości zero. Aby upewnić się, że cały wzorzec znajduje się w obszarze wizualnym, umieść go na początku i na końcu wzorca , np .:> /\%Vfoo.*bar\%V

Aby zastąpić fooprzez tylko barw zaznaczeniu, użyj:

:'<,'>s/\%Vfoo\%V/bar/
:'<,'>s/\%Vfoo\%V/bar/g
:'<,'>s/\%Vfoo\%V/bar/cg

W tym konkretnym przypadku:

:'<,'>s/\%V\ \%V/\,0x/g
deser
źródło
4

Jeśli chcesz zastąpić w bloku wizualnym , możesz użyć vis.vimwtyczki .

http://vim.wikia.com/wiki/Applying_substitutes_to_a_visual_block

Żeby zainstalować:

Pobierz vis.vba.gz ze strony http://www.drchip.org/astronaut/vim/index.html#VIS

# Open vis.vba.gz in Vim 7.1 or later.
vim vis.vba.gz

# Source the open file.
:so %

# Quit Vim
:q

Po zainstalowaniu:

ctrl-v to enter visual-block mode
Move to select the block you want
:B s/pattern/newtext/

Podczas pisania :Bzobaczysz to

:'<,'>B 

W porządku, po prostu vim mówi, że polecenie będzie miało zastosowanie do aktualnie wybranego bloku wizualnego.

Co więcej, możesz wykonać dowolną komendę Ex na bloku wizualnym, a nie tylko podstawienia. Na przykład :B !sort.

Christian Long
źródło