OVH Cloud OVH Cloud

associer le lancement d'un script shell a une touche

10 réponses
Avatar
Eric Jacoboni
Bonjour,

J'ai un trou (j'ai déjà eu la solution, dans le temps, mais elle n'a
pas survécue à un remaniement en profondeur de mon .emacs).

Voilà mon pb : j'utilise Emacs sous OS X et c'est une galère
incommensurable pour imprimer. Faut déjà que Ghostscript reconnaisse
le système d'impression d'Apple (qui veut du pdf) et je ne cause pas
du problème des accents qui sont irrémédiablement transformés, sauf
peut-être si on utilise l'UTF8, ce qui n'est pas mon cas puisque je
code en Latin-1.

Bref, j'ai donc sorti l'artillerie lourde et j'ai écrit un script
shell qui résoud le pb à la Pyhrrus (mais ça marche). Bon, maintenant
je voudrais appeler ce script à partir d'Emacs via une touche de
fonction, F10 par exemple, (ou même, pourquoi pas, en l'associant à la
commande "Postscript Print Buffer").

Ce script s'appelle ~/bin/printps et attend un nom de fichier en
paramètre. Donc je voudrais que ce soit le nom du fichier contenu dans
le buffer qui lui soit automatiquement passé.

Si quelqu'un a une idée ou une URL, je prend.
--
Éric Jacoboni, né il y a 1401129047 secondes

10 réponses

Avatar
drkm
Eric Jacoboni writes:

J'ai un trou (j'ai déjà eu la solution, dans le temps, mais elle n'a
pas survécue à un remaniement en profondeur de mon .emacs).



[...]

Si j'ai bien compris le problème, ceci peut être un point de départ.

(global-set-key [f10]
(lambda ()
"FIXME<docstring>: ..."
(interactive)
(start-process-shell-command "mon processus"
nil
"~/bin/printps"
(buffer-file-name))))

