search - buscar - ViM: busca y resalta pero no saltas
vim search and replace (7)
Encontré que esto funciona bastante bien, no hay parpadeo y no necesita un registro intermedio.
nnoremap <silent> * :let @/= ''/<'' . expand(''<cword>'') . ''/>'' <bar> set hls <cr>
O si quieres el comportamiento g*
:
nnoremap <silent> g* :let @/=expand(''<cword>'') <bar> set hls <cr>
La tecla superstar (*) en ViM buscará la palabra debajo del cursor y saltará hacia la siguiente coincidencia. El usuario puede saltar a las siguientes coincidencias con la tecla n
. Si hlsearch
está habilitado, también resaltará las coincidencias.
Quiero poder presionar * y obtener las coincidencias resaltadas y ser capaz de navegar por las coincidencias con la tecla n. Sin embargo, no quiero que ViM salte a la siguiente coincidencia cuando se presiona *, debería permanecer en la palabra actual. ¿Hay alguna forma de hacer esto?
La mejor solucion:
- no agregue un salto a la lista de saltos
- el comportamiento de la tecla de estrella no se cambia
así que prueba el complemento: http://www.vim.org/scripts/script.php?script_id=4335
Mucho mejor que:
" a jump adds to the jump list
nnoremap * *``
" I got a dead loop on macvim
nnoremap * :keepjumps normal *``<cr>
" the behavior is changed
nnoremap <silent> <Leader>* :let @/=''/<<C-R>=expand("<cword>")<CR>/>''<CR>:set hls<CR>
No he visto este todavía:
nmap <silent> * "syiw<Esc>: let @/ = @s<CR>
Es muy corto y no implica saltar, lo que puede provocar un parpadeo.
Explicación: copie la palabra debajo del cursor para registrar y luego ajuste el registro de búsqueda ( /
) al contenido del registro s
. El registro de búsqueda no se puede escribir directamente, es por eso que el let es necesario y de ahí el silent
para mantener limpia la línea de comando de vim.
Si desea mantener la vista actual y agregar la búsqueda al historial, intente con esta solución [no tan eficiente]:
noremap * msHmt`s*`tzt`s
Está utilizando las marcas s
(guardar) y t
(arriba).
Tengo lo siguiente en mi .vimrc, que creo que funciona mejor que las otras alternativas:
" Put word under cursor into search register and highlight
nnoremap <silent> <Leader>* :let @/=''/<<C-R>=expand("<cword>")<CR>/>''<CR>:set hls<CR>
vnoremap <silent> <Leader>* :<C-U>
/let old_reg=getreg(''"'')<Bar>let old_regtype=getregtype(''"'')<CR>
/gvy:let @/=substitute(
/escape(@", ''//.*$^~[''), ''/_s/+'', ''//_s//+'', ''g'')<CR>
/gV:call setreg(''"'', old_reg, old_regtype)<CR>:set hls<CR>
Una solución simple vino a mi mente: poner el map * *#
en el archivo .vimrc
(sin embargo, parpadeará).
Yo mapearía:
nnoremap * *``
Funciona exactamente como usted quiere, excepto que agrega un salto en la lista de salto. Para evitar eso necesitas:
nnoremap * :keepjumps normal *``<cr>