🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: fr.comp.applications.emacs
9 messages
9 total messages Started by Stéphane Dutailly Sun, 21 Oct 2012 13:32
afficher le résultat d'un compteur dans le buffer
#71
Author: Stéphane Dutailly
Date: Sun, 21 Oct 2012 13:32
60 lines
2927 bytes
Bonjour,

J'aimerais pouvoir faire afficher dans mon buffer, le r�sultat d'une 
fonction.
Concr�tement, je sais compter dans mon buffer (fichier tex ici) le 
nombre de fois o� appara�t l'expression << \begin{exercice} >> (avant le 
curseur ou dans l'ensemble du buffer). J'aimerais que ceci s'affiche:

...
\begin{document}
...
\begin{exercice}
% 1
mon �nonc�
\end{exercice}

\begin{exercice}
% 2
mon �nonc�
\end{exercice}

\begin{exercice}
% 3
mon �nonc�
\end{exercice}

...
\end{document}

Ce que je souhaite, c'est lancer une commande qui mettra � jour les 
num�ros de mes exercices. Par exemple, si je rajoute un exercice entre 
le n�2 et le n�3, je souhaite que mon nouvel exercice obtienne le num�ro 
3 et que le num�ro de l'ancien exercice 3 passe � 4.

J'ai deux id�es (que je ne sais pas comment programmer malheureusement):

- soit faire une fonction qui va �crire dans le fichier � c�t� de chaque 
<< \begin{exercice} >> le num�ro de mon exercice de la fa�on suivante: 
avec une regexp on cherche l'expression, on applique 
kmacro-insert-counter puis on recommence avec l'expression suivante

- soit faire en sorte qu'il y ait dans le buffer une instruction qui 
s'adresse � emacs pour qu'il remplace cette commande par le r�sultat de 
mon compteur d'exercice. Quelque chose comme:
dans le buffer:
\begin{exercice}
% "commande sp�ciale pour emacs"

puis je ferais:
M-x remplace-commande-speciale-pour-emacs-par-valeur-du-compteur

et j'aurais:
\begin{exercice}
% 1
...
\begin{exercice}
% 2

Merci d'avance pour votre aide ou encore pour tout d�but de piste.
St�phane
Re: afficher le résultat d'un compteur dans le buffer
#72
Author: Alain Ketterlin
Date: Sun, 21 Oct 2012 15:39
30 lines
2129 bytes
Stéphane Dutailly <dutaillys@yahoo.fr> writes:

> J'aimerais pouvoir faire afficher dans mon buffer, le résultat d'une
> fonction.
> Concrètement, je sais compter dans mon buffer (fichier tex ici) le
> nombre de fois où apparaît l'expression << \begin{exercice} >> (avant
> le curseur ou dans l'ensemble du buffer). J'aimerais que ceci
> s'affiche:
>
> ...
> \begin{document}
> ...
> \begin{exercice}
> % 1
> mon énoncé
> \end{exercice}
[...]

M-x find-function RET count-matches RET

Tu tombes sur le code de count-matches (enfin, how-many, il y a un
alias), que tu recopies pour la modifier (et changer de nom). Vers la
fin de cette fonction tu trouves (setq count (1+ count)), qui incrémente
le compteur. Juste après, tu utilises insert (et sûrement format) pour
placer la valeur dans le buffer.

-- Alain.
Re: afficher le résultat d'un compteur dans le buffer
#73
Author: Stéphane Dutailly
Date: Sun, 21 Oct 2012 17:58
32 lines
2648 bytes
Le 21/10/2012 17:39, Alain Ketterlin a écrit :
> Stéphane Dutailly <dutaillys@yahoo.fr> writes:
>
>> J'aimerais pouvoir faire afficher dans mon buffer, le résultat d'une
>> fonction.
>> Concrètement, je sais compter dans mon buffer (fichier tex ici) le
>> nombre de fois où apparaît l'expression << \begin{exercice} >> (avant
>> le curseur ou dans l'ensemble du buffer). J'aimerais que ceci
>> s'affiche:
>>
>> ...
>> \begin{document}
>> ...
>> \begin{exercice}
>> % 1
>> mon énoncé
>> \end{exercice}
> [...]
>
> M-x find-function RET count-matches RET
>
> Tu tombes sur le code de count-matches (enfin, how-many, il y a un
> alias), que tu recopies pour la modifier (et changer de nom). Vers la
> fin de cette fonction tu trouves (setq count (1+ count)), qui incrémente
> le compteur. Juste après, tu utilises insert (et sûrement format) pour
> placer la valeur dans le buffer.
>
> -- Alain.
>

