¿Resaltar todas las ocurrencias de una palabra seleccionada?

159

¿Cómo puedo resaltar todas las apariciones de una palabra seleccionada en GVim, como en Notepad ++?

Matteo Cocon
fuente

Respuestas:

202

En modo normal:

:set hlsearch

Luego busque un patrón con el comando /en modo Normal, o <Ctrl>oseguido /en modo Insertar. *en modo Normal buscará la próxima aparición de la palabra debajo del cursor. La hlsearchopción los resaltará a todos si está configurado. #buscará la aparición previa de la palabra.

Para eliminar el resaltado de la búsqueda anterior:

:nohlsearch

Es posible que desee asignar :nohlsearch<CR>a alguna tecla conveniente.

Wilhelmtell
fuente
34
Si planea alternar hlsearchmucho, es posible que desee asignar en :set hlsearch!lugar de :set nohlsearch. Esto alterna la configuración en lugar de apagarla siempre.
David Winslow
1
Además, tenga en cuenta que el cursor se moverá a la aparición anterior (#) o siguiente (*) de la palabra
Juan Campa
1
Pero se puede volver a la posición que se ha pulsado *o #por <Ctrl>oen el modo normal.
Ruslan
8
En lugar de :nohlsearch, simplemente puede usar:noh
crisron
Establecer en .vimrc: noremap <F4> :set hlsearch! hlsearch?<CR>para alternar entre resaltado y eliminar resaltado por <F4>.
Chalist
124

La *tecla resaltará todas las apariciones de la palabra que está debajo del cursor.

sueño
fuente
31
Solo si &hlsearchestá encendido.
wilhelmtell
10
También saltará a la siguiente aparición de la palabra debajo del cursor. Si desea saltar a la ocurrencia anterior, use #.
Vinicius Pinto
77
¿Puedo hacer que se quede en la posición actual?
nn0p
@ nn0p Sí, puede - en ese caso, siga la respuesta aceptada stackoverflow.com/a/3431203/363688 . Esta es solo una acción alternativa que también resaltará todas las ocurrencias.
sleepynate
1
¿Hay alguna manera de usar esta funcionalidad pero con la o las palabras resaltadas?
Sung Cho
22

Sé que es una pregunta muy antigua, pero si alguien está interesado en esta función, puede consultar este código 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
clagccs
fuente
1
¿Es posible modificar este script de modo que el texto debajo del cursor que se resalta inicialmente cuando se presiona z / permanezca resaltado incluso cuando el cursor se mueve a otras palabras? Eso sería útil al desplazarse por el código fuente en busca de la palabra inicial.
stensootla
18

de la manera más simple, escriba en modo normal *

También tengo estas asignaciones para habilitar y deshabilitar

"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

Seleccione la palabra haciendo clic en ella

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>

Seleccionando la palabra con el mouse y contando las ocurrencias a la vez: OBS: Observe que en esta versión tenemos el comando "CountWord" al final

nnoremap <silent> <2-LeftMouse> :let @/='\V\<'.escape(expand('<cword>'), '\').'\>'<cr>:set hls<cr>:CountWord<cr>
SergioAraujo
fuente
Ahora uso nnoremap * *``cgnynnoremap # #``cgN
SergioAraujo
Entonces *, después de escribir , ¿cómo desactivo el resaltado?
user5359531
Esto es para resaltar la palabra actual en el documento
Chalist
@ user5359531 :noho:nohlsearch
dylnmc
@ user5359531 ¿qué pasa nnoremap <silent> * :execute "normal! *N"<cr>y nnoremap <silent> # :execute "normal! #n"<cr>? Estos solo resaltan la palabra debajo del cursor pero no la mueven a la siguiente ocurrencia.
dylnmc
10

Las soluciones basadas en búsquedas ( *, /...) mueven el cursor, lo cual puede ser desafortunado.

Una alternativa es usar el complemento mark.vim mejorado , luego complete su .vimrcpara dejar que haga doble clic en el resaltado de activación (no sé cómo una selección de teclado puede activar un comando):

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

Permite múltiples resaltados, persistencia, etc.

Para eliminar el resaltado, ya sea:

  • Haz doble clic nuevamente
  • :Mark (apagar hasta la próxima selección)
  • :MarkClear
YvesgereY
fuente
2
Las soluciones basadas en búsquedas solo mueven el cursor si la búsqueda incremental está activada. Puede apagarlo como esto: :set noincsearch. En mi opinión, es una de las características más molestas de Vim y una de las primeras cosas que deshabilito para nuevas instalaciones.
jahroy
3
Creo que *moverá incondicionalmente el cursor. Y no puedo ver cómo incsearchpodría ser molesto, ya que es solo un "mirar hacia adelante", realizar la búsqueda actual sin cambiar realmente su posición.
YvesgereY
3
Wow ... tienes razón. Supuse que apagarlo incsearchevitaría el movimiento, pero una prueba rápida confirma que estás en lo correcto. Mis disculpas. Sin embargo, es muy fácil de crear una asignación que impide el movimiento: :nnoremap * *N. No puedo creer que no te moleste que tu cursor salte por toda la pantalla mientras realizas una búsqueda. Pero ... estas cosas son completamente subjetivas. Vive la différence ;-)
jahroy
3
También puede hacerlo :let @/='hilight_this', suponiendo que lo haya hlsearchhabilitado. Destaca el texto sin saltar, y no tiene que cambiar la configuración existente. Esto cambia el valor que está almacenado actualmente en el registro de búsqueda.
Ben Davis
1
Esta debería ser la respuesta aceptada. <leader> m hace el trabajo, no es necesario asignar doble clic.
Sassan
4

Primero (o en tu .vimrc):

:set hlsearch

Luego coloca el cursor sobre la palabra que deseas resaltar y presiona *.

hlsearchsignifica resaltar todas las ocurrencias de la búsqueda actual, y *significa buscar la palabra debajo del cursor.

Ned Batchelder
fuente
3

Primero asegúrese de que hlsearch esté habilitado emitiendo el siguiente comando

:set hlsearch

También puede agregar esto a su archivo .vimrc como conjunto

set hlsearch

ahora cuando utiliza el mecanismo de búsqueda rápida en modo comando o un comando de búsqueda normal, todos los resultados se resaltarán. Para avanzar entre resultados, presione 'n' para retroceder presione 'N'

En modo normal, para realizar una búsqueda rápida de la palabra debajo del cursor y saltar a la siguiente aparición con un comando, presione '*', también puede buscar la palabra debajo del cursor y moverse a la aparición anterior presionando '# '

En modo normal, la búsqueda rápida también se puede invocar con

/searchterm<Enter>

para eliminar aspectos destacados en el uso de las ocupaciones, he vinculado esto a un acceso directo en mi .vimrc

:nohl
kashif
fuente
2

Habilitar el resaltado de búsqueda:

:set hlsearch

Luego busca la palabra:

/word<Enter>
John Kugelman
fuente
2

para resaltar la palabra sin mover el cursor, 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>

en tu vimrc.

Lo bueno de esto es g*y g#seguirá funcionando como "normal" *y #.


Para establecer hlsearchfuera, puede utilizar "forma corta" (a menos que tenga otra función que comienza con "Noh" en el modo de comandos): :noh. O puedes usar la versión larga::nohlsearch

Para una conveniencia extrema (me encuentro alternando hlsearchquizás 20 veces por día), puede asignar algo para alternar de esta hlsearchmanera:

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

.:. si <leader>es \(es por defecto), puede presionar \st(rápidamente) en modo normal para alternar hlsearch.

O tal vez solo quieras tener un :nohmapa:

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

Lo anterior simplemente se ejecuta de :nohlsearchmanera que (a diferencia de :set hlsearch!) todavía resaltará la palabra la próxima vez que presione *o #en modo normal .

salud

dylnmc
fuente
1
set hlsearch

tal vez ?

Torre
fuente
1

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

Asegúrate de haber IncSearchestablecido algo. por ej call s:Attr('IncSearch', 'reverse'). Alternativamente, puede usar otro grupo destacado en su lugar.

Esto resaltará todas las apariciones de palabras debajo de su cursor sin demora. Me parece que una demora me ralentiza cuando paso el código. El color de resaltado coincidirá con el color de la palabra, por lo que se mantiene consistente con su esquema.

Seph
fuente
0

¿Por qué no solo: z /

Eso resaltará la palabra actual debajo del cursor y cualquier otra ocurrencia. Y no tiene que dar un comando separado para cada elemento que está buscando. ¿Quizás eso no está disponible en el impío gvim? Está en vim por defecto.

* solo es bueno si desea que el cursor se mueva a la siguiente aparición. Al comparar dos cosas visualmente, a menudo no desea que se mueva el cursor, y es molesto presionar la tecla * cada vez.

INL
fuente
Vim y gvim normalmente tienen el mismo conjunto de comandos. No hay referencia en los documentos de ayuda a un comando "z /".
wds
No está disponible no solo en gvim, sino también en vim. Solo lo revisé, simplemente no funciona.
Ruslan
z / funciona cuando este script mencionado en una respuesta anterior está en uso.
fzzylogic
0
  1. Agregue esas líneas en su ~/.vimrcarchivo

" 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. Vuelva a cargar la configuración con :so%
  2. En el modelo normal, pasa la palabra.

  3. Presione * Presione F8 para buscar recursivamente debajo de todo su proyecto sobre la palabra

Yordan Georgiev
fuente
0

Por ejemplo, este plugIns:

Solo busque debajo del cursor en vimawesome.com

La clave, como mencionó clagccs , es que lo más destacado NO entra en conflicto con su búsqueda : https://vim.fandom.com/wiki/Auto_highlight_current_word_when_idle

Captura de pantalla de cómo NO entra en conflicto con la búsqueda: ingrese la descripción de la imagen aquí Notas:

  • vim-illuminate destaca de forma predeterminada, en mi captura de pantalla cambié a subrayado
  • vim-illuminate resalta / subraya la palabra debajo del cursor de forma predeterminada, en mi captura de pantalla la desactivo
  • Mis esquemas de colores son muy grises. Comprueba el tuyo para personalizarlo también.
Xopi García
fuente