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

Récupérer les infos affichées dans le minibuffer

11 réponses
Avatar
nic_o_mat
Bonjour
J'utilise emacs pour coder en VHDL. Le mode VHDL comporte une fonction
de statistiques qui affiche ses r=E9sultats dans le minibuffer. Or
j'aimerais bien pouvoir r=E9cup=E9rer ces informations dans un fichier, et
m=EAme (encore mieux) pouvoir utiliser cette fonction en ligne de
commande pour r=E9cup=E9rer des statistiques sur un ensemble de fichiers.

Accessoirement si quelqu'un =E9tait dispos=E9 pour m'aider =E0 modifier
cette fonction pour que j'y ajoute les stats qui m'int=E9ressent ... Je
n'y connais rien en lisp.

Nicolas

10 réponses

1 2
Avatar
nic_o_mat
On 21 mar, 08:38, wrote:
Bonjour
J'utilise emacs pour coder en VHDL. Le mode VHDL comporte une fonction
de statistiques qui affiche ses résultats dans le minibuffer. Or
j'aimerais bien pouvoir récupérer ces informations dans un fichier, et
même (encore mieux) pouvoir utiliser cette fonction en ligne de
commande pour récupérer des statistiques sur un ensemble de fichiers.

Accessoirement si quelqu'un était disposé pour m'aider à modifier
cette fonction pour que j'y ajoute les stats qui m'intéressent ... Je
n'y connais rien en lisp.

Nicolas



Je me réponds à moi-même, les infos arrivent aussi dans le tampon
*Messages* donc c'est facile à récupérer. Par contre pour
l'utilisation non-interactive je ne sais pas (je pourrais essayer de
demander à l'auteur)
Et pour la modif', je suis toujours intéressé.

Nicolas
Avatar
Matthieu Moy
writes:

Bonjour
J'utilise emacs pour coder en VHDL. Le mode VHDL comporte une fonction
de statistiques qui affiche ses résultats dans le minibuffer. Or
j'aimerais bien pouvoir récupérer ces informations dans un fichier, et
même (encore mieux) pouvoir utiliser cette fonction en ligne de
commande pour récupérer des statistiques sur un ensemble de fichiers.



La fonction en question est :

(defun vhdl-statistics-buffer ()
"Get some file statistics."
(interactive)
(let ((no-stats 0)
(no-code-lines 0)
(no-lines (count-lines (point-min) (point-max))))
(save-excursion
;; count statements
(goto-char (point-min))
(while (re-search-forward "(--.*n|"[^"n]*["n])|;" nil t)
(if (match-string 1)
(goto-char (match-end 1))
(setq no-stats (1+ no-stats))))
;; count code lines
(goto-char (point-min))
(while (not (eobp))
(unless (looking-at "^s-*(--.*)?$")
(setq no-code-lines (1+ no-code-lines)))
(beginning-of-line 2)))
;; print results
(message "n
File statistics: "%s"n
---------------------n
# statements : %5dn
# code lines : %5dn
# total lines : %5dn "
(buffer-file-name) no-stats no-code-lines no-lines)
(unless vhdl-emacs-21 (vhdl-show-messages))))

Qui en fait n'a rien de vraiment spécifique au VHDL. Le plus simple
est sans doute de la recopier ailleurs (~/.emacs.el), de la renommer
et de la modifier.

Mais si c'est pour utiliser depuis la ligne de commande, Emacs n'est
pas à mon avis du plus pratique. Un bon vieux shell script de quelques
lignes le fait tout aussi bien par exemple :

echo "Lignes : "$(wc -l "$fichier")
echo "Lignes de code : "$(grep -E -v '^[ ]*(--.*)?$' "$fichier" | wc -l)
...

En perl, ça doit être fait en quelques lignes aussi.

--
Matthieu
Avatar
nic_o_mat
On 21 mar, 10:21, Matthieu Moy
wrote:
writes:
> Bonjour
> J'utilise emacs pour coder en VHDL. Le mode VHDL comporte une fonction
> de statistiques qui affiche ses résultats dans le minibuffer. Or
> j'aimerais bien pouvoir récupérer ces informations dans un fichier, et
> même (encore mieux) pouvoir utiliser cette fonction en ligne de
> commande pour récupérer des statistiques sur un ensemble de fichier s.

La fonction en question est :

(defun vhdl-statistics-buffer ()


[...]

Oui, je l'ai trouvée aussi. J'ai même commencé à essayer de bricoler
dedans mais ça marche pas. J'ai rajouté une variable no-empty-lines et
je la traite comme ça :
;; count empty lines
(goto-char (point-min))
(while (re-search-forward "^( |t)*$" nil t)
(if (match-string 1)
(goto-char (match-end 1))
(setq no-empty-lines (1+ no-empty-lines)))))

Je ne saisis pas la raison pour laquelle on doit doubler certains
dans l'expression régulière. Si je ne les double pas, ça ne détecte
pas les lignes vides, si j'exécute le code ci-dessus emacs se bloque
(C-g C-g permet de sortir, ouf)

Mais si c'est pour utiliser depuis la ligne de commande, Emacs n'est
pas à mon avis du plus pratique. Un bon vieux shell script de quelques
lignes le fait tout aussi bien par exemple :



Je suis sous Windows (j'espère que ça n'est pas un trop gros mot ? ;o)


