pesquisa vim em torno de quebras de linha

12

Quando estou editando um documento LaTeX no vim, muitas vezes desejo pesquisar uma frase. Como eu tenho a configuração do LaTeX para quebrar as linhas, às vezes metade da frase fica em uma linha, enquanto a outra metade está na próxima. Nesse caso, a pesquisa não encontra o que estou procurando. Então por exemplo

blah blah blah hello
world blah blah blah

ao pesquisar usando /hello world, não encontro o que estou procurando. Existe uma maneira rápida e fácil de modificar essa pesquisa para chegar onde eu quero estar? Ou melhor ainda, uma maneira de dizer ao vim para combinar com qualquer espaço em branco (espaço, tabulação, nova linha) com um espaço na cadeia de pesquisa?

Bryan Ward
fonte

Respostas:

14

Após mais pesquisas, parece que a maneira mais fácil de fazer isso é \_s. Então, por exemplo:

/hello\_sworld
Bryan Ward
fonte
4
Você pode querer hello\_s\+worldse houver mais de um caractere de espaço em branco entre eles, é claro.
Wodin
5

Esse problema foi solucionado em http://vim.wikia.com/wiki/Search_across_multiple_lines . Está incluída uma função que pode fazer o que eu preciso.

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>

Em seguida, você pode fazer uma pesquisa em várias linhas usando :S hello worlde ela será convertida hello\s\+worlde pesquisada. Outro recurso interessante é que isso também adicionará essa nova pesquisa ao histórico de pesquisas. Isso permite que você volte e modifique a pesquisa usando, q/se necessário. Também pode ser usado para fazer a substituição :%s//new thing/g. A desvantagem disso é que ele não será usado incsearchse você o tiver ativado.

Bryan Ward
fonte
3

O jeito que eu sei não é difícil, mas é um pouco tedioso. Substitua todos os espaços da sua consulta de pesquisa pelo seguinte:

[ \t\n]\+

(Observe o espaço após o [.) Essa é a sintaxe da correspondência de expressão regular. Dividido, significa:

  • [...] significa corresponder a qualquer um da lista de caracteres entre colchetes.
  • \t é tab
  • \n é nova linha
  • ...\+ significa corresponder a um ou mais dos anteriores.

Para mais informações sobre expressões regulares, você pode perguntar ao vim:

:help regexp
:help usr_27
Jander
fonte
1

Eu pessoalmente usaria em [ \t\n]*vez de espaços. Isso corresponderá a zero ou mais de '', guia e nova linha. Dessa forma, se uma instância do seu padrão de pesquisa abranger uma quebra de linha, mas outra não, ambas serão correspondidas.

alesplin
fonte