Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

afficher le résultat d'un compteur dans le buffer

7 réponses
Avatar
Stéphane Dutailly
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

7 réponses

Avatar
Alain Ketterlin
Stéphane Dutailly 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émen te
le compteur. Juste après, tu utilises insert (et sûrement format) pour
placer la valeur dans le buffer.

-- Alain.
Avatar
Stéphane Dutailly
Le 21/10/2012 17:39, Alain Ketterlin a écrit :
Stéphane Dutailly 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
Avatar
vincent.belaiche
Stéphane Dutailly writes:

Le 21/10/2012 17:39, Alain Ketterlin a écrit :
Stéphane Dutailly 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-*ends-*{exercice}" nil t)
(beginning-of-line 2)
(if
(looking-at "%s-+[0-9]+s-+$")
(replace-match (format "%% %d" compteur) t)
(insert (format "%% %dn" compteur)))
(setq compteur (1+ compteur))))))
Avatar
vincent.belaiche
Olve 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.
Avatar
Stéphane Dutailly
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:






[...]

-- 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-*ends-*{exercice}" nil t)
(beginning-of-line 2)
(if
(looking-at "%s-+[0-9]+s-+$")
(replace-match (format "%% %d" compteur) t)
(insert (format "%% %dn" 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-*ends-*{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 "%% %dn" 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
Avatar
jack-mac
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-*ends-*{exercice}" nil t)
> (beginning-of-line 2)
> (if (looking-at "%s-+[0-9]+s-+$")
> (replace-match (format "%% %d" compteur) t)
> (insert (format "%% %dn" 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-*ends-*{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 à qu el
begin{exercice} j'en suis en affichant le numéro à la ligne du desso us.
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'obt iens:

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 "%% %dn" 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 trou vé 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 a it 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é!
Avatar
Stéphane Dutailly
Super!!! C'est exactement ce que je cherchais à faire.
Un grand merci à tous!
Stéphane