2009-08-31 10 views
1

Dire que j'ai plusieurs blocs de code suivant dans un fichier (espaces est hors de propos):Identification des blocs identiques du code

sdgfsdg dfg 
dfgdfgf ddfg 
dfgdfgdfg dfgfdg 

Comment trouver/highlight-vous toutes les occurrences?

Ce que je souhaite idéalement faire est de sélectionner visuellement le bloc de code, puis appuyez sur Rechercher pour trouver toutes les occurrences.

Répondre

1

Le texte recherché est stocké dans le registre /. Vous ne pouvez pas supprimer ou supprimer directement dans ce registre, mais vous pouvez l'assigner en utilisant `let '.

Essayez ceci:

  • Utilisez le mode visuel pour mettre en évidence le code que vous voulez rechercher
  • Type de "ay Yank qui mettait en évidence la sélection dans le registre a
  • type :let @/ = @a copier registre a dans la recherche enregistrer /

À ce stade, tout le code correspondant à votre sélection sera mis en surbrillance, et vous pouvez naviguer à travers les occurrences en utilisant n/N comme vous le feriez pour une recherche régulière.

Bien sûr, vous pouvez utiliser n'importe quel registre temporaire au lieu de a. Et il ne devrait pas être trop difficile de mapper cette séquence de commandes pour une utilisation facile.

2

Peut-être que vous devriez regarder: Search for visually selected text

Je l'ai pris de here

+0

Ah, je ne connaissais pas celui-là. M'aurait sauvé d'écrire le mien tout à l'heure. Et bien. Cela a beaucoup de sens de copier la sélection visuelle puis d'utiliser Ctrl-R- "pour y accéder.J'essayais (et j'espère avoir réussi) d'écrire une fonction qui ne dépend pas du mapping, mais c'est intéressant à voir l'autre façon de le faire – DrAl

+0

+1 c'était un bel effort. – LB40

2

Essayez ceci. Incluez ce script quelque part dans votre chemin d'exécution (voir :help runtimepath). Une option simple serait de le mettre dans votre vimrc. Sélectionnez visuellement la chose que vous voulez rechercher et appuyez sur ,/ (la touche virgule, puis la touche de barre oblique).

" Search for other instances of the current visual range 

" This works by: 
" <ESC>    Cancel the visual range (it's location is remembered) 
"/     Start the search 
" <C-R>=    Insert the result of an expression on 
"      the search line (see :help c_CTRL-R_=) 
" GetVisualRange()<CR> Call the function created below 
" <CR>     Run the search 
vmap ,/ <ESC>/<C-R>=GetVisualRange()<CR><CR> 

" Create the function that extracts the contents of the visual range 
function! GetVisualRange() 
    " Get the start and end positions of the current range 
    let StartPosition = getpos("'<") 
    let EndPosition = getpos("'>") 

    " Prefix the range with \V to disable "magic" 
    " See :help \V 
    let VisualRange = '\V' 

    " If the start and end of the range are on the same line 
    if StartPosition[1] == EndPosition[1] 
     " Just extract the relevant part of the line 
     let VisualRange .= getline(StartPosition[1])[StartPosition[2]-1:EndPosition[2]-1] 
    else 
     " Otherwise, get the end of the first line 
     let VisualRange .= getline(StartPosition[1])[StartPosition[2]-1:] 
     " Then the all of the intermediate lines 
     for LineNum in range(StartPosition[1]+1, EndPosition[1]-1) 
      let VisualRange .= '\n' . getline(LineNum) 
     endfor 
     " Then the start of the last line 
     let VisualRange .= '\n' . getline(EndPosition[1])[:EndPosition[2]-1] 
    endif 
    " Replace legitimate backslashes with double backslashes to prevent 
    " a literal \t being interpreted as a tab 
    let VisualRange = substitute(VisualRange, '\\[nV]\@!', '\\\\', "g") 

    " Return the result 
    return VisualRange 

endfunction 
1

solution partielle rapide et sale:

:set hlsearch 
* 

L'option hlsearch (par défaut dans certains configs vim, mais je Toujours couper le moteur) fait vim point fort tous les cas trouvés de la recherche en cours. En appuyant sur * en mode normal recherche le mot sous le curseur. Cela mettra en évidence toutes les instances du mot sous le curseur.

Questions connexes