Tu peux changer le `nil' pour récupérer la sortie de ton script dans
un buffer, si c'est utile.

Il faut aussi faire attention aux buffers qui ne sont pas attachés à
un fichier, comme "*scratch*". Si tu veux supporter de tels buffers,
il te faudra enregistrer un fichier temporaire, en passer le nom à ton
script, puis supprimer le fichier temporaire. Ceci pourrait
t'intéresser :

(let ((wo-file (not (buffer-file-name))))
(when wo-file
(let ((buf (find-file-noselect (make-temp-file "my-printing-system-"))))
(copy-to-buffer buf (point-min) (point-max))
(set-buffer buf)
(save-buffer 0)))
(start-process-shell-command "mon processus"
nil
"~/bin/printps"
(buffer-file-name))))
(when wo-file
(delete-file (prog1 (buffer-file-name)
(kill-buffer (current-buffer))))))

Code non testé.

--drkm
Avatar
Eric Jacoboni
drkm writes:


Si j'ai bien compris le problème, ceci peut être un point de départ.



Oui, c'est bien ça... J'avais trouvé un truc similaire mais en
utilisant
(call-process "sh" nil t t "-c" (concat "~/bin/printps "buffer-file-name))
ce qui avait pour fâcheuse conséquence de balancer
la sortie de la commande dans le buffer... J'étais justement en train
de chercher la fonction magique qui évitait cela ;)

(global-set-key [f10]
(lambda ()
"FIXME<docstring>: ..."
(interactive)
(start-process-shell-command "mon processus"
nil
"~/bin/printps"
(buffer-file-name))))



Je vais tester illico. Je pense qu'il y a un pb avec l'appel de
l'appli qui visualise le pdf, mais c'est un autre problème.

Il faut aussi faire attention aux buffers qui ne sont pas attachés à
un fichier, comme "*scratch*".



A priori, ce n'est que pour imprimer des fichiers contenant du code
source en différents langages, donc ça devrait suffire.

Merci,
--
Éric Jacoboni, né il y a 1401139869 secondes
Avatar
drkm
Eric Jacoboni writes:

A priori, ce n'est que pour imprimer des fichiers contenant du code
source en différents langages, donc ça devrait suffire.



Je ne sais pas si cela a un rapport avec ton problème, mais
connais-tu PS Print, livré avec GNU Emacs (et XEmacs, je pense) ?

--drkm
Avatar
Eric Jacoboni
drkm writes:

Je ne sais pas si cela a un rapport avec ton problème, mais
connais-tu PS Print, livré avec GNU Emacs (et XEmacs, je pense) ?



En fait, mon problème est lié au fait que tout ça tourne sous OS X, et
que c'est un vrai merdier pour s'y retrouver dans la config de
l'impression quand on ne se contente pas du panneau de configuration
du système ;)

Parce que, que ce soit sous FreeBSD ou nunusque, je n'avais jamais eu
de problème pour imprimer en PS à partir d'Emacs. En gros, hormis avec
les applis natives OS X, l'impression est une vraie plaie (et je ne
parle pas des encodages...).

Bon, mais là, il y a un truc que je ne m'explique plus quand même...

Mon script marche. Si je le lance à partir d'un terminal en faisant :

[mac]:~/Travail/Ada/Mes_Tps % /Users/jaco/bin/printps parfaits_2.adb

J'obtiens le résultat escompté. C'est à dire la création d'un fichier
.ps temporaire, puis le lancement du visualisateur pdf qui me permet
(ouf) d'imprimer sous OS X.

Si je fais f10 dans Emacs à partir du buffer parfaits_2.adb (en
utilisant ta suggestion), il ne se passe strictement rien... Rien
n'est créé dans /tmp : il semblerait que start-process-shell-command
ne fait rien.

--
Éric Jacoboni, né il y a 1401142423 secondes
Avatar
Sebastien Kirche
Salut,

Le 13 oct 2004, Eric Jacoboni a formulé :

drkm writes:

> Je ne sais pas si cela a un rapport avec ton problème, mais
> connais-tu PS Print, livré avec GNU Emacs (et XEmacs, je pense) ?

En fait, mon problème est lié au fait que tout ça tourne sous OS X, et
que c'est un vrai merdier pour s'y retrouver dans la config de
l'impression quand on ne se contente pas du panneau de configuration
du système ;)



Au boulot je roule également avec Emacs et OSX (10.3) et l'impression
fonctionne comme un charme.

As-tu été fouiner dans l'interface cups ?

Avec ça, le M-x ps-print-buffer roule sans problème (j'ai aussi une
laserjet-4 qui marche en ps) ou encore C-u M-x ps-print-buffer si je veux le
fichier ps pour transformer en pdf (je passe alors par une commande
ghostscript car panther a du mal avec le postscript emacs) pour des trucs du
genre 2 pages par feuille.

Si tu veux explorer cette voie, je peux te filer des détails techniques
demain.

Pour ton problème de script, par contre je ne vois pas.

Sébastien Kirche
Avatar
drkm
Eric Jacoboni writes:

drkm writes:

Je ne sais pas si cela a un rapport avec ton problème, mais
connais-tu PS Print, livré avec GNU Emacs (et XEmacs, je pense) ?



En fait, mon problème est lié au fait que tout ça tourne sous OS X, et
que c'est un vrai merdier pour s'y retrouver dans la config de
l'impression quand on ne se contente pas du panneau de configuration
du système ;)

Parce que, que ce soit sous FreeBSD ou nunusque, je n'avais jamais eu
de problème pour imprimer en PS à partir d'Emacs. En gros, hormis avec
les applis natives OS X, l'impression est une vraie plaie (et je ne
parle pas des encodages...).



`ps2pdf(1)' n'est d'aucune aide ?

Bon, mais là, il y a un truc que je ne m'explique plus quand même...

Mon script marche. Si je le lance à partir d'un terminal en faisant :

[mac]:~/Travail/Ada/Mes_Tps % /Users/jaco/bin/printps parfaits_2.adb

J'obtiens le résultat escompté. C'est à dire la création d'un fichier
.ps temporaire, puis le lancement du visualisateur pdf qui me permet
(ouf) d'imprimer sous OS X.

