Como substituir apenas na seleção visual?

27

Como é que um obter vim para substituir um personagem dentro da seleção visual única e não em outro lugar na linha? Exemplo:

  • Linha: int arr[] = { 00 01 02 03 04 05 05 /* ... lots more like this*/};
  • Seleção visual: { 00 01 02 03 04 05 05 /*... lots more like this*/}
  • Comando: :'<,'>s/\ /\,0x/g
  • Esperado: int arr[] = {0x00,0x01,0x02,0x03 /* and so on*/};

Depois de executar essas ações, no entanto, o resultado real é:

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

Existe uma maneira de modificar o comando acima para produzir o resultado esperado? Não define '<e '>define o intervalo no qual os comandos de pesquisa (e substituição) funcionam?

Bhargav Bhat
fonte
2
Não sei a resposta, mas sei que os :substituteoperadores operam linha por linha, o que explica o que você está vendo no seu exemplo.
Karl Yngve Lervåg

Respostas:

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

%Vcorresponde dentro da área visual. Veja :help %V.

VenkatH
fonte
11
Deve-se mencionar que esta solução apenas verifica se o início da partida está dentro da seleção visual .
Christian Brabandt
7

\%Vpara isso, veja :h %V:

\% V

Corresponder dentro da área Visual. Quando o modo Visual já tiver sido parado, corresponda à área em que gv seria selecionado novamente. Esta é uma correspondência de largura zero. Para garantir que todo o padrão esteja dentro da área Visual, coloque-o no início e no final do padrão , por exemplo:> /\%Vfoo.*bar\%V

Para substituir foopor barna seleção única, use:

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

Nesse caso em particular:

:'<,'>s/\%V\ \%V/\,0x/g
sobremesa
fonte
4

Se você deseja substituir dentro de um bloco visual , pode usar o vis.vimplugin .

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

Para instalar:

Faça o download do arquivo vis.vba.gz em 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

Uma vez instalado:

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

Quando você digita :B, você verá isso

:'<,'>B 

Tudo bem, é apenas o vim dizendo que o comando será aplicado ao bloco visual atualmente selecionado.

Melhor ainda, você pode executar qualquer comando Ex no bloco visual, não apenas substituições. Por exemplo :B !sort.

Christian Long
fonte