web-dev-qa-db-fra.com

emacs ne fonctionne pas avec xdg-open

J'utilise emacs 24.4.1 sur Ubuntu 15.04. D'une certaine manière, xdg-open ne fonctionne pas si je le lance depuis emacs. Par exemple, si je lance "xdg-open 1.pdf" ou "gvfs-open 1.pdf" dans eshell, ils ne fonctionnent pas. Dans le même temps, "evince 1.pdf" fonctionne parfaitement.

2
RCV

Les deux réponses précédentes n'ont pas fonctionné pour moi:

  • (setq process-connection-type nil) cassé org-plot/gnuplot
  • setsid xdg-open ... a fonctionné pendant un certain temps, mais il s'est arrêté pour une raison quelconque.

Maintenant j'utilise setsid -w, ce qui fait supposer que setsid attend la fin du programme appelé.

Si quelqu'un en avait besoin, je l'utilise avec AUCTeX (et j'ai trouvé cette question en essayant de corriger le comportement d'AUCTeX sur Arch Linux), et mon TeX-command-list est réglé sur

(quote
 ( 
  ;; ...
  ("View" "setsid -w xdg-open %s.pdf" TeX-run-command t t :help "Run Text viewer")
  ;; ...
  )

Cela semble bien fonctionner pour l'instant ...

3
Emil Vatai

En utilisant setsid xdg-open 1.pdf travaille pour moi. Le problème semble être que gvfs-open et xdg-open retour avant que leurs enfants aient fini de travailler. Emacs peut tuer leur terminal de contrôle lorsque cela se produit, tuant les enfants et empêchant evince de s'ouvrir correctement. setsid définit un nouveau terminal de contrôle qu'emacs ne fermera pas.

3
Michael Hoffman

Cela peut être un problème avec l'utilisation de ptys pour la communication de sous-processus. Essayez de définir process-connection-type sur nil pour utiliser des tuyaux à la place.

Dans votre .emacs

;; Use pipes for subprocess communication
(setq process-connection-type nil)

J'utilise les fonctions de publication du mode org et sans ce changement, aucun des fichiers générés n'est ouvert via xdg-open, malgré aucun message d'erreur.

1
user1064555

xdg-open fonctionne en mode synchronisation: (Shell-command "xdg-open ."), mais pas en mode asynchrone: (async-Shell-command "xdg-open .").

il semble que le processus enfant de spawn xdg-open pour ouvrir le fichier puis quitter. avant le processus enfant, ouvrez le fichier, xdg-open exit, donc Shell quitte également. La sortie du shell tue tous les processus enfants.

il suffit donc de prolonger la vie de Shell: (async-Shell-command "xdg-open . ; sleep 1") (la commande async-Shell ajoutera & après sleep 1; de toute façon, Shell attendra toujours le processus d'arrière-plan & terminer.)

0
gholk