Si je fais f10 dans Emacs à partir du buffer parfaits_2.adb (en
utilisant ta suggestion), il ne se passe strictement rien... Rien
n'est créé dans /tmp : il semblerait que start-process-shell-command
ne fait rien.



Je ne sais pas, là comme ça. Que donne `C-h c f10' dans le buffer
en question ? Et que donne :

(global-set-key [f10]
(lambda ()
(interactive)
(start-process-shell-command "mon processus"
"*TMP*"
(expand-file-name "~/bin/emacs-test")
(buffer-file-name))))

avec :

#!/bin/sh
echo $*

dans <FILE:~/bin/emacs-test> ?

--drkm
Avatar
Eric Jacoboni
Sebastien Kirche writes:

As-tu été fouiner dans l'interface cups ?



Oui...

Avec ça, le M-x ps-print-buffer roule sans problème (j'ai aussi une
laserjet-4 qui marche en ps) ou encore C-u M-x ps-print-buffer si je veux le
fichier ps pour transformer en pdf (je passe alors par une commande
ghostscript car panther a du mal avec le postscript emacs) pour des trucs du
genre 2 pages par feuille.



Chez moi, au mieux, le print-buffer fonctionne mais me transforme tous
mes caractères accentués (mes textes sont en iso-8859-1).

Pour l'impression via ghostscript, j'ai fouillé dans toutes les
configs (mon imprimante n'est pas postscript) et ça m'a semblé si
clair que j'ai préféré écrire un script à la main ;)

Si tu veux explorer cette voie, je peux te filer des détails techniques
demain.



Oui, éventuellement. Je vais d'abord essayer de comprendre pourquoi
mon script ne marche pas lorsqu'il est appelé à partir d'Emacs.

Merci,

--
Éric Jacoboni, né il y a 1401149124 secondes
Avatar
Eric Jacoboni
drkm writes:

`ps2pdf(1)' n'est d'aucune aide ?



Si, en fait c'est lui que j'utilise dans mon script :

% cat printps
#! /bin/sh
a2ps -b -g $1 -o /tmp/$1.ps
ps2pdf -sPAPERSIZE¤ /tmp/$1.ps /tmp/$1.pdf
open /tmp/$1.pdf
rm /tmp/$1.ps

Le 'open' étant censé lancer l'application permettant de visualiser et
imprimer les pdf. Ça, ça marche bien en ligne de commande.

Je ne sais pas, là comme ça. Que donne `C-h c f10' dans le buffer
en question ?



Ça répond : <f10> runs the command #<process printing>
ce qui me semble correct vu que j'ai nommé ce process 'printing'

Et que donne :

(global-set-key [f10]
(lambda ()
(interactive)
(start-process-shell-command "mon processus"
"*TMP*"
(expand-file-name "~/bin/emacs-test")
(buffer-file-name))))




Ca me crée le buffer TMP avec :

/Users/jaco/Travail/Ada/Mes_Tps/parfaits_2.adb
Process mon processus finished

Mais, du coup, j'ai compris le pb en faisant sortir dans *TMP* les
messages de mon script : (buffer-file-name) contient le chemin complet
du fichier, donc /tmp/$1.ps est interprété comme
/tmp//Users/jaco/Travail/Ada/Mes_Tps/parfaits_2.adb.ps et, évidemment,
ça le fait pas...

Bon, j'imagine qu'il y a moyen de changer ça en Emacs mais je connais
mieux le shell qu'Emacs donc, en attendant, j'ai remplacé ce $1 par un
$(basename $1) et ça va tout de suite mieux ;)

Merci pour la piste.
--
Éric Jacoboni, né il y a 1401149335 secondes
Avatar
drkm
Eric Jacoboni writes:

drkm writes:

Je ne sais pas, là comme ça. Que donne `C-h c f10' dans le buffer
en question ?



Ça répond : <f10> runs the command #<process printing>
ce qui me semble correct vu que j'ai nommé ce process 'printing'



