Evidenzia tutte le occorrenze di una parola selezionata?


159

Come posso evidenziare tutte le occorrenze di una parola selezionata in GVim, come in Notepad ++?

Risposte:


202

In modalità normale:

:set hlsearch

Quindi cerca un motivo con il comando /in modalità Normale, oppure <Ctrl>oseguito /in modalità Inserisci. *in modalità Normale cercherà la ricorrenza successiva della parola sotto il cursore. L' hlsearchopzione li evidenzierà tutti se impostati.#cercherà la ricorrenza precedente della parola.

Per rimuovere l'evidenziazione della ricerca precedente:

:nohlsearch

Potresti voler mappare :nohlsearch<CR>una chiave conveniente.


34
Se hai intenzione di alternare hlsearchmolto potresti voler mappare :set hlsearch!invece di :set nohlsearch. Questo attiva o disattiva l'impostazione anziché disattivarla.
David Winslow,

1
Inoltre, tieni presente che il cursore si sposterà sull'occorrenza precedente (#) o successiva (*) della parola
Juan Campa,

1
Ma si può tornare alla posizione in cui è stato premuto *o #da <Ctrl>oin modalità normale.
Ruslan,

8
Invece di :nohlsearch, puoi semplicemente usare:noh
crisron il

Imposta in .vimrc: noremap <F4> :set hlsearch! hlsearch?<CR>per alternare l'evidenziazione e rimuovere l'evidenziazione di <F4>.
Chalist,

124

Il *tasto metterà in evidenza tutte le occorrenze della parola che si trova sotto il cursore.


31
Solo se &hlsearchè attivo.
Wilhelmtell,

10
Passerà anche alla ricorrenza successiva della parola sotto il cursore. Se si desidera passare all'occorrenza precedente, utilizzare #.
Vinicio Pinto,

7
Posso farlo rimanere nella posizione corrente?
nn0p,

@nn0p Sì, puoi - in tal caso, seguire la risposta accettata stackoverflow.com/a/3431203/363688 . Questa è solo un'azione alternativa che evidenzierà anche tutte le occorrenze.
Sleepynate,

1
c'è un modo per usare questa funzionalità ma con una o più parole evidenziate?
Cantato Cho

22

So che è una domanda davvero vecchia, ma se qualcuno è interessato a questa funzione, può controllare questo codice http://vim.wikia.com/wiki/Auto_highlight_current_word_when_idle

