(Courriels de diversion: <grapheme@redoraient-affacturer.com> <relogerez@frise-taira.com> <placa@bas-fonds-repu.com> <graisserez@rattacheriez-ciselent.com> <allegeraient@labouriez-accomplissent.com> <suivantes@refroidisse-catalyserait.com> <attardez@ostracismes-defectueuse.com> <reinstallee@curiste-approximation.com> <inaugurions@charcuterait-encollent.com> <baba@tromperas-etaieras.com> )


Salut!

culte@externe.net (Guylhem XXXX) wrote in20030729014304.110e49a6.culte@externe.net:">news:20030729014304.110e49a6.culte@externe.net: 
> Auriez vous une idée pour un regexp s'appliquant de manière multiligne
> sous vi ? 

:h /\_

> Mes exemples :
> 
> 1. Insertion de caractères multi ligne
> <i>a
> b
> c
> d</i>
> 
> doit devenir:
> <i>a<br>
> b<br>
> c<br>
> d</i><br><br>

1) Sélectionne les lignes qui vont bien
2) :'<,'>s#\(</i>\)\=$#\=((submatch(1)!='')?'</i><br><br>':'<br>')#

Avec un mapping, cela devient
  :vnoremap µ :s#\(</i>\)\=$#\=((submatch(1)!='')?'</i><br><br>':'<br>')#
<cr>

:h submatch()

> 2. Fusion de lignes
> 001.1 aaa
> jj:
> kkk
> lll
> 004.6 bbb
> ccc
> dd
> 001.2 eee
> fff
> 002.5 ggg
> 
> doit devenir:
> 
> 001.1 aaa (jjj: kkk,lll)
> 004.6 bbb (ccc) (dd)
> 001.2 eee (fff)
> 002.5 ggg
> 
> c'est à dire si ça commence pas par au moins 3 nombres, on fusionne le
> tout en mettant entre parenthèse chaque ligne, sauf s'il y a deux
> points, dans quel cas on fait une liste.

1) Sélectionne les lignes qui vont bien
2) :'<,'>v#\d\{3}# s/.*/(\0)/ | exe "normal! \<up>J"

Soit avec un mapping:
  :vnoremap µ :v#\d\{3}# s/.*/(\0)/ \| normal! kJ<cr>

[finalement, vous aviez raison, ça peut être sympa d'enchainer un
:substitute sur un :global ;-) ]

> Une brève recherche sur google et le help regexp de vim me laissent
> supposer que non.

":h regexp" pour avoir la meilleure (ie: la plus complète) aide qui soit
pour les regex sous vim.

> Vous vous demandez sans doute pourquoi diable en vim lorsque perl
> marche ? 

Au pire, ":h perl" si tu sèches avec Vim et que tu connais bien perl.

> Pour le regexp 1, idem ce serait mappé à une touche et fonctionnel
> dans le bloc <i> </i> dans lequel se trouve actuellement le curseur. 

Donc, il te faudrait aussi:

function! s:SelectI() " pas testé
    let lig = searchpair('<i>', '</i>')
    if lig > 0
	" Je suppose que matchit.vim est correctment pour ton type de
	" fichier courant
	normal v%µ
	" Rem: pas d'exclamation à ce :normal
    endif
endfunction


  :vnoremap µ :s#\(</i>\)\=$#\=((submatch(1)!='')?'</i><br><br>':'<br>')#
<cr>
  :nnoremap µ :call <sid>SelectI()<cr>

> Bonne prise de tête :-)

Non, ce fut rapide, j'ai réussi à éviter tous les \@xxx


A+

-- 
Luc Hermitte
http://hermitte.free.fr/vim/

--------------------------------------------------------------------
Les listes de diffusion occultes: <URL:http://www.CULTe.org/listes/>