OVH Cloud OVH Cloud

lancer Emacs avec un Mutt dedans en mode terminal

28 réponses
Avatar
Vincent Lefevre
Bonjour,

J'aimerais pouvoir lancer Emacs avec un Mutt (ou tout autre
processus) dedans en mode terminal. En gros, un peu l'équivalent
d'un "xterm -e mutt args...", mais avec un Emacs à la place d'un
Xterm (c'est pour les liens mailto...). Comment faire?

Un truc du style

emacs --eval '(progn (set-buffer (make-term "Mutt" "mutt" nil "arg"))
(term-mode) (term-char-mode) (switch-to-buffer "*Mutt*"))'

fonctionne, mais je voudrais que quand Mutt quitte, la fenêtre soit
fermée.

D'autre part, pour la composition du message, Mutt lance un
éditeur externe (configuré par l'utilisateur). Je suppose qu'un
"emacs -nw" fait l'affaire (voire un "gnuclient -nw", mais j'avais
eu des problèmes avec les couleurs dans le passé, si bien que je
n'utilise plus gnuclient).

--
Vincent Lefèvre <vincent@vinc17.org> - Web: <http://www.vinc17.org/>
100% accessible validated (X)HTML - Blog: <http://www.vinc17.org/blog/>
Work: CR INRIA - computer arithmetic / SPACES project at LORIA

10 réponses

1 2 3
Avatar
Matthieu Moy
Vincent Lefevre <vincent+ writes:

En fait, le -nw ne convient pas, car on n'a pas accès à l'interface
graphique. Comment faire pour qu'un processus externe ouvre un buffer
dans la même fenêtre?



emacsclient fait ça par défaut.

Sinon, doit bien y avoir une option de gnuclient, non ?

--
Matthieu
Avatar
Florent Georges
Vincent Lefevre wrote:

En fait, le -nw ne convient pas, car on n'a pas accès à l'interface
graphique. Comment faire pour qu'un processus externe ouvre un buffer
dans la même fenêtre?



Si j'ai bien compris, tu as besoin de 'emacsclient' : (info
"(emacs)Emacs Server").

--drkm
Avatar
Vincent Lefevre
Dans l'article ,
Florent Georges écrit:

Vincent Lefevre wrote:

> Je n'arrive pas à récupérer les arguments à partir du "--".

Je ne comprend pas.



dixsept:~> cat cla.el
(message "%s" command-line-args)
dixsept:~> emacs -l cla.el -- a b

Dans le buffer *Messages*, j'ai:

(emacs -l cla.el)

et non:

(emacs -l cla.el -- a b)

C'est avec Emacs 22.0.50.1.

> Et si je ne mets pas de "--", les arguments sont pris en compte
> comme des fichiers, même si je fais un (setq command-line-args nil)
> dans le "emacs-mutt.el".

Les arguments de la ligne de commande doivent etre traites au
demarrage. Grosso-modo, tu peux penser que ce doit etre fait avant la
fin de ton ~/.emacs.el, mais plus precisement, c'est ici : (info
"(elisp)Startup Summary"). Typiquement, ce sera fait dans un Autloads
File.

Il faut egalement veiller a ne pas les laisser dans la liste.



Comment faire dans cla.el, par exemple avec "emacs -l cla.el + a b"
pour enlever tout ce qui se situe à partir du "+"?

Un (setq command-line-args nil) met bien command-line-args à nil,
mais les arguments sont tout de même pris en compte. Par exemple,
avec cla.el contenant:

(setq command-line-args nil)
(message "%s" command-line-args)

j'obtiens dans le buffer *Messages*:

nil
(New file) [3 times]

--
Vincent Lefèvre - Web: <http://www.vinc17.org/>
100% accessible validated (X)HTML - Blog: <http://www.vinc17.org/blog/>
Work: CR INRIA - computer arithmetic / SPACES project at LORIA
Avatar
Vincent Lefevre
Dans l'article ,
Matthieu Moy écrit:

Vincent Lefevre <vincent+ writes:

