Cómo buscar líneas que coincidan con la línea actual en vim

11

Generalmente busco palabras por :/string, pero si tengo que buscar en la línea actual completa, cómo hacerlo.

event: 1  beacon: 0x02              //line 1
event: 19 beacon: 0x02              //line 2
event: 1  beacon: 0x03              //line 3
event: 1  beacon: 0x02              //line 4
event: 8  beacon: 0x01              //line 5
event: 19 beacon: 0x02              //line 6
event: 1  beacon: 0x02              //line 7

Por ejemplo, si cursoractualmente se trata de line 1cómo buscar de manera similar al :/texto que contiene toda la línea actual. El cursor debería saltar a la coincidencia line 4, y nuevamente aline 7

manav mn
fuente

Respuestas:

7

Así es como lo haría:

  1. Yank la línea (en el registro sin nombre), sin incluir la nueva línea al final: 0y$
  2. Inicie una búsqueda muy nomagic :/\V
  3. Agregue la línea arrancada: <c-r>"
  4. Dispara de la búsqueda: <cr>

Como @EvergreenTree señala en un comentario , por supuesto, puede crear una asignación para realizar todos los pasos de una vez:

nnoremap <leader>* 0y$/\V<c-r>"<cr>

Temas de ayuda relevantes:

:help registers
:help /magic
:help c_CTRL-R

Nota: si la línea que está buscando contiene barras diagonales inversas, aún deberá atravesarlas y escapar de ellas (agregando otra barra diagonal inversa), incluso con una búsqueda muy nomagic .

Rico
fuente
44
Por supuesto, también puede crear un mapeo para esto: nnoremap {key} 0y$/\V<c-r>"<cr>
EvergreenTree
9

Especialmente para fines de mapeo, encuentro que usar es getline()más elegante que tirar de ti mismo. Llamar getline()con una cadena '.'devuelve la línea debajo del cursor. Hay dos buenas opciones para usar esto:

:exec '/' . getline('.')

que analiza las cadenas '/'y lo que se devuelve de forma getline()conjunta y lo ejecuta como un comando vim.

o

/<C-r>=getline('.')<CR>

que usa el registro de expresión @=. La siguiente expresión =se evalúa después de la primera <CR>y se coloca en la línea de comando.

Sakari Cajanus
fuente
¡Agradable! Cuando la línea contiene caracteres como /o 'no funciona muy bien. De todos modos, ¡aprendo algo hoy! Gracias
Luc M
4

Personalmente, obtendría un plugin visual star ( hay pocos por ahí ). Hay un buen Vimcast sobre esto: busca el texto seleccionado . Esto significa que puede seleccionar la línea visualmente y luego presionar *.

Si un complemento no es lo tuyo, puedes agregar la siguiente asignación a tu vimrc:

xnoremap * :<c-u>let @/=@"<cr>gvy:let [@/,@"]=[@",@/]<cr>/\V<c-r>=substitute(escape(@/,'/\'),'\n','\\n','g')<cr><cr>

Nota: Visual-block ( <c-v>) no es compatible con esta asignación.

Peter Rincker
fuente
Agregué las asignaciones pero en realidad está saltando a la primera palabra coincidente y NO seleccionando la línea completa.
manav mn
Si coincide con una palabra, supongo que está utilizando *el modo normal o no tiene la asignación instalada correctamente.
Peter Rincker
4

Todas las respuestas existentes fallan si su línea contiene ciertos elementos que se interpretan como parte de un patrón. El \Vpunto llega a la mayor parte del camino, pero aún se complica con la barra invertida.

Intenta esto para escapar de las barras invertidas ...

/\V<C-R>=escape(getline('.'), '\')

Y luego, si lo está utilizando en un mapeo, necesitará uno o dos <Enter>s al final, según cómo desee que funcione.

dash-tom-bang
fuente
Excelente respuesta! Las líneas a menudo contienen ambos tipos de barras que confunden las otras respuestas. Ese último argumento de fuga debe incluir una barra inclinada demasiado sin embargo:escape(…, '/\')
bobbogo
2

Con vim-asterisk instalado, solo use V$*(o 0v$*) para seleccionar la línea actual y buscarla.

En el segundo comando 0no es necesario si el cursor ya está en el inicio de la línea.

adelarsq
fuente
1
¿No *solo busca la palabra debajo del cursor y no la selección visual actual?
EvergreenTree
1
@EvergreenTree Olvidé mencionar el complemento. Gracias por el aviso
adelarsq
2

Una forma más de hacer esto es usar la ventana de línea de comandos: yy/<Ctrl-F>p<Enter>

  • Yank toda la línea que necesitas con yy
  • Presione /y luego Ctrl-F para abrir la ventana de línea de comandos
  • Presione ppara pegar la línea
  • Presione Entrar para comenzar la búsqueda
Boris Serebrov
fuente
55
También puede usar q/para obtener el mismo efecto que/<c-f>
evilsoup
2

http://vim.wikia.com/wiki/Searching_for_expressions_which_include_slashes señala que el registro de búsqueda se puede configurar directamente, así:

:let @/='/abc/def/ghi/'

Esto permite buscar en la línea y funciona incluso cuando la línea incluye barras.

Entonces, para hacer, digamos, un \*mapa a una búsqueda de línea:

nnoremap <leader>* :set hlsearch<cr>:let @/=getline('.')<cr>
Bernard Ogden
fuente