Erreur "Type de terminal inconnu" lorsque vous essayez d'exécuter emacsclient

(J'utilise emacs23 , sur Debian 7, Xfce.)

Je veux essayer la solution recommandée par Gilles pour prendre des notes rapides avec Emacs .

En essayant d'exécuter emacsclient -a "" -e "(remember-other-frame)" , j'obtiens l'erreur suivante:

* ERREUR *: type de terminal inconnu

Qu'est-ce qui ne va pas?


(Pas vraiment sûr de ce que je fais,) J'ai essayé de démarrer un server à partir d'Emacs: Ctrl + x et en entrant le démarrage du server . Ensuite, il est dit:

Avertissement (server): Impossible de démarrer le server Emacs.
Il y a un server Emacs existant, nommé "server".
Pour démarrer le server dans ce process Emacs, arrêtez l'existant
server ou appelez `Mx server-force-delete 'pour le déconnecter de force.

En appuyant sur Ctrl + x et en entrant la suppression de force du server , il est dit:

Fichier de connection "/ tmp / emacs1000 / server" supprimé

Quand emacsclient -a "" -e "(remember-other-frame)" maintenant emacsclient -a "" -e "(remember-other-frame)" partir d'une window de terminal différente (ayant emacs -nw encore en cours d'exécution dans le premier), j'obtiens:

 emacsclient: can't find socket; have you started the server? To start the server in Emacs, type "Mx server-start". Warning: due to a long standing Gtk+ bug http://bugzilla.gnome.org/show_bug.cgi?id=85715 Emacs might crash when run in daemon mode and the X11 connection is unexpectedly lost. Using an Emacs configured with --with-x-toolkit=lucid does not have this problem. ("emacs") Loading 00debian-vars... Loading 00debian-vars...done Loading /etc/emacs/site-start.d/50a2ps.el (source)... Loading /etc/emacs/site-start.d/50a2ps.el (source)...done Loading /etc/emacs/site-start.d/50dictionaries-common.el (source)... Loading debian-ispell... Loading /var/cache/dictionaries-common/emacsen-ispell-default.el (source)... Loading /var/cache/dictionaries-common/emacsen-ispell-default.el (source)...done Loading debian-ispell...done Loading /var/cache/dictionaries-common/emacsen-ispell-dicts.el (source)... Loading /var/cache/dictionaries-common/emacsen-ispell-dicts.el (source)...done Loading /etc/emacs/site-start.d/50dictionaries-common.el (source)...done Starting Emacs daemon. Emacs daemon should have started, trying to connect again *ERROR*: Unknown terminal type 

[Modifier] Informations demandées

Sortie de l' echo $TERM; echo $DISPLAY echo $TERM; echo $DISPLAY :

 xterm :0.0 

Exécutez-vous cela à partir d'un émulateur de terminal, si oui, lequel, sinon?

Je ne suis pas sûr de ce qu'est un "émulateur de terminal", mais le terminal que j'utilise s'identifie (dans le menu "Info") comme: Xfce Terminal-Emulator (Terminal 0.4.8). C'est celui par défaut qui est venu avec l'installation de Debian 7 + Xfce.


Qu'avez-vous dans ~/.emacs et ~/.emacs.d ?

  • ~/.emacs n'existe pas.
  • ~/.emacs.d contient uniquement un sous-dossier auto-save-list (qui contient un file vide dont le nom commence par .saves ).

Explication du bug

remember-other-frame appelle switch-to-buffer-other-frame qui appelle display-buffer avec la variable pop-up-frames définie sur t . Cela aboutit à un appel à make-frame avec l'argument pop-up-frame-alist . La fonction make-frame crée un cadre sur le même périphérique d'affichage que l'image actuelle sélectionnée. (Ce que Emacs appelle une trame, c'est ce que les interfaces charts appellent une window, sauf qu'une trame peut aussi être dans un terminal text.) À ce stade, Emacs fonctionne toujours en mode démon, il n'y a donc pas de cadre sélectionné. Ainsi make-frame ne voit aucun environnement GUI et pense qu'il devrait créer une trame de terminal, mais il n'y a pas de terminal de text non plus, ce qui a pour résultat le message d'erreur confus «Type de terminal inconnu».

Solution de contournement simple mais maladroite

remember-other-frame est la bonne fonction pour appeler à partir d'une window Emacs existante, mais elle est techniquement incorrecte d'emacsclient. Là, nous devrions utiliser l'option -c pour faire qu'Emacs crée un nouveau cadre, et la fonction plain remember .

 emacsclient -a "" -c -e "(remember)" 

Cependant ce n'est pas très agréable car rememberremember crée une window qui doit être rejetée avec Cc Cc (qui est aussi ce qui enregistre la note), alors le cadre doit être rejeté avec Cx 5 0 . Si vous oubliez Cc Cc (ce qui est d'autant plus probable que le message à taper Cx 5 0 écrase le message pour taper Cc Cc dans la zone d'écho), la note n'est même pas sauvegardée.

Une solution plus agréable

Demander explicitement à make-frame de créer le cadre sur l'affichage X actuel.

 emacsclient -a "" -e " (let ((pop-up-frame-alist \`((window-system . x) (display . \"$DISPLAY\") ,@pop-up-frame-alist))) (remember-other-frame))" 

Vous pouvez mettre tout cela en une seule ligne, assurez-vous de ne pas changer la ponctuation.

 emacsclient -a "" -e "(let ((pop-up-frame-alist \`((window-system . x) (display . \"$DISPLAY\") ,@pop-up-frame-alist))) (remember-other-frame))" 

Si vous pouvez appeler (make-frame) directement à la place, vous pouvez lui dire de toujours créer un cadre X, ce qui évitera cette erreur, par exemple:

 (select-frame (make-frame '((window-system . x))))