> En fait, le -nw ne convient pas, car on n'a pas accès à l'interface
> graphique. Comment faire pour qu'un processus externe ouvre un buffer
> dans la même fenêtre?

emacsclient fait ça par défaut.

Sinon, doit bien y avoir une option de gnuclient, non ?



Je vais essayer de remplacer gnuclient par emacsclient (mais j'avais
lu quelque part, peut-être ici, que gnuclient était préférable).

Alors je suis ramené au problème: comment le faire de manière
conditionnelle, e.g. seulement si $TERM vaut eterm-color?

--
Vincent Lefèvre - Web: <http://www.vinc17.org/>
100% accessible validated (X)HTML - Blog: <http://www.vinc17.org/blog/>
Work: CR INRIA - computer arithmetic / SPACES project at LORIA
Avatar
Matthieu Moy
Vincent Lefevre <vincent+ writes:

Je vais essayer de remplacer gnuclient par emacsclient (mais j'avais
lu quelque part, peut-être ici, que gnuclient était préférable).



gnuclient est globalement plus évolué.

Pour ton problème, un gnuclient -batch -eval '(find-file ...)' devrait
pouvoir le faire.

Alors je suis ramené au problème: comment le faire de manière
conditionnelle, e.g. seulement si $TERM vaut eterm-color?



if [ "x$TERM" = x"eterm-color" ]; then
foo
else
bar
fi

?

--
Matthieu
Avatar
Florent Georges
Vincent Lefevre wrote:

dixsept:~> cat cla.el
(message "%s" command-line-args)
dixsept:~> emacs -l cla.el -- a b

Dans le buffer *Messages*, j'ai:

(emacs -l cla.el)

et non:

(emacs -l cla.el -- a b)



Typiquement, le '--' a signification speciale : ce qui suit ne doit
plus etre pris en tant qu'option, mais par exemple en tant que nom de
fichier, meme s'ils commencent par un '-'.

Comment faire dans cla.el, par exemple avec "emacs -l cla.el + a b"
pour enlever tout ce qui se situe à partir du "+"?



Je ne connais pas CLA. Mais j'imagine qu'elle utilise
'line-command-args', la parcourt a la recherche d'un '+', puis utilise
les arguments se trouvant apres.

Un (setq command-line-args nil) met bien command-line-args à nil,
mais les arguments sont tout de même pris en compte. Par exemple,
avec cla.el contenant:

(setq command-line-args nil)
(message "%s" command-line-args)

j'obtiens dans le buffer *Messages*:

nil
(New file) [3 times]



Peut-etre que le traitement des arguments de CLA est fait avant ton
affectation, ou qu'elle utilise un autre mecanisme.

Que veux-tu exactement ?

--drkm
Avatar
Matthieu Moy
"Florent Georges" writes:

Vincent Lefevre wrote:

dixsept:~> cat cla.el
(message "%s" command-line-args)





[...]

Je ne connais pas CLA.



[...]

Non, rien :-)

--
Matthieu
Avatar
Vincent Lefevre
Dans l'article ,
Florent Georges écrit:

Vincent Lefevre wrote:

> dixsept:~> cat cla.el
> (message "%s" command-line-args)
> dixsept:~> emacs -l cla.el -- a b

> Dans le buffer *Messages*, j'ai:

> (emacs -l cla.el)

> et non:

> (emacs -l cla.el -- a b)

Typiquement, le '--' a signification speciale : ce qui suit ne doit
plus etre pris en tant qu'option, mais par exemple en tant que nom de
fichier, meme s'ils commencent par un '-'.

> Comment faire dans cla.el, par exemple avec "emacs -l cla.el + a b"
> pour enlever tout ce qui se situe à partir du "+"?

Je ne connais pas CLA.



Cf tout en haut du message.

Mais j'imagine qu'elle utilise 'line-command-args', la parcourt a
la recherche d'un '+', puis utilise les arguments se trouvant apres.