En perl, ça doit être fait en quelques lignes aussi.



Et je n'y connais rien en Perl non plus.

Nicolas
Avatar
Matthieu Moy
writes:

Oui, je l'ai trouvée aussi. J'ai même commencé à essayer de bricoler
dedans mais ça marche pas. J'ai rajouté une variable no-empty-lines et
je la traite comme ça :
;; count empty lines
(goto-char (point-min))
(while (re-search-forward "^( |t)*$" nil t)



=> cherche la prochaine ligne vide, et se positionne à la fin de
celle-ci.

A priori, il suffit d'incrémenter no-empty-lines, et de faire un
(forward-char) ou (forward-line) pour aller au début de ligne
suivante.

(if (match-string 1)
(goto-char (match-end 1))
(setq no-empty-lines (1+ no-empty-lines)))))

Je ne saisis pas la raison pour laquelle on doit doubler certains
dans l'expression régulière.



Pour l'expression régulière, « ( » est le caractère '(', et « ( »
veut dire « début de bloc » (ce que tu veux ici). Mais on est dans une
chaine (entre des « " »), donc si on écrit « "(" », Emacs va
interpreter le backslash comme un échappement pour la chaine, et
l'expression régulière sera en fait « ( ». Si on écrit « "(" »,
alors le premier échappe le second du point de vue de la chaine, et
l'expression régulière est bien « ( ».

--
Matthieu
Avatar
nic_o_mat
On 21 mar, 10:51, Matthieu Moy
wrote:
writes:
> Oui, je l'ai trouvée aussi. J'ai même commencé à essayer de bri coler
> dedans mais ça marche pas. J'ai rajouté une variable no-empty-lines et
> je la traite comme ça :
> ;; count empty lines
> (goto-char (point-min))
> (while (re-search-forward "^( |t)*$" nil t)

=> cherche la prochaine ligne vide, et se positionne à la fin de
celle-ci.



J'ai recopié la partie "comptage d'instructions" de la fonction
d'origine, j'ai juste modifié l'expression régulière et la variable
concernée.


> Je ne saisis pas la raison pour laquelle on doit doubler certains
> dans l'expression régulière.
Pour l'expression régulière, « ( » est le caractère '(', et « ( »
veut dire « début de bloc » (ce que tu veux ici).



Oui oui, jusque là je sais (ça fait pas longtemps que j'ai découvert
les expressions régulières mais j'ai compris 2-3 trucs ;o)


Mais on est dans une
chaine (entre des « " »), donc si on écrit « "(" », Emacs va
interpreter le backslash comme un échappement pour la chaine, et
l'expression régulière sera en fait « ( ». Si on écrit « "( " »,
alors le premier échappe le second du point de vue de la chaine, et
l'expression régulière est bien « ( ».



Ah d'accord, merci bien. Je devrais donc les doubler partout (donc
devant le t aussi)
Du coup je ne comprends plus très bien la forme de l'expression dans
le comptage des instructions VHDL mais à la limite c'est pas très
grave.

Nicolas
Avatar
Matthieu Moy
writes:

Ah d'accord, merci bien. Je devrais donc les doubler partout (donc
devant le t aussi)



Et non ! "t" en temps que chaine, c'est l'expression régulière
« tabulation », qui matche les tabulations.

--
Matthieu
Avatar
nic_o_mat
On 21 mar, 11:06, Matthieu Moy
wrote:
writes:
> Ah d'accord, merci bien. Je devrais donc les doubler partout (donc
> devant le t aussi)

Et non ! "t" en temps que chaine, c'est l'expression régulière
« tabulation », qui matche les tabulations.



Argh! J'ai un peu mal à la tête, là ... Bon, j'admets.
Tu avais raison, il fallait ajouter un (forward-char) ou (forward-
line), c'est ça qui bloquait. Mais je rencontre un problème avec la
dernière ligne (vide) d'un fichier puisqu'il n'est alors plus possible
d'avancer. Comment peut-on détecter qu'on est sur la dernière ligne ?
(je sens que c'est trivial mais je débute, excusez-moi)

Nicolas
Avatar
Matthieu Moy
writes:

Comment peut-on détecter qu'on est sur la dernière ligne ?



(eq (point) (point-max))

(looking-at "'")

...

--
Matthieu
Avatar
nic_o_mat
On 21 mar, 11:35, Matthieu Moy
wrote:
writes:
> Comment peut-on détecter qu'on est sur la dernière ligne ?

(eq (point) (point-max))

(looking-at "'")



Excuse-moi de faire le boulet (je débute, hein. Oui, je me répète
aussi) mais je sais pas trop comment utiliser tout ça.
Je récapitule mon problème :
(goto-char (point-min))
(while (re-search-forward "^(s|t)*$" nil t)
(if (match-string 1)
(goto-char (match-end 1))
(setq no-empty-lines (1+ no-empty-lines))
(forward-char)))
Ceci a l'air de marcher sauf que (forward-char) renvoie une erreur
quand il arrive à la fin du fichier. Il faut donc qu'il soit
conditionnel.
Ca doit donner à peu près ça, non :
(unless (eq (point) (point-max))
(forward-char))

Nicolas
Avatar
Matthieu Moy
writes:

(unless (eq (point) (point-max))
(forward-char))



Ça devrait, oui. Yapuka essayer !

--
Matthieu
1 2