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

Lancer un programme externe depuis Emacs

7 réponses
Avatar
Hélène
Bonjour,

Est-il possible depuis Emacs, de lancer un programme externe, avec un
raccourci clavier, afin d'en récupérer le résultat dans l'éditeur ?

Je m'explique : j'ai un script qui convertit automatiquement des
couleurs RVB au formal décimal (231, 34, 45), directement au format de
POV-Ray (<0.21, 0.34, 0.90>. Quand j'édite un script POV, je voudrais
pouvoir lancer ce programme afin de récupérer directement le résultat
pour l'insérer au bon endroit.

Certes, je peux le faire en ouvrant un shell et en copiant/collant le
résultat sur le script POV, mais n'y aurait-il pas plus "élégant" ? Du
genre M-p couleurs.php 231 34 45 ? Une macro ?? Si vous aviez des
idées... je vous en remercie d'avance.

Hélène
/Les valeurs données en exemple ne sont que des exemples, je n'ai pas
pris la peine de faire le calcul..../

7 réponses

Avatar
lhabert
Hélène :

Est-il possible depuis Emacs, de lancer un programme externe, avec un
raccourci clavier, afin d'en récupérer le résultat dans l'éditeur ?



C-u M-!

Noter aussi « C-u M-| » qui passe la région en entrée au script et la
remplace par la sortie du programme.

Je m'explique : j'ai un script qui convertit automatiquement des
couleurs RVB au formal décimal (231, 34, 45), directement au format de
POV-Ray (<0.21, 0.34, 0.90>. Quand j'édite un script POV, je voudrais
pouvoir lancer ce programme afin de récupérer directement le résultat
pour l'insérer au bon endroit.



Autre idée : mettre ton code POV dans un .pov.ploum, avec les couleurs au
format décimal avec un machin qui les identifie clairement. Ensuite, tu
écris un script qui parse le .pov.ploum à la recherche des couleurs à
transformer, et te pond un vrai .pov. Enfin, tu te fais un Makefile avec une
règle pour créer du .pov à partir de .pov.ploum, et des règles pour pover
les .pov.

Là, c'est peut-être un peu de l'overkill, mais c'est une technique qui peut
être très pratique dans des cas plus complexes. Par exemple, j'ai souvent à
mettre du code source dans divers langage dans un .tex. J'utilise lgrind qui
parse le .tex et remplace les parties de codes sources par plein de sblurb
illisible. Et je travaille sur un .tex.ploum, le .tex étant généré par
lgrind à chaque compilation, via un Makefile générique.
Avatar
Hélène
Luc Habert wrote:
Hélène :


Est-il possible depuis Emacs, de lancer un programme externe, avec un
raccourci clavier, afin d'en récupérer le résultat dans l'éditeur ?




C-u M-!

Noter aussi « C-u M-| » qui passe la région en entrée au script et la
remplace par la sortie du programme.




Eh bien, merci de ta si rapide réponse. Déjà ça, c'est génial et me
permet de faire exactement ce que je recherchais.
J'ai aussi conservé "sous le coude" le texte de ton autre idée. Mais
pour l'instant, mon niveau (des plus modestes) ne me permet pas de tout
saisir d'emblée. Toutefois, je ne désespère pas...
A bientôt sans doute, et encore merci
Hélène
Avatar
drkm
Hélène writes:

Est-il possible depuis Emacs, de lancer un programme externe, avec un
raccourci clavier, afin d'en récupérer le résultat dans l'éditeur ?



Oui. Luc t'as donné une réponse.

Je m'explique : j'ai un script qui convertit automatiquement des
couleurs RVB au formal décimal (231, 34, 45), directement au format de
POV-Ray (<0.21, 0.34, 0.90>. Quand j'édite un script POV, je voudrais
pouvoir lancer ce programme afin de récupérer directement le résultat
pour l'insérer au bon endroit.

Certes, je peux le faire en ouvrant un shell et en copiant/collant le
résultat sur le script POV, mais n'y aurait-il pas plus "élégant" ? Du
genre M-p couleurs.php 231 34 45 ? Une macro ?? Si vous aviez des
idées... je vous en remercie d'avance.



Si je comprend bien, tu ne veux pas insérer directement le format
demandé par POV-Ray, mais saisir plutôt un triplet RGB, laissant un
programme faire la conversion.

Le plus simple est alors de lier une commande à une séquence
spécifique de touches, pas besoin de passer par un programme externe.

Que dis-tu de ce qui suit ? Il suffit que tu le copies dans ton
<FILE:.emacs>. Dans le mode d'édition pour POV-Ray, la commande sera
liée à "C-c s" (pour « something »). J'ai posé que 1/ les valeurs
RGB sont des triplet de 0 à 256 inclus, et 2/ le résultat désiré est
la division de chacun par 256.

(defun LN-pov-read-rgb-component (name)
"Lit un composant de RGB, nommé `NAME', depuis le minibuffer."
(let* ((prompt (concat name ": "))
(str (read-from-minibuffer prompt))
(result nil))
(setq prompt (concat "[wrong value] " prompt))
(while (or (null (setq result (string-to-number str)))
(< result 0)
(> result 256))
(beep)
(setq str (read-from-minibuffer prompt str)))
result))

(defun LN-pov-insert-<something>-from-rgb (r g b)
"Insère un <something> depuis un triplet RGB."
(interactive (mapcar 'LN-pov-read-rgb-component
'("Red" "Green" "Blue")))
(insert "<"
(mapconcat (lambda (x) (format "%0.2f" (/ x 256.0)))
(list r g b)
", ")
">"))

(add-hook 'pov-mode-hook (lambda ()
(define-key pov-mode-map "C-c s"
'LN-pov-insert-<something>-from-rgb)))

Dans `LN-pov-read-rgb-component()', j'utilise `string-to-number()'.
Mais elle ne me semble pas assez rigoureuse. J'aimerais ici qu'une
erreur soit signalée en cas de caractère non désiré, bref, si la
chaîne n'est pas *exactement et entièrement* un nombre. Existe-t-il
quelque chose dans l'Emacs Lisp, ou faut-il la coder soit-même ?

--drkm, en recherche d'un stage : http://www.fgeorges.org/ipl/stage.html
Avatar
Hélène
drkm wrote:
[ ]

Si je comprend bien, tu ne veux pas insérer directement le format
demandé par POV-Ray, mais saisir plutôt un triplet RGB, laissant un
programme faire la conversion.

Le plus simple est alors de lier une commande à une séquence
spécifique de touches, pas besoin de passer par un programme externe.

Que dis-tu de ce qui suit ? Il suffit que tu le copies dans ton
<FILE:.emacs>. Dans le mode d'édition pour POV-Ray, la commande sera
liée à "C-c s" (pour « something »). J'ai posé que 1/ les valeurs
RGB sont des triplet de 0 à 256 inclus, et 2/ le résultat désiré est
la division de chacun par 256.




[ ]

Merci de t'être penché sur ma question. Je vais essayer ça aussi, ça
paraît tout aussi efficace.
Hélène
Avatar
lhabert
Il y a « string-to-number », mais il ne teste pas les erreurs. Pour les
erreurs, on peut commencer par tester avec « string-match », genre :

(defun atoi (x)
(if (string-match "^[0-9]*$" x)
(string-to-number x)
(error "Ploum.")))

.
Avatar
drkm
(Luc Habert) writes:

Il y a « string-to-number », mais il ne teste pas les erreurs.



C'était effectivement la question ;-)

Pour les
erreurs, on peut commencer par tester avec « string-match », genre :

(defun atoi (x)
(if (string-match "^[0-9]*$" x)
(string-to-number x)
(error "Ploum.")))



Je ne veux en effet que des entiers. J'étais déjà en train de
penser au problème plus général de `string-to-number()', en partie à
cause des locales, etc. Mais je pense en effet que dans ce cas, ça a
l'air d'une bonne solution. Merci.

Il n'y aurait donc rien pour le cas général ?

--drkm, en recherche d'un stage : http://www.fgeorges.org/ipl/stage.html
Avatar
drkm
drkm writes:

(defun LN-pov-read-rgb-component (name)
"Lit un composant de RGB, nommé `NAME', depuis le minibuffer."
(let* ((prompt (concat name ": "))
(str (read-from-minibuffer prompt))
(result nil))
(setq prompt (concat "[wrong value] " prompt))
(while (or (null (setq result (string-to-number str)))
(< result 0)
(> result 256))
(beep)
(setq str (read-from-minibuffer prompt str)))
result))



...
(while (or (not (string-match "^[0-9]+$" str))
(null (setq result (string-to-number str)))
(< result 0)
(> result 256))
(beep)
...

donc, à la lumière de l'article de Luc.

--drkm, en recherche d'un stage : http://www.fgeorges.org/ipl/stage.html