145 votes

Recherche et remplacement du texte sélectionné dans Vim

Disons que nous avons un texte, que j'entre en mode visuel et que je sélectionne du texte. Comment faire pour rechercher rapidement le texte sélectionné et le remplacer par autre chose ?

170voto

Mykola Golubyev Points 21210

Essayez d'exécuter ce qui suit ou de l'insérer dans votre système d'information. .vimrc

vnoremap <C-r> "hy:%s/<C-r>h//gc<left><left><left>

En appuyant sur ctrl + r en mode visuel, vous serez invité à saisir le texte à remplacer. Appuyez sur enter puis confirmez chaque modification que vous acceptez y ou diminuer avec n .

Cette commande annulera votre registre h vous pouvez donc en choisir un autre (en modifiant h dans la commande ci-dessus à une autre lettre minuscule) que vous n'utilisez pas.

0 votes

Où l'ajoutez-vous ? ... désolé, je suis vraiment nouveau dans vim

1 votes

Si vous êtes sous un système de type Unix, vous avez le fichier ~/.vimrc. Mettez la ligne donnée dans ce fichier et redémarrez vim.

18 votes

Si vous omettez le c en gc le remplacement se fait en une seule fois dans tout le tampon. Si vous avez fait une erreur et que vous voulez revenir en arrière, il suffit de taper u en mode commande. Je préfère cette approche à celle qui consiste à confirmer chacun des remplacements (ce qui se produit avec la commande c modificateur).

47voto

ErichBSchulz Points 1058

Ce mappage rapide et simple permet de rechercher le texte mis en évidence visuellement (sans écraser le registre h) et sans utiliser le registre + dépendant du terminal :

" search for visually hightlighted text
vnoremap <c-f> y<ESC>/<c-r>"<CR>   

Si vous n'aimez pas le ctrl-f, changez-le selon vos préférences.

Une fois que le texte est mis en évidence, vous pouvez toujours faire un s ubstitution simplement en tapant :

%s//<your-replacement-string>

... parce qu'une recherche vide sur le s utilise la dernière chaîne recherchée.

0 votes

Quand j'utilise ceci dans ma configuration de vim, control+f sélectionne toujours le caractère suivant ainsi que celui que j'ai sélectionné visuellement. Avez-vous des idées ?

0 votes

%s//<your-replacement-string> ne semble pas fonctionner pour mettre en évidence quelque chose comme /tmp/file . il devient juste <your-replacement-string>/tmp/file

33voto

bryan kennedy Points 1666

La réponse acceptée fonctionne très bien, sauf si vous avez des caractères spéciaux dans votre sélection visuelle. J'ai bricolé deux scripts ( Jeremy Cantrell affichée ici & Peter Odding ) pour créer une commande qui vous permettra de sélectionner visuellement une chaîne de caractères que vous souhaitez trouver, même si elle contient des caractères spéciaux d'expressions rationnelles.

" Escape special characters in a string for exact matching.
" This is useful to copying strings from the file to the search tool
" Based on this - http://peterodding.com/code/vim/profile/autoload/xolox/escape.vim
function! EscapeString (string)
  let string=a:string
  " Escape regex characters
  let string = escape(string, '^$.*\/~[]')
  " Escape the line endings
  let string = substitute(string, '\n', '\\n', 'g')
  return string
endfunction

" Get the current visual block for search and replaces
" This function passed the visual block through a string escape function
" Based on this - https://stackoverflow.com/questions/676600/vim-replace-selected-text/677918#677918
function! GetVisual() range
  " Save the current register and clipboard
  let reg_save = getreg('"')
  let regtype_save = getregtype('"')
  let cb_save = &clipboard
  set clipboard&

  " Put the current visual selection in the " register
  normal! ""gvy
  let selection = getreg('"')

  " Put the saved registers and clipboards back
  call setreg('"', reg_save, regtype_save)
  let &clipboard = cb_save

  "Escape any special characters in the selection
  let escaped_selection = EscapeString(selection)

  return escaped_selection
endfunction

" Start the find and replace command across the entire file
vmap <leader>z <Esc>:%s/<c-r>=GetVisual()<cr>/

Je l'ai inclus dans mon vimrc si c'est plus utile pour quelqu'un.

5 votes

Merci pour la solution, en combinant plusieurs propositions, j'ai abouti à ce qui suit : vmap <C-r> <Esc>:%s/<c-r>=GetVisual()<cr>//g<left><left> (qui remplace simplement tout ce qui est dans le fichier)

8voto

dmd Points 69

Mykola Golubyev, Merci pour le conseil ! La suite utilise le registre "+" qui (selon votre terminal) contient déjà le texte en surbrillance, ce qui évite d'utiliser le registre "h".

vnoremap <C-r> <Esc>:%s/<C-r>+//gc<left><left><left>

0 votes

Mon VIM 7.0 sur CentOS 5.x ne semble pas avoir le registre +. S'agit-il d'une fonctionnalité standard ?

3 votes

Je note que j'accède à la machine CentOS via Putty, et en googlant, je vois que + est le registre du presse-papiers. Putty ne semble pas le supporter ! Donc cette réponse est en fait dépendante du terminal.

0 votes

Bonjour, j'ai essayé votre commande mais elle me demande de remplacer les occurrences du texte spécifié dans tout le fichier, et pas seulement le texte sélectionné.

5voto

Jeremy Cantrell Points 7858

J'ai ceci dans mon vimrc :

function! GetVisual() range
    let reg_save = getreg('"')
    let regtype_save = getregtype('"')
    let cb_save = &clipboard
    set clipboard&
    normal! ""gvy
    let selection = getreg('"')
    call setreg('"', reg_save, regtype_save)
    let &clipboard = cb_save
    return selection
endfunction

vmap <leader>z :%s/<c-r>=GetVisual()<cr>/

Cela permettra de saisir la sélection visuelle et de lancer une commande de substitution avec elle.

EDIT : Je dois préciser que cela ne fonctionne pas avec les sélections visuelles multilignes. Bien que GetVisual() n'ait pas de problème à le renvoyer, je ne suis pas sûr de savoir comment le mettre correctement dans la ligne de commande. Si quelqu'un a des conseils sur la façon dont je pourrais le faire, merci de commenter.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X