cerca tra le interruzioni di riga


12

Quando sto modificando un documento LaTeX in vim, spesso voglio cercare una frase. Poiché ho installato LaTeX per avvolgere le linee, a volte metà della frase sarà su una riga mentre l'altra metà è sulla successiva. In tal caso, la ricerca non trova ciò che sto cercando. Quindi per esempio

blah blah blah hello
world blah blah blah

durante la ricerca utilizzando /hello world, non trovo quello che sto cercando. C'è un modo semplice e veloce per modificare questa ricerca per portarmi dove voglio essere? O meglio ancora, un modo per dire a VIM di abbinare qualsiasi spazio bianco (spazio, tabulazione, nuova linea) con uno spazio nella stringa di ricerca?

Risposte:


14

Dopo ulteriori ricerche, sembra che il modo più semplice per farlo sia con \_s. Quindi per esempio:

/hello\_sworld

4
Potresti volere hello\_s\+worldse ci fosse più di uno spazio bianco tra loro, ovviamente.
Wodin,

5

Questo problema è stato risolto su http://vim.wikia.com/wiki/Search_across_multiple_lines . Inclusa è una funzione che può fare ciò di cui ho bisogno.

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>

Quindi puoi fare una ricerca su più righe usando :S hello worlde la convertirà e la cercherà hello\s\+world. Un'altra caratteristica interessante è che questo aggiungerà anche questa nuova ricerca alla cronologia delle ricerche. Ciò consente di tornare indietro e modificare la ricerca utilizzando q/se necessario. Può anche essere usato per fare la sostituzione con :%s//new thing/g. L'aspetto negativo di questo è che non viene utilizzato incsearchse è stato abilitato.


3

Il modo in cui conosco non è difficile, ma è un po 'noioso. Sostituisci ogni spazio nella tua query di ricerca con il seguente:

[ \t\n]\+

(Nota lo spazio dopo il [.) Questa è la sintassi di corrispondenza delle espressioni regolari. Ripartito, significa:

  • [...] significa abbinare uno qualsiasi dell'elenco di caratteri tra parentesi.
  • \t è Tab
  • \n è Newline
  • ...\+ significa abbinare uno o più dei precedenti.

Per maggiori informazioni sulle espressioni regolari, puoi chiedere a vim:

:help regexp
:help usr_27

1

Personalmente avrei usato al [ \t\n]*posto degli spazi. Questo corrisponderà su zero o più di '', tab e newline. In questo modo se un'istanza del tuo modello di ricerca si estende su un'interruzione di riga, ma un'altra no, entrambe verranno abbinate.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.