C'était juste un fichier de test pour montrer que tout ce qui se
trouve à partir de "--" n'est pas mis dans le command-line-args.
C'est pour ça qu'il est nécessaire d'utiliser autre chose comme
délimiteur pour les arguments.

> Un (setq command-line-args nil) met bien command-line-args à nil,
> mais les arguments sont tout de même pris en compte. Par exemple,
> avec cla.el contenant:

> (setq command-line-args nil)
> (message "%s" command-line-args)

> j'obtiens dans le buffer *Messages*:

> nil
> (New file) [3 times]

Peut-etre que le traitement des arguments de CLA est fait avant ton
affectation, ou qu'elle utilise un autre mecanisme.

Que veux-tu exactement ?



Écrire un fichier cla.el qui fasse qu'Emacs ne traite pas les
arguments à partir d'un "+", comme avec:

emacs -l cla.el + a b

(C'est le cla.el qui doit traiter ces arguments, pour les fournir
à Mutt via un (apply 'make-term "Mutt" "mutt" nil args).)

--
Vincent Lefèvre - Web: <http://www.vinc17.org/>
100% accessible validated (X)HTML - Blog: <http://www.vinc17.org/blog/>
Work: CR INRIA - computer arithmetic / SPACES project at LORIA
Avatar
Vincent Lefevre
Dans l'article ,
Matthieu Moy écrit:

Vincent Lefevre <vincent+ writes:

> Je vais essayer de remplacer gnuclient par emacsclient (mais j'avais
> lu quelque part, peut-être ici, que gnuclient était préférable).

gnuclient est globalement plus évolué.

Pour ton problème, un gnuclient -batch -eval '(find-file ...)' devrait
pouvoir le faire.



Ça sera mieux, car j'avais une fonction smart-close qui fonctionnait
avec gnuclient, mais qui ne fonctionne plus avec emacsclient (et le
manuel d'Emacs ne dit quasiment rien -- c'est peut-être aussi parce
qu'emacsclient n'est pas aussi évolué).

Je viens de tester et ça fonctionne, enfin presque.

* Il faut que je modifie ma fonction smart-close pour qu'un C-x C-c
tue le buffer (seulement dans ce contexte) au lieu de quitter
Emacs.

* Emacs a ajouté une ligne en haut du buffer *Mutt* si bien qu'une
fois de retour dans ce buffer, la dernière ligne du terminal
n'est pas visible. C'est un bug?

> Alors je suis ramené au problème: comment le faire de manière
> conditionnelle, e.g. seulement si $TERM vaut eterm-color?

if [ "x$TERM" = x"eterm-color" ]; then
foo
else
bar
fi

?



Euh non, je demandais du code Emacs. Mais voilà où j'en étais:

(when window-system
(add-hook 'server-visit-hook '(lambda ()
(message "TERM: %s" (getenv "TERM"))
(if (not (equal (getenv "TERM") "eterm-color"))
(make-frame))))
(server-start))

dans mon ".emacs". Mais vue la valeur de TERM, ce code est exécuté
par le serveur, donc je ne peux pas faire quelque chose de ce genre.

Maintenant, gnuclient a l'air d'être une meilleure solution.

--
Vincent Lefèvre - Web: <http://www.vinc17.org/>
100% accessible validated (X)HTML - Blog: <http://www.vinc17.org/blog/>
Work: CR INRIA - computer arithmetic / SPACES project at LORIA
Avatar
Vincent Lefevre
Dans l'article <20060210135136$,
Vincent Lefevre <vincent+ écrit:

* Emacs a ajouté une ligne en haut du buffer *Mutt* si bien qu'une
fois de retour dans ce buffer, la dernière ligne du terminal
n'est pas visible. C'est un bug?



La solution à ce problème est: gnuclient ... > dev/null

--
Vincent Lefèvre - Web: <http://www.vinc17.org/>
100% accessible validated (X)HTML - Blog: <http://www.vinc17.org/blog/>
Work: CR INRIA - computer arithmetic / SPACES project at LORIA
1 2 3