" Highlight all instances of word under cursor, when idle.
" Useful when studying strange source code.
" Type z/ to toggle highlighting on/off.
nnoremap z/ :if AutoHighlightToggle()<Bar>set hls<Bar>endif<CR>
function! AutoHighlightToggle()
   let @/ = ''
   if exists('#auto_highlight')
     au! auto_highlight
     augroup! auto_highlight
     setl updatetime=4000
     echo 'Highlight current word: off'
     return 0
  else
    augroup auto_highlight
    au!
    au CursorHold * let @/ = '\V\<'.escape(expand('<cword>'), '\').'\>'
    augroup end
    setl updatetime=500
    echo 'Highlight current word: ON'
  return 1
 endif
endfunction

1
È possibile modificare questo script in modo tale che il testo sotto il cursore che viene inizialmente evidenziato quando si preme z / rimanga evidenziato anche quando il cursore viene spostato su altre parole? Ciò sarebbe utile quando si scorre il codice sorgente cercando la parola iniziale.
Stensootla,

18

nel modo più semplice, digita in modalità normale *

Ho anche questi mapping per abilitare e disabilitare

"highligh search enabled by default
set hlsearch
"now you can toggle it
nnoremap <S-F11> <ESC>:set hls! hls?<cr>
inoremap <S-F11> <C-o>:set hls! hls?<cr>
vnoremap <S-F11> <ESC>:set hls! hls?<cr> <bar> gv

Seleziona la parola facendo clic su di essa

set mouse=a     "Enables mouse click
nnoremap <silent> <2-LeftMouse> :let @/='\V\<'.escape(expand('<cword>'), '\').'\>'<cr>:set hls<cr>

Bonus: CountWordFunction

fun! CountWordFunction()
    try
        let l:win_view = winsaveview()
        let l:old_query = getreg('/')
        let var = expand("<cword>")
        exec "%s/" . var . "//gn"
    finally
        call winrestview(l:win_view)
        call setreg('/', l:old_query)
    endtry
endfun
" Bellow we set a command "CountWord" and a mapping to count word
" change as you like it
command! -nargs=0 CountWord :call CountWordFunction()
nnoremap <f3> :CountWord<CR>

Selezione della parola con il mouse e conteggio delle occorrenze contemporaneamente: OBS: nota che in questa versione abbiamo il comando "CountWord" alla fine

nnoremap <silent> <2-LeftMouse> :let @/='\V\<'.escape(expand('<cword>'), '\').'\>'<cr>:set hls<cr>:CountWord<cr>

Ora uso nnoremap * *``cgnennoremap # #``cgN
SergioAraujo il

quindi dopo aver digitato *, come posso disattivare l'evidenziazione?
user5359531

Questo è per evidenziare la parola corrente nel documento
Chalist,

@ user5359531 :nohoppure:nohlsearch
dylnmc il

@ user5359531 che dire nnoremap <silent> * :execute "normal! *N"<cr>e nnoremap <silent> # :execute "normal! #n"<cr>? Questi evidenziano semplicemente la parola sotto il cursore ma non la spostano alla ricorrenza successiva.
dylnmc,

10

Le soluzioni basate sulla ricerca ( *, /...) spostano il cursore, il che potrebbe essere sfortunato.

Un'alternativa è utilizzare il plug-in mark.vim avanzato , quindi completare il tuo .vimrcper consentire l'evidenziazione del trigger con doppio clic (non so come una selezione da tastiera possa attivare un comando):

"Use Mark plugin to highlight selected word  
map <2-leftmouse> \m   

Permette molteplici evidenziature, persistenza, ecc.

Per rimuovere l'evidenziazione, sia:

  • Fare di nuovo doppio clic
  • :Mark (spegnere fino alla selezione successiva)
  • :MarkClear

2
Le soluzioni basate sulla ricerca spostano il cursore solo se la ricerca incrememntal è attivata. È possibile disattivarlo in questo modo: :set noincsearch. Secondo me è una delle funzionalità più fastidiose di Vim e una delle prime cose che disabilito per le nuove installazioni.
jahroy,

3
Penso *che sposterà incondizionatamente il cursore. E non riesco a vedere come incsearchpotrebbe essere fastidioso, dal momento che è solo uno "sguardo avanti", eseguendo la ricerca corrente senza effettivamente cambiare la tua posizione.
YvesgereY,

3
Wow ... hai ragione. Ho pensato che lo spegnimento incsearchavrebbe impedito il movimento, ma un rapido test conferma che hai ragione. Mie scuse. Tuttavia, è super facile creare una mappatura che impedisce il movimento: :nnoremap * *N. Non riesco a credere che non trovi fastidioso che il tuo cursore salti su tutto lo schermo mentre esegui una ricerca. Ma ... queste cose sono completamente soggettive. Vive la différence ;-)
jahroy

3
Puoi anche farlo :let @/='hilight_this', supponendo che tu abbia hlsearchabilitato. Evidenzia il testo senza saltare e non è necessario modificare le impostazioni esistenti. Ciò modifica il valore attualmente memorizzato nel registro di ricerca.
Ben Davis,

1
Questa dovrebbe essere la risposta accettata. <leader> m fa il lavoro, non è necessario mappare il doppio clic.
Sassan,

4

Primo (o nel tuo .vimrc):

:set hlsearch

Quindi posizionare il cursore sulla parola che si desidera evidenziare e premere *.

hlsearchsignifica evidenziare tutte le occorrenze della ricerca corrente e *significa cercare la parola sotto il cursore.


3

Assicurati innanzitutto che hlsearch sia abilitato emettendo il seguente comando

:set hlsearch

Puoi anche aggiungere questo al tuo file .vimrc come impostato

set hlsearch

ora quando si utilizza il meccanismo di ricerca rapida in modalità comando o un normale comando di ricerca, tutti i risultati verranno evidenziati. Per spostarsi in avanti tra i risultati, premere 'n' per spostarsi all'indietro, premere 'N'

In modalità normale, per eseguire una rapida ricerca della parola sotto il cursore e per passare alla ricorrenza successiva in un comando premere '*', è anche possibile cercare la parola sotto il cursore e passare alla ricorrenza precedente premendo '# '

In modalità normale, la ricerca rapida può anche essere invocata con

/searchterm<Enter>

per rimuovere i punti salienti sull'uso delle ocuurenze, ho associato questo a un collegamento nel mio .vimrc

:nohl

2

Abilita l'evidenziazione della ricerca:

:set hlsearch

Quindi cerca la parola:

/word<Enter>


2

per evidenziare la parola senza spostare il cursore, plop

" highlight reg. ex. in @/ register
set hlsearch
" remap `*`/`#` to search forwards/backwards (resp.)
" w/o moving cursor
nnoremap <silent> * :execute "normal! *N"<cr>
nnoremap <silent> # :execute "normal! #n"<cr>

nel tuo vimrc.

La cosa bella di questo è g*e g#funzionerà ancora come "normale" *e #.


Per iniziare hlsearch, puoi usare "short-form" (a meno che tu non abbia un'altra funzione che inizia con "noh" in modalità comando)::noh . Oppure puoi usare la versione lunga::nohlsearch

Per estrema comodità (mi ritrovo hlsearcha alternare forse 20 volte al giorno), puoi mappare qualcosa per attivare / disattivare in questo hlsearchmodo:

" search highlight toggle
nnoremap <silent> <leader>st :set hlsearch!<cr>

.:. se lo <leader>è \(è per impostazione predefinita), è possibile premere \st(rapidamente) in modalità normale per attivare / disattivarehlsearch .

O forse vuoi solo aver :nohmappato:

" search clear
nnoremap <silent> <leader>sc :nohlsearch<cr>

Quanto sopra funziona semplicemente :nohlsearchcosì (diversamente :set hlsearch!) che evidenzierà comunque la parola la prossima volta che premi *o #in modo normale modalità .

Saluti



1

Uso autocmd CursorMoved * exe printf('match IncSearch /\V\<%s\>/', escape(expand('<cword>'), '/\'))

Assicurati di aver IncSearchimpostato qualcosa. es call s:Attr('IncSearch', 'reverse'). In alternativa puoi usare un altro gruppo di evidenziazione al suo posto.

Ciò metterà in evidenza tutte le occorrenze di parole sotto il cursore senza indugio. Trovo che un ritardo mi rallenta quando cerco il codice. Il colore di evidenziazione corrisponderà al colore della parola, quindi rimane coerente con il tuo schema.


0

Perché non solo: z /

Ciò evidenzierà la parola corrente sotto il cursore e qualsiasi altra occorrenza. E non devi dare un comando separato per ogni oggetto che stai cercando. Forse non è disponibile nel diabolico gvim? È in vim di default.

* è utile solo se si desidera che il cursore passi alla ricorrenza successiva. Quando si confrontano due cose visivamente, spesso non si desidera che il cursore si sposti, ed è fastidioso premere il tasto * ogni volta.


Vim e gvim normalmente hanno lo stesso set di comandi. Nei documenti di aiuto non c'è riferimento a un comando "z /".
wds,

Non è disponibile non solo in gvim, ma anche in vim. Ho appena controllato - chiaramente non funziona.
Ruslan,

z / funziona quando questo script menzionato in una risposta precedente è in uso.
fzzylogic,

0
  1. Aggiungi quelle righe nel tuo ~/.vimrcfile

" highlight the searched items set hlsearch " F8 search for word under the cursor recursively , :copen , to close -> :ccl nnoremap <F8> :grep! "\<<cword>\>" . -r<CR>:copen 33<CR>

  1. Ricarica le impostazioni con :so%
  2. Nel modello normale andare oltre la parola.

  3. Premi * Premi F8 per cercare in modo ricorsivo sotto il tuo intero progetto


0

Ad esempio questo plugIn:

Cerca solo sotto il cursore in vimawesome.com

La chiave, come menzionato da Clagccs , è che il momento saliente NON è in conflitto con la tua ricerca : https://vim.fandom.com/wiki/Auto_highlight_current_word_when_idle

Schermata di come NON è in conflitto con la ricerca: inserisci qui la descrizione dell'immagine Note:

  • vim-illuminate le alte luci di default, nella mia schermata sono passato a sottolineare
  • vim-illuminate evidenzia / sottolinea la parola sotto il cursore per impostazione predefinita, nella mia schermata non l'ho impostata
  • i miei colori sono molto grigi. Controlla anche il tuo per personalizzarlo.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.