Merci Alain, je vais essayer cela.
Stéphane
Re: afficher le r�sultat d'un compteur dans le buffer
#74
Author: Vincent Bela�che
Date: Tue, 23 Oct 2012 04:01
28 lines
2299 bytes
St�phane Dutailly <dutaillys@yahoo.fr> writes:

> Le 21/10/2012 17:39, Alain Ketterlin a �crit :
>> St�phane Dutailly <dutaillys@yahoo.fr> writes:
>>

[...]

>> -- Alain.
>>
>
> Merci Alain, je vais essayer cela.
> St�phane

Pas essay�, mais je ferai un truc de ce genre:

(defun mise-�-jour-compteur-d\'exo ()
  (interactive)
  (save-excursion
    (goto-char (point-min))
    (let ((compteur 1))
      (while (re-search-forward "^\\s-*\\end\\s-*{exercice}" nil t)
	(beginning-of-line 2)
	(if
	    (looking-at "%\\s-+[0-9]+\\s-+$")
	    (replace-match (format "%% %d" compteur) t)
	  (insert  (format "%% %d\n" compteur)))
	(setq compteur (1+ compteur))))))
Re: afficher le résultat d'un compteur dans le buffer
#75
Author: Olve
Date: Wed, 31 Oct 2012 07:00
8 lines
1593 bytes
> (defun mise-�-jour-compteur-d\'exo ()

La fonction est parfaite, mais avec un "\" dans le nom, �a va pas aller :)

Latex/emacs/latex/emacs ..., faut choisir sa syntaxe !
Amiti�s,
           Olivier
Re: afficher le r�sultat d'un compteur dans le buffer
#77
Author: Vincent Bela�che
Date: Thu, 08 Nov 2012 05:59
21 lines
2091 bytes
Olve <Olve@nowhere.wd.invalid> writes:

>> (defun mise-�-jour-compteur-d\'exo ()
>
> La fonction est parfaite, mais avec un "\" dans le nom, �a va pas aller :)
>
> Latex/emacs/latex/emacs ..., faut choisir sa syntaxe !
> Amiti�s,
>           Olivier

Mais si, mais si, le \ dans le nom ne sert qu' � �chapper le ' qui est
un caract�re sp�cial en Lisp.

Si tu as les caract�re ( ) ' " # \ ou espace dans un symbole il faut les
�chapper.

Ceci dit je reconnais que ce n'est pas une tr�s bonne pratique
d'utiliser ce genre de caract�re --- c'�tait juste pour �crire en
fran�ais...

  Vincent.
Re: afficher le résultat d'un compteur dans le buffer
#78
Author: Stéphane Dutailly
Date: Thu, 08 Nov 2012 21:30
77 lines
3856 bytes
Le 23/10/2012 06:01, Vincent Bela�che a �crit :
> St�phane Dutailly <dutaillys@yahoo.fr> writes:
>
>> Le 21/10/2012 17:39, Alain Ketterlin a �crit :
>>> St�phane Dutailly <dutaillys@yahoo.fr> writes:
>>>
>
> [...]
>
>>> -- Alain.
>>>
>>
>> Merci Alain, je vais essayer cela.
>> St�phane
>
> Pas essay�, mais je ferai un truc de ce genre:
>
> (defun mise-�-jour-compteur-d\'exo ()
>    (interactive)
>    (save-excursion
>      (goto-char (point-min))
>      (let ((compteur 1))
>        (while (re-search-forward "^\\s-*\\end\\s-*{exercice}" nil t)
> 	(beginning-of-line 2)
> 	(if
> 	    (looking-at "%\\s-+[0-9]+\\s-+$")
> 	    (replace-match (format "%% %d" compteur) t)
> 	  (insert  (format "%% %d\n" compteur)))
> 	(setq compteur (1+ compteur))))))
>

Alors j'ai essay� et cela fait exactement ce que je cherche � faire 
(j'ai juste remplac�
(re-search-forward "^\\s-*\\end\\s-*{exercice}" nil t)
par
(re-search-forward "\\\\begin{exercice}" nil t)
car sinon rien ne se passait)
Merci beaucoup Vincent. Je vais donc passer � la finalisation de ce que 
je cherche � faire. En effet, cette fonction me permet de savoir � quel 
\begin{exercice} j'en suis en affichant le num�ro � la ligne du dessous.
Le probl�me, c'est que lorsque je relance la fonction, le num�ro 
s'affiche � nouveau. Par exemple, si je lance 3 fois la fonction, j'obtiens:

\begin{exercice}
% 1
% 1
% 1

blablabla

\begin{exercice}

% 2
% 2
% 2
...

Je voudrais donc que ma fonction supprime la ligne qui suit mon 
\begin{exercice} puis r�-affiche le num�ro (je pourrais par exemple 
avoir 2 fonctions: celle-ci que j�appellerais la 1ere fois puis la 
deuxi�me qui commencerait par supprimer la ligne qui suit avant 
d'afficher le num�ro).

Je n'ai pas le temps de tester tout cela pour l'instant. Je vais 
chercher un peu et je vous redemanderai sans doute de l'aide lorsque 
j'aurai avanc�.
Si quelqu'un peut me dire comment faire pour effacer la ligne qui suit 
mon \begin{exercice}, je ne suis tout de m�me pas contre car j'esp�re 
pouvoir ensuite me d�brouiller. Je suppose qu'� la place de:
(insert  (format "%% %d\n" compteur)))
il me faudrait quelque chose comme
(kill-nextline)
(j'ai essay� mais kill-nextline n'existe pas; j'ai essay� en mettant 
kill-whole-line, qui existe, mais j'obtiens une erreur).

Merci pour tout.
St�phane
Re: afficher le résultat d'un compteur dans le buffer
#79
Author: jack-mac
Date: Thu, 15 Nov 2012 00:35
87 lines
4425 bytes
Le jeudi 8 novembre 2012 22:30:05 UTC+1, Stéphane Dutailly a écrit :
> Le 23/10/2012 06:01, Vincent Belaïche a écrit :
> 
> > Stéphane Dutailly writes:
> 
> >> Le 21/10/2012 17:39, Alain Ketterlin a écrit :
> >>> Stéphane Dutailly writes:
> 
> > (defun mise-à-jour-compteur-d\'exo ()
> >    (interactive)
> >    (save-excursion
> >      (goto-char (point-min))
> >      (let ((compteur 1))
> >        (while (re-search-forward "^\\s-*\\end\\s-*{exercice}" nil t)
> > 	(beginning-of-line 2)
> > 	(if (looking-at "%\\s-+[0-9]+\\s-+$")
> > 	    (replace-match (format "%% %d" compteur) t)
> > 	  (insert  (format "%% %d\n" compteur)))
> > 	(setq compteur (1+ compteur))))))
> >
> 
> Alors j'ai essayé et cela fait exactement ce que je cherche à faire 
> (j'ai juste remplacé
> (re-search-forward "^\\s-*\\end\\s-*{exercice}" nil t)
> par
> (re-search-forward "\\\\begin{exercice}" nil t)
> car sinon rien ne se passait)
> Merci beaucoup Vincent. Je vais donc passer à la finalisation de ce que 
> je cherche à faire. En effet, cette fonction me permet de savoir à quel 
> \begin{exercice} j'en suis en affichant le numéro à la ligne du dessous.
> Le problème, c'est que lorsque je relance la fonction, le numéro 
> s'affiche à nouveau. Par exemple, si je lance 3 fois la fonction, j'obtiens:
> 
> \begin{exercice}
> % 1
> % 1
> % 1
> 
> blablabla
> 
> \begin{exercice}
> 
> % 2
> % 2
> % 2
> ...
> 
> Je voudrais donc que ma fonction supprime la ligne qui suit mon 
> \begin{exercice} puis ré-affiche le numéro (je pourrais par exemple 
> avoir 2 fonctions: celle-ci que j’appellerais la 1ere fois puis la 
> deuxième qui commencerait par supprimer la ligne qui suit avant 
> d'afficher le numéro).
> 
> Je n'ai pas le temps de tester tout cela pour l'instant. Je vais 
> chercher un peu et je vous redemanderai sans doute de l'aide lorsque 
> j'aurai avancé.
> Si quelqu'un peut me dire comment faire pour effacer la ligne qui suit 
> mon \begin{exercice}, je ne suis tout de même pas contre car j'espère 
> pouvoir ensuite me débrouiller.

Ben justement, c'est ce que propose Vincent:
 	(beginning-of-line 2)
 	(if (looking-at "%\\s-+[0-9]+\\s-+$")
 	    (replace-match (format "%% %d" compteur) t)
 	  (insert  (format "%% %d\n" compteur)))
qui se lit comme suit:
Aller au début de la ligne suivante.
Si la ligne contient déjà le compteur, alors remplacer le numéro trouvé par le nouveau numéro
sinon insérer le nouveau numéro.

S'il réinsère un numéro à chaque fois, c'est qu'il semble qu'il y ait un petit problème dans le looking-at...

(il me suffit de le tester avec ma fonction magique jd-looking-at pour voir qu'il ne matche pas tout)

Je propose alors de le remplacer par (looking-at "%\\s-+[0-9]+$")

et le tour est joué!
Re: afficher le résultat d'un compteur dans le buffer
#82
Author: Stéphane Dutailly
Date: Thu, 15 Nov 2012 20:38
3 lines
1573 bytes
Super!!! C'est exactement ce que je cherchais � faire.
Un grand merci � tous!
St�phane
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads