vim mencari di sekitar jeda baris

12

Ketika saya mengedit dokumen LaTeX di vim, sering kali saya ingin mencari frasa. Karena saya memiliki pengaturan LaTeX untuk membungkus baris, kadang-kadang setengah dari frasa akan berada pada satu baris sedangkan setengah lainnya pada baris berikutnya. Dalam kasus seperti itu, pencarian tidak menemukan apa yang saya cari. Jadi misalnya

blah blah blah hello
world blah blah blah

saat mencari menggunakan /hello world, saya tidak menemukan apa yang saya cari. Apakah ada cara cepat dan mudah untuk memodifikasi pencarian ini untuk mendapatkan saya di tempat yang saya inginkan? Atau lebih baik lagi, cara untuk memberitahu vim agar cocok dengan spasi putih (spasi, tab, baris baru) dengan spasi di string pencarian?

Bryan Ward
sumber

Jawaban:

14

Setelah mencari lebih banyak, sepertinya ini adalah cara termudah untuk melakukannya \_s. Jadi misalnya:

/hello\_sworld
Bryan Ward
sumber
4
Anda mungkin ingin hello\_s\+worldjika ada lebih dari satu karakter spasi putih di antara mereka, tentu saja.
Wodin
5

Masalah ini telah diatasi di http://vim.wikia.com/wiki/Search_across_multiple_lines . Termasuk adalah fungsi yang dapat melakukan apa yang saya butuhkan.

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>

Kemudian Anda dapat melakukan pencarian multi-line menggunakan :S hello worlddan itu akan mengubahnya menjadi hello\s\+worlddan mencarinya. Fitur bagus lainnya adalah ini juga akan menambahkan pencarian baru ini ke histori pencarian. Ini memungkinkan Anda untuk kembali dan memodifikasi pencarian menggunakan q/jika Anda perlu. Ini juga dapat digunakan untuk melakukan substitusi dengan :%s//new thing/g. Kelemahan dari ini adalah tidak digunakan incsearchjika Anda mengaktifkannya.

Bryan Ward
sumber
3

Cara yang saya tahu tidak sulit, tetapi sedikit membosankan. Ganti setiap ruang dalam permintaan pencarian Anda dengan yang berikut:

[ \t\n]\+

(Catat spasi setelah [.) Ini adalah sintaks pencocokan ekspresi reguler. Rusak, artinya:

  • [...] berarti cocok dengan salah satu dari daftar karakter di dalam tanda kurung.
  • \t adalah Tab
  • \n adalah Newline
  • ...\+ berarti cocok dengan satu atau lebih dari yang sebelumnya.

Untuk info lebih lanjut tentang ekspresi reguler, Anda dapat bertanya vim:

:help regexp
:help usr_27
Jander
sumber
1

Saya pribadi akan menggunakan [ \t\n]*bukan spasi. Ini akan cocok dengan nol atau lebih dari '', tab, dan baris baru. Dengan cara ini jika satu contoh dari pola pencarian Anda membentang jeda baris, tetapi yang lain tidak, keduanya akan dicocokkan.

alesplin
sumber