Comment remplacer uniquement dans la sélection visuelle?

27

Comment obtenir vim pour remplacer un personnage dans la sélection visuelle uniquement et pas ailleurs sur la ligne? Exemple:

  • Ligne: int arr[] = { 00 01 02 03 04 05 05 /* ... lots more like this*/};
  • Sélection visuelle: { 00 01 02 03 04 05 05 /*... lots more like this*/}
  • Commander: :'<,'>s/\ /\,0x/g
  • Attendu: int arr[] = {0x00,0x01,0x02,0x03 /* and so on*/};

Cependant, après avoir effectué ces actions, le résultat réel est:

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

Existe-t-il un moyen de modifier la commande ci-dessus pour produire le résultat attendu? N'est-ce pas '<et '>définir la plage sur laquelle les commandes de recherche (et de remplacement) fonctionnent?

Bhargav Bhat
la source
2
Je ne connais pas la réponse, mais je sais que les :substituteopérateurs sont ligne par ligne, ce qui explique ce que vous voyez dans votre exemple.
Karl Yngve Lervåg

Réponses:

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

%Vcorrespond à l'intérieur de la zone visuelle. Tu vois :help %V.

VenkatH
la source
1
Il convient de mentionner, que cette solution ne fait que vérifier, que le début du match est à l'intérieur de la sélection visuelle .
Christian Brabandt
7

Il y a \%Vpour ça, voir :h %V:

\% V

Faites correspondre l'intérieur de la zone visuelle. Lorsque le mode visuel a déjà été arrêté, faites correspondre dans la zone que gv sélectionnerait à nouveau. Il s'agit d'une correspondance de largeur / zéro. Pour vous assurer que le motif entier se trouve dans la zone visuelle, placez-le au début et à la fin du motif , par exemple:> /\%Vfoo.*bar\%V

Pour remplacer foopar bardans la sélection uniquement, utilisez:

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

Dans ce cas particulier:

:'<,'>s/\%V\ \%V/\,0x/g
dessert
la source
4

Si vous souhaitez remplacer au sein d'un bloc visuel , vous pouvez utiliser le vis.vimplugin .

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

À installer:

Téléchargez vis.vba.gz depuis 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

Une fois installé:

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

Lorsque vous tapez :B, vous verrez ceci

:'<,'>B 

C'est bien, c'est juste vim disant que la commande s'appliquera au bloc visuel actuellement sélectionné.

Encore mieux, vous pouvez exécuter n'importe quelle commande Ex sur le bloc visuel, pas seulement des substitutions. Par exemple :B !sort.

Christian Long
la source