2010-11-23 15 views
36

La clave super star (*) en ViM buscará la palabra bajo el cursor y saltará hacia adelante a la siguiente coincidencia. El usuario puede saltar a las próximas coincidencias con la clave n. Si hlsearch está habilitado, también resaltará las coincidencias.ViM: busque y resalte pero no salte

Quiero poder presionar * y obtener las coincidencias resaltadas y ser capaz de navegar por las coincidencias con la tecla n. Sin embargo, hago 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?

Respuesta

23

me habría mapa:

nnoremap * *`` 

funciona exactamente igual que usted quiere, excepto que se añade un salto en la lista de saltos. Para evitar que se necesita:

nnoremap * :keepjumps normal *``<cr> 
+0

por "parpadeo" Quise decir que parpadeará, si la siguiente palabra coincidente está fuera de la pantalla ... – khachik

+0

¡Esto es exactamente lo que quería! ¡Muchas gracias! :-) –

+17

El segundo no funciona para mí, cuando presiono * dice: "E169: comando demasiado recursivo" – Deqing

2

Me vino a la mente una solución simple: poner map * *# en el archivo .vimrc (sin embargo, parpadeará).

+0

por qué no * '' por lo que el cursor vuelve exactamente a la misma posición – mb14

+0

@ mb14 ¿trae algún beneficio '#' no tiene? – khachik

+0

funciona ;-) * # mueve el cursor al comienzo de la palabra si estuviste en el medio y peor, si configuras nowquescan y haces una búsqueda desde la última ocurrencia de una palabra * # te mueve a la palabra anterior (porque * no saltó a ningún lado) – mb14

5

Tengo el 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> 
3

Si desea mantener la vista actual y añadir la buscar a la historia, trata esta solución [no tan eficiente]:

noremap * msHmt`s*`tzt`s 

está utilizando las marcas s (guardar) y t (arriba).

5

La mejor solución:

  1. no agrega un salto a la lista de saltos
  2. el comportamiento de la tecla de asterisco no se puede cambiar

así, probar el plugin: 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> 
+0

Gran complemento, otra función útil es que puede usar '*' para buscar texto seleccionado en modo Visual. El inconveniente es que mueve el cursor al comienzo de la palabra, si estaba en el medio de la palabra. – Deqing

+0

La tercera opción funciona mejor para mí. Destaca y tanto la pantalla como el cursor no se mueven. –

2

No he visto éste con todo:

nmap <silent> * "syiw<Esc>: let @/ = @s<CR>

Es muy corto y no implica saltar alrededor de la cual puede dar lugar a parpadear.

Explicación: copiar la palabra bajo el cursor a s registro y luego configurar el registro de búsqueda (/) con el contenido de s registro. 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.

Cuestiones relacionadas