пошук vim навколо обривів рядків


12

Коли я редагую документ LaTeX in vim, часто мені хочеться шукати фразу. Оскільки у мене є програма LaTeX, щоб обертати лінії, іноді половина фрази буде на одному рядку, а друга половина - на другому. У такому випадку пошук не знаходить того, що я шукаю. Так, наприклад

blah blah blah hello
world blah blah blah

під час пошуку за допомогою /hello worldя не знаходжу те, що шукаю. Чи є швидкий і простий спосіб змінити цей пошук, щоб перевести мене там, де я хочу бути? Або ще краще - спосіб сказати vim, щоб відповідати будь-якому пробілу (пробіл, вкладка, новий рядок) з пробілом у рядку пошуку?

Відповіді:


15

Після більшого пошуку виглядає найпростіший спосіб зробити це \_s. Так, наприклад:

/hello\_sworld

4
Ви можете захотіти, hello\_s\+worldякщо між ними може бути більше одного символу пробілу.
Водін

5

Цю проблему було вирішено на веб-сайті http://vim.wikia.com/wiki/Search_across_multiple_lines . Входить функція, яка може робити те, що мені потрібно.

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>

Тоді ви можете виконати багаторядковий пошук, використовуючи :S hello worldце, і це перетворить це в hello\s\+worldі шукатиме його. Ще одна приємна особливість полягає в тому, що це також додасть цей новий пошук до історії пошуку. Це дозволяє повернутися назад та змінити пошук, використовуючи, q/якщо вам це потрібно. Його також можна використовувати для заміни :%s//new thing/g. Мінусом цього є те, що воно не використовується, incsearchякщо ви його включили.


3

Те, що я знаю, не є важким, але трохи втомлює. Замініть кожен простір у вашому пошуковому запиті на наступне:

[ \t\n]\+

(Зверніть увагу на пробіл після [.) Це синтаксис відповідних регулярних виразів. Розбитий, це означає:

  • [...] означає відповідати будь-якому зі списку символів всередині дужок.
  • \t є Tab
  • \n є Newline
  • ...\+ означає, що відповідають одному або більше попередніх.

Для отримання додаткової інформації про регулярні вирази, ви можете запитати vim:

:help regexp
:help usr_27

1

Я особисто використовував би [ \t\n]*замість пробілів. Це буде відповідати нулю або більше "," табуляції та нового рядка ". Таким чином, якщо один екземпляр вашого шаблону пошуку охоплює розрив рядка, а інший - ні, і те і інше.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.