[vim] Re: function au bufenter

2003-01-15 Par sujet Luc Hermitte
Salut,

Je suis intrigué par le titre de ton message ... Pourquoi continues-tu à
utiliser des autocommands ? Procéder avec les mail ftplugins est bien
plus propre.

* On Wed, Jan 15, 2003 at 01:18:06PM +0100, Sébastien MICHEL [EMAIL PROTECTED] 
wrote:
   Je suis entrain de revoir mes fonction de remise en forme
 de mail.
 Voici ce que j'ai pour l'instant
 map ;vide :0CR/^$CR
 map ;par ;videCR:.,$normal vgqCR
 
 voici ce que je veux faire:
 map ;para ;videCR/^.\{75\}.\+$CRv/\.$CRgqj

Utilises tw plutot que 75. Comme ça si un jour tu veux changer de
valeur ou en faire profiter d'autres personnes, tu n'auras rien d'autre
à faire qu'un :
:set tw=72

Sinon, j'imagine que tu considères que les paragraphes sont délimités par
des points et non par des lignes vides.

 mais j'aimerai le faire dans une boucle du genre
 while /^.\{75\}.\+$
   ;para
 endwhile

 L'ideale serai de ne pas touche ma signature aussi... ;)
 je vais essayer de remplacer ce while par un g// pour eviter
 la creation d'une fonction mais c'est pas gagné ;p

Faire des fonctions n'a rien de sale. C'est bien plus lisible et
maintenable que les mappings 100 vi (sans 'm').
Pourquoi pas un truc du style (pas testé):


function s:Toto()
let pos = line('.')
normal! G
let fin = search('^-- $', 'b')
if fin = 0 | let fin = line('$') | endif
exe pos
while pos  fin
let pos = search('^.\{'.tw.'}.\+$', 'W') 
 Sans le 'W', la function pourrait boucler et revenir à la
 section des entêtes. Chose que fait aussi '/' si 'wrapscan'
 n'est pas mis à faux.
if pos = 0
break 
endif
:normal! gq/\.$j
 forme simplifiée sans passer par 'v' vu que 'gq' nous laisse
 dans l'/operator-pending mode/, cf |motion.txt|
 :normal! gq'} 
   +-- pour: jusqu'à la fin du paragraphe plutot que le point
suivant. Tout le monde ne pense pas à mettre des points
à la fin ses phrases. Sauter des lignes est plus
fréquent.
endwhile
endfunction

:nnoremap ;doit gg'}:call sidToto()cr

Par contre, c'est totalement inadapté à des messages comme celui-ci qui
contient du code.

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



Re: [vim] Re: function au bufenter

2003-01-15 Par sujet Sbastien MICHEL
Le mercredi 15 janvier 2003 à 15:58, Luc Hermitte a écrit:
 Salut,

Lut,

 Je suis intrigué par le titre de ton message ... Pourquoi continues-tu à
 utiliser des autocommands ? Procéder avec les mail ftplugins est bien
 plus propre.

oki oki... je promet que je vais me pencher sur la
question...mais j'ai pas trop le courage ;)

 * On Wed, Jan 15, 2003 at 01:18:06PM +0100, Sébastien MICHEL [EMAIL PROTECTED] 
wrote:
Je suis entrain de revoir mes fonction de remise en forme
  de mail.
  Voici ce que j'ai pour l'instant
  map ;vide :0CR/^$CR
  map ;par ;videCR:.,$normal vgqCR
  
  voici ce que je veux faire:
  map ;para ;videCR/^.\{75\}.\+$CRv/\.$CRgqj
 
 Utilises tw plutot que 75. Comme ça si un jour tu veux changer de
 valeur ou en faire profiter d'autres personnes, tu n'auras rien d'autre
 à faire qu'un :
 :set tw=72

marche pas il me fait: Syntax error in \{...}

 Sinon, j'imagine que tu considères que les paragraphes sont délimités par
 des points et non par des lignes vides.

maintenant voici comment je fais:
map ;par ;videCR:.,$g/^.\{75\}.\+$/normal V)gqCR
autocmd BufRead .followup,.article*,.letter,/tmp/mutt*,*.txt normal ;par

  mais j'aimerai le faire dans une boucle du genre
  while /^.\{75\}.\+$
  ;para
  endwhile
 
  L'ideale serai de ne pas touche ma signature aussi... ;)
  je vais essayer de remplacer ce while par un g// pour eviter
  la creation d'une fonction mais c'est pas gagné ;p
 
 Faire des fonctions n'a rien de sale. C'est bien plus lisible et
 maintenable que les mappings 100 vi (sans 'm').
 Pourquoi pas un truc du style (pas testé):

