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

compter le nombre d'occurrences

1 réponse
Avatar
Stéphane Dutailly
Bonjour,

Je souhaiterais pouvoir compter le nombre d'occurrences d'un mot dans un
fichier.
Concrètement, dans un fichier tex, j'aimerais savoir combien de fois
l'expression << \begin{exercice} >> apparaît, et même, encore mieux,
combien de fois elle apparaît avant l'endroit où se trouve le curseur
dans mon buffer.

Je n'ai pas trouvé de fonction permettant de faire cela, en
connaissez-vous une?

Sinon, en cherchant dans mon manuel, j'ai trouvé un exemple de programme
simple permettant de compter le nombre de mots dans un buffer:
(defun count-words-buffer ()
"Count the number of words in the current buffer;
print a message in the minibuffer with the result."
(interactive)
(save-excursion
(let ((count 0))
(goto-char (point-min))
(while (< (point) (point-max))
(forward-word 1)
(setq count (1+ count)))
(message "buffer contains %d words." count))))

Je me dis qu'il y a peut-être moyen d'adapter pour que le compteur
s'incrémente à chaque occurrence du mot souhaité mais je ne sais pas
comment m'y prendre adapter le programme précédent (j'imagine qu'il faut
faire la recherche d'une expression régulière...).

Merci d'avance pour votre aide,
Stéphane

1 réponse

Avatar
Pascal J. Bourguignon
Stéphane Dutailly writes:

Bonjour,

Je souhaiterais pouvoir compter le nombre d'occurrences d'un mot dans
un fichier.
Concrètement, dans un fichier tex, j'aimerais savoir combien de fois
l'expression << begin{exercice} >> apparaît, et même, encore mieux,
combien de fois elle apparaît avant l'endroit où se trouve le curseur
dans mon buffer.

Je n'ai pas trouvé de fonction permettant de faire cela, en
connaissez-vous une?

Sinon, en cherchant dans mon manuel, j'ai trouvé un exemple de
programme simple permettant de compter le nombre de mots dans un
buffer:
(defun count-words-buffer ()
"Count the number of words in the current buffer;
print a message in the minibuffer with the result."
(interactive)
(save-excursion
(let ((count 0))
(goto-char (point-min))
(while (< (point) (point-max))
(forward-word 1)
(setq count (1+ count)))
(message "buffer contains %d words." count))))

Je me dis qu'il y a peut-être moyen d'adapter pour que le compteur
s'incrémente à chaque occurrence du mot souhaité mais je ne sais pas
comment m'y prendre adapter le programme précédent (j'imagine qu'il
faut faire la recherche d'une expression régulière...).




Puisque tu veux compter les occurences, il faut que tu recherche apropos
les mots count ou occur:

M-x apropos RET occur RET donne une commande intéressante: occur
M-x apropos RET count RET donne une commande encore mieux: count-matches

Donc, tu peux utiliser count-match. Mais ça compte après le point, pas
avant.

(defun count-matches-previous (regexp &optional rstart rend interactive)
(interactive (keep-lines-read-args "How many matches for regexp"))
(count-matches regexp (point-min) (point) interactive))


Maintenant si tu veux compter juste les occurences spéciquement de
"begin{exercice}":

(defun count-exercices (whole-buffer)
(interactive "P")
(let ((regexp "\begin{exercice}"))
(if whole-buffer
(count-matches regexp (point-min) (point-max) t)
(count-matches regexp (point-min) (point) t))))

M-x count-exercices RET donne le compte des exercices avant le point.
C-u M-x count-exercices RET donne le compte des exercices dans tout le buffer.


--
__Pascal Bourguignon__ http://www.informatimago.com/
A bad day in () is better than a good day in {}.