vim buscar saltos de línea

12

Cuando estoy editando un documento de LaTeX en vim, muchas veces quiero buscar una frase. Debido a que tengo la configuración de LaTeX para ajustar las líneas, a veces la mitad de la frase estará en una línea mientras que la otra mitad está en la siguiente. En tal caso, la búsqueda no encuentra lo que estoy buscando. Así por ejemplo

blah blah blah hello
world blah blah blah

cuando /hello worldbusco usando , no encuentro lo que estoy buscando. ¿Hay alguna forma rápida y fácil de modificar esta búsqueda para llevarme a donde quiero estar? O mejor aún, ¿una forma de decirle a vim que haga coincidir cualquier espacio en blanco (espacio, tabulación, nueva línea) con un espacio en la cadena de búsqueda?

Bryan Ward
fuente

Respuestas:

14

Después de más búsquedas, parece que la forma más fácil de hacerlo es con \_s. Así por ejemplo:

/hello\_sworld
Bryan Ward
fuente
44
Es posible que desee hello\_s\+worldsi puede haber más de un carácter de espacio en blanco entre ellos, por supuesto.
Wodin
5

Este problema se abordó en http://vim.wikia.com/wiki/Search_across_multiple_lines . Se incluye una función que puede hacer lo que necesito.

function! SearchMultiLine(bang, ...)
  if a:0 > 0
    let sep = (a:bang) ? '\_W\+' : '\_s\+'
    let @/ = join(a:000, sep)
  endif
endfunction
command! -bang -nargs=* -complete=tag S call SearchMultiLine(<bang>0, <f-args>)|normal! /<C-R>/<CR>

Luego puede hacer una búsqueda de varias líneas utilizando :S hello worldy la convertirá hello\s\+worldy la buscará. Otra característica interesante es que esto también agregará esta nueva búsqueda al historial de búsqueda. Esto le permite regresar y modificar la búsqueda usando q/si es necesario. También se puede usar para hacer sustitución con :%s//new thing/g. La desventaja de esto es que no se usa incsearchsi lo tiene habilitado.

Bryan Ward
fuente
3

La forma en que lo sé no es difícil, pero es un poco tediosa. Reemplace cada espacio en su consulta de búsqueda con lo siguiente:

[ \t\n]\+

(Tenga en cuenta el espacio después de [.) Esta es una sintaxis coincidente de expresión regular. Desglosado, significa:

  • [...] significa coincidir con cualquiera de la lista de caracteres dentro de los corchetes.
  • \t es Tab
  • \n es Newline
  • ...\+ significa coincidir con uno o más de los anteriores.

Para obtener más información sobre expresiones regulares, puede preguntar vim:

:help regexp
:help usr_27
Jander
fuente
1

Yo personalmente usaría en [ \t\n]*lugar de espacios. Esto coincidirá con cero o más de '', pestaña y nueva línea. De esta manera, si una instancia de su patrón de búsqueda abarca un salto de línea, pero otra no, ambos coincidirán.

alesplin
fuente