J'ai pas dis que c'était sale... Je voulais juste evité car
je n'ai pas assez de connaissance en script vim... mais avec
ton exemple ça ira mieux :)

 function s:Toto()

A quoi sert le s: d'après ce que j'ai compris tu n'en a
pas besoin si tu appelle ta fonction avec une majuscule ?

 let pos = line('.')
 normal! G
 let fin = search('^-- $', 'b')
 if fin = 0 | let fin = line('$') | endif
 exe pos
 while pos  fin
   let pos = search('^.\{'.tw.'}.\+$', 'W') 
Sans le 'W', la function pourrait boucler et revenir à la
section des entêtes. Chose que fait aussi '/' si 'wrapscan'
n'est pas mis à faux.
   if pos = 0
   break 
   endif
   :normal! gq/\.$j
forme simplifiée sans passer par 'v' vu que 'gq' nous laisse
dans l'/operator-pending mode/, cf |motion.txt|
:normal! gq'} 
 ^

' est vraiment utile ?

  +-- pour: jusqu'à la fin du paragraphe plutot que le point
   suivant. Tout le monde ne pense pas à mettre des points
   à la fin ses phrases. Sauter des lignes est plus
   fréquent.
 endwhile
 endfunction
 
 :nnoremap ;doit gg'}:call sidToto()cr
^ ???

Cool... Tu as de la doc pour apprendre a faire des scripts
vim je n'en trouve pas... a part regarder les scripts des
autres ;).

 Par contre, c'est totalement inadapté à des messages comme celui-ci qui
 contient du code.

Pour quel raison c'est inadequat ?

Merci .

-- 
@+, Sébastien aka. MichouX 
J'ai réalisé que j'étais un fan de Vim quand je l'utilisais 
pour éditer mon .emacs, GnuVince



[vim] Re: function au bufenter

2003-01-15 Par sujet Luc Hermitte
* On Wed, Jan 15, 2003 at 07:18:05PM +0100, Sébastien MICHEL [EMAIL PROTECTED] 
wrote:
  Utilises tw plutot que 75. Comme ça si un jour tu veux changer de
  valeur ou en faire profiter d'autres personnes, tu n'auras rien
  d'autre à faire qu'un :
  :set tw=72
 
 marche pas il me fait: Syntax error in \{...}

Il faut passer par :exe dans ces cas là.
nnoremap ;para gg'}:exe '/^.\{'.(1+tw).'\}'CRgq/\.$CRj
nnoremap ;vide gg'}


  function s:Toto()
 A quoi sert le s: d'après ce que j'ai compris tu n'en a pas besoin
 si tu appelle ta fonction avec une majuscule ?

A ne par polluer l'espaces des noms partagés par tous les scripts
chargés en mémoire.
Ainsi, les fichier toto.vim et titi.vim peuvent chacun définir une
fonction s:Toto() sans qu'il y ait collision ou ambiguité.

   :normal! gq'} 
^
 ' est vraiment utile ?

Plutôt. Tu ne peux pas être sûr qu'un jour où l'autre tu ne vas pas
utiliser les scripts de quelqu'un (ou le contraire) qui à remappé «gq»
ou «q'».
C'est une sécurité au même titre que _nore_map.

  :nnoremap ;doit gg'}:call sidToto()cr
 ^ ???
Fait référence à la fonction s:Toto() qui est définie dans le fichier
courant.

 Cool... Tu as de la doc pour apprendre a faire des scripts vim je n'en
 trouve pas... a part regarder les scripts des autres ;).

Ce fut ma doc principale à mes débuts. Ensuite, il y a quelques tips de
qualité sur sourceforge et la doc en ligne. Je ne sais pas ce que vaut
le bouquin sur vim. Je crois savoir qu'il est est aussi dispo en version
électronique.

  Par contre, c'est totalement inadapté à des messages comme celui-ci
  qui contient du code.
 Pour quelle raison c'est inadequat ?

Si le code que je tape fait disons 75 caractères de large et que tu y
réponds, alors mutt rajoutes ' ' devant chaque ligne, ce qui les passe
à 77 caractères. En applicant ta macro automatiquement, toute la partie
correspondante va être saccagée. Vim ne saura pas formatter le code vu
qu'il est en mode message électronique (mail ou article).

-- 
Luc Hermitte