Tiens, je me serais attendu à une réponse genre « <f10> runs the
command (lambda () ... ». On dirait que la fonction a été évaluée
avant d'être liée à f10. Mais si ça marche, ce doit juste être une
affaire d'affichage. Bizarre, tout de même.

Et que donne :

(global-set-key [f10]
(lambda ()
(interactive)
(start-process-shell-command "mon processus"
"*TMP*"
(expand-file-name "~/bin/emacs-test")
(buffer-file-name))))



Ca me crée le buffer TMP avec :

/Users/jaco/Travail/Ada/Mes_Tps/parfaits_2.adb
Process mon processus finished

Mais, du coup, j'ai compris le pb en faisant sortir dans *TMP* les
messages de mon script : (buffer-file-name) contient le chemin complet
du fichier,



Heureusement pour ton script, d'ailleurs.

donc /tmp/$1.ps est interprété comme
/tmp//Users/jaco/Travail/Ada/Mes_Tps/parfaits_2.adb.ps et, évidemment,
ça le fait pas...



Bah oui ;-)

Bon, j'imagine qu'il y a moyen de changer ça en Emacs mais je connais
mieux le shell qu'Emacs donc, en attendant, j'ai remplacé ce $1 par un
$(basename $1) et ça va tout de suite mieux ;)



`basename(1)' s'écrit en Emacs Lisp `file-name-nondirectory()'.
Mais je pense que ce serait une grosse bêtise de le faire dans Emacs,
avant la création du processus. Ta solution est bien meilleure. Il
faut bien que ton script trouve le bon fichier.

Et cela est plus simple que de s'assurer que le répertoire courant
du script est le bon. Je pense notamment aux éventuels scripts de
démarrage lus par le shell. Il m'est déjà arrivé d'y mettre des
`cd(1)'.

Merci pour la piste.



Mais pas de quoi :-)

Je te conseille également de faire accepter plusieurs arguments à
ton script. J'ai également un tel script. En fait, une partie est en
Emacs Lisp, et le script appelle Emacs à peu près comme ceci :

emacs -batch -l drkm-ps-print $* -f drkm-ps:print-all-files

Les fichiers sont écrits dans un répertoire dédié (ce n'est pas le
mieux, mais c'est facile à implémenter). Comme je n'ai pas
d'imprimante chez moi, il appelle `ps2pdf(1)' sur les PostScript
générés, puis fait un tarball des PDFs enfin obtenus.

Comme il utilise PS Print, je peux ajouter facilement des zebras
stripes, utiliser un feuille par page ou pour deux pages, il utilise
la fontification du mode associé au fichier, etc. Ce qui est
agréable, c'est lorsque j'ai été amené à utiliser des langages
nouveaux pour moi. J'appelais mon script normalement, et le résultat
était celui de mes buffers Emacs, sans avoir rien fait de
particulier :-)

Et à l'utilisation :

~> whereis emacs-ps-print
/home/flo/bin/emacs-ps-print
~> pwd
somewhere
~> emacs-ps-print un-fichier ~/cours/un-autre
 ** un-fichier -> un-fichier.ps
** un-autre -> un-autre.ps
 ** un-fichier.ps -> un-fichier.pdf
** un-autre.ps -> un-autre.pdf
~> ls /tmp/emacs-ps-print
emacs-ps-printed-pdfs.tar.gz
~> tar ztf /tmp/emacs-ps-print/emacs-ps-printed-pdfs.tar.gz
 _un-fichier.pdf
_un-autre.pdf

Le trait de soulignement initial est ajouté par le script pour
éviter d'avoir des problèmes sous MS Windows en imprimant .emacs, « ne
contenant pas de nom de fichier », car commençant par un point ...

Dès que je dois imprimer, il me suffit donc d'utiliser
`emacs-ps-print(1)', et de récupérer l'archive :-)

--drkm
Avatar
Christophe Cuq
Sebastien Kirche writes:

Au boulot je roule également avec Emacs et OSX (10.3) et l'impression
fonctionne comme un charme.



Gniiii ? Ça va faire 18 mois que j'essaie de faire fonctionner ça,
sans jamais y être parvenu.

As-tu été fouiner dans l'interface cups ?



Oui, et je n'y ai rien trouvé.

Si tu veux explorer cette voie, je peux te filer des détails techniques
demain.



Perso, je veux bien, oui.

--
CHC