Vim - tira al registro de búsqueda

81

¿Existe alguna manera fácil / rápida de "tirar" en el registro de "última búsqueda" de vim ("/)?

De la documentación de vim, parece que la respuesta es no, pero que se puede asignar mediante un comando "dejar":

It is writable with ":let", you can change it to have 'hlsearch' highlight
other matches without actually searching.  You can't yank or delete into this
register.

Idealmente, lo que me gustaría hacer es algo como:

"/5yw

que arrastraría las siguientes 5 palabras debajo del cursor y las colocaría en el último búfer de búsqueda

Alternativamente, si hay una forma de buscar el contenido de un registro con nombre, también funcionaría. En otras palabras, si pudiera hacer:

"A5yw

y luego busque lo que está en el registro A, eso también funcionaría.

Lo más cerca que puedo hacer es ingresar a un registro con nombre y luego copiar ese registro en el último registro de búsqueda, por ejemplo

"A5yw
:let @/=@A

A riesgo de hacer una pregunta larga más larga, quiero decir que no siempre son 5 palabras las que me gustaría "tirar y buscar": a veces son 17 caracteres, a veces hasta el final de la línea, etc. por lo que una macro codificada no me da la flexibilidad que quisiera.

Dan
fuente

Respuestas:

110

Después de presionar /para ingresar una cadena de búsqueda, puede usar Ctrl-Ry luego escribir la letra que representa el registro que desea usar.

p.ej.

  • Primero, "Ayw para colocar una palabra en el registro A
  • Luego, / ^R A para poner el contenido del registro A en la cadena de búsqueda.
Arkansas
fuente
1
Esto, por supuesto, funciona, pero parece que es posible que el OP no quiera buscar, solo obtener el resaltado. Si ese es el caso, un operador personalizado sería el camino a seguir.
Cascabel
1
Super - gracias ar ... eso es exactamente lo que necesitaba (bueno, bajo las limitaciones de que la solución perfecta en realidad no es posible en primer lugar). Gracias por la solución concisa.
Dan
11
Solo un comentario ... "Ayw no tira la palabra al registro 'A' ... agrega la cosa que se tira al registro 'a'.
jkerian
1
+1 he estado buscando esto por un tiempo, la solución perfecta al problema que estaba tratando de resolver, gracias.
iblamefish
8
En aras de la claridad, vim usa el caso del registro para determinar si está agregando o reemplazando el contenido, por lo que "ayw(minúsculas) reemplazaría el contenido del registro 'a', mientras "Aywque agregaría al registro 'a'
Peter Gibson
40

Si no usó ningún registro para almacenar el texto extraído, vim usa 0register. Puede buscarlo escribiendo Ctrl-R 0después /.

Un ejemplo más complicado. Digamos que desea buscar en otro búfer el texto entre comillas que se encuentra debajo del cursor en este momento:

  • Puedes hacer eso con yi"(tirar cita interna)
  • Vaya al búfer donde desea buscar
  • Tipo /Ctrl-R 0
csierra
fuente
1
Encontré esta solución más útil que la de a'r, ya que la conducción repetida "Ayw produce una cadena agregada en el registro A. Pero simplemente escribir ywy luego escribir Ctrl-R 0después /siempre da exactamente lo que tiré.
David Jung
10

Estoy usando el siguiente código para eso:

vnoremap <silent>* <ESC>:call VisualSearch('/')<CR>/<CR>
vnoremap <silent># <ESC>:call VisualSearch('?')<CR>?<CR>

    function! VisualSearch(dirrection)
        let l:register=@@
        normal! gvy
        let l:search=escape(@@, '$.*/\[]')
        if a:dirrection=='/'
            execute 'normal! /'.l:search
        else
            execute 'normal! ?'.l:search
        endif
        let @/=l:search
        normal! gV
        let @@=l:register
    endfunction
Nikolay Frantsev
fuente
En caso de que no esté claro, esto le permite seleccionar algún texto en modo visual y usar * o # para buscar ese texto.
Edward Anderson
6

Buscando una selección:

si primero desea tirar de una sección de una línea, luego use "v" y muévase con los cursores hasta que haya marcado lo que desea, luego presione y para tirar y ahora la selección está en el registro 0

entonces puedes escribir /Ctrl-R 0

serup
fuente
5

Entonces, básicamente, una versión extendida de los comandos # y *, ¿verdad? Parece que desea definir un operador personalizado (un comando que espera un movimiento). En realidad, nunca he hecho esto, pero encontré un complemento que parece que podría facilitarlo. Se proporcionan algunos ejemplos.

Cascabel
fuente