recherche vim autour des sauts de ligne

12

Lorsque je modifie un document LaTeX dans vim, je souhaite souvent rechercher une phrase. Parce que j'ai la configuration LaTeX pour encapsuler les lignes, parfois la moitié de la phrase sera sur une ligne tandis que l'autre moitié est sur la suivante. Dans un tel cas, la recherche ne trouve pas ce que je recherche. Donc par exemple

blah blah blah hello
world blah blah blah

lors de la recherche avec /hello world, je ne trouve pas ce que je recherche. Existe-t-il un moyen rapide et facile de modifier cette recherche pour me rendre où je veux être? Ou mieux encore, un moyen de dire à vim de faire correspondre n'importe quel espace blanc (espace, tabulation, nouvelle ligne) avec un espace dans la chaîne de recherche?

Bryan Ward
la source

Réponses:

14

Après plus de recherches, il semble que la façon la plus simple de le faire soit avec \_s. Ainsi, par exemple:

/hello\_sworld
Bryan Ward
la source
4
Vous voudrez hello\_s\+worldpeut-être s'il peut y avoir plus d'un caractère d'espacement entre eux, bien sûr.
Wodin
5

Ce problème a été résolu sur http://vim.wikia.com/wiki/Search_across_multiple_lines . Inclus est une fonction qui peut faire ce dont j'ai besoin.

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>

Ensuite, vous pouvez faire une recherche sur plusieurs lignes en utilisant :S hello worldet il le convertira hello\s\+worldet le recherchera. Une autre fonctionnalité intéressante est que cela ajoutera également cette nouvelle recherche à l'historique de recherche. Cela vous permet de revenir en arrière et de modifier la recherche en utilisant q/si vous en avez besoin. Il peut également être utilisé pour effectuer une substitution avec :%s//new thing/g. L'inconvénient est qu'il n'utilise pas incsearchsi vous l'avez activé.

Bryan Ward
la source
3

La façon dont je connais n'est pas difficile, mais c'est un peu fastidieux. Remplacez chaque espace de votre requête de recherche par ce qui suit:

[ \t\n]\+

(Notez l'espace après le [.) Il s'agit de la syntaxe de correspondance des expressions régulières. En panne, cela signifie:

  • [...] signifie correspondre à l'un des caractères de la liste entre crochets.
  • \t est Tab
  • \n est Newline
  • ...\+ signifie correspondre à un ou plusieurs des précédents.

Pour plus d'informations sur les expressions régulières, vous pouvez demander à vim:

:help regexp
:help usr_27
Jander
la source
1

Personnellement, j'utiliserais [ \t\n]*au lieu d'espaces. Cela correspondra à zéro ou plus de '', tabulation et nouvelle ligne. De cette façon, si une instance de votre modèle de recherche s'étend sur un saut de ligne, mais pas une autre, les deux seront mises en correspondance.

alesplin
la source