emacs не работает с xdg-open

Я использую Emacs 24.4.1 на Ubuntu 15.04. Почему-то xdg-open не работает, если я запускаю его из emacs. Например, если я запускаю "xdg-open 1.pdf" или "gvfs-open 1.pdf" в eshell, они не работают. В то же время, "evince 1.pdf" работает отлично.

5 ответов

Решение

Предыдущие два ответа у меня не сработали:

  • (setq process-connection-type nil) сломал org-plot/gnuplot
  • setsid xdg-open ... некоторое время работал, но потом почему-то прекратился.

Сейчас пользуюсь setsid -wкоторый якобы делает setsid дождитесь окончания вызываемой программы.

Если кому-то это понадобится, я использую это с AUCTeX (и я нашел этот вопрос, пытаясь исправить поведение AUCTeX в Arch linux), и мой TeX-command-list установлен в

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

Кажется, сейчас работает нормально...

С помощью setsid xdg-open 1.pdf работает для меня. Кажется, проблема в том, что gvfs-open а также xdg-open вернитесь, пока их дети не закончили работать. Emacs может убить свой управляющий терминал, когда это произойдет, убив детей и остановив evince от открытия правильно. setsid устанавливает новый управляющий терминал, который emacs не закроет.

Это может быть проблемой с использованием ptys для связи подпроцесса. Попробуйте установить process-connection-type в nil, чтобы использовать каналы.

В твоем.emacs

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

Я использую функции публикации из режима org, и без этого изменения ни один из сгенерированных файлов не открывается через xdg-open, несмотря на отсутствие сообщений об ошибках.

xdg-open работает в режиме синхронизации: (shell-command "xdg-open ."), но не в асинхронном режиме: (async-shell-command "xdg-open ."),

похоже, что дочерний процесс xdg-open spawn открывает файл и завершает работу. до того, как дочерний процесс откроет файл, xdg-open выйдет, так что оболочка тоже выйдет. оболочка выхода убивает весь дочерний процесс.

так что просто сделайте жизнь оболочки немного больше:(async-shell-command "xdg-open . ; sleep 1")(команда async-shell добавит & после sleep 1; в любом случае, оболочка все равно будет ждать фонового процесса & Конец.)

Вдохновленный https://depp.brause.cc/dotemacs/#orgd97f08c , вот решение для org-mode:

      (setq org-file-apps '((remote . emacs)
                      (auto-mode . emacs)
                      (directory . emacs)
                      (system . "setsid -w xdg-open %s")
                      (t . system)))

Это переопределяет ассоциации по умолчанию и, таким образом, также предпочитает открывать форматы файлов, такие как PDF, в Emacs, если это возможно. В качестве альтернативы вы можете добавить к существующему списку, как указано в SO:

      (setq org-file-apps-gnu
      (append '((t . "setsid -w xdg-open %s")) org-file-apps-gnu))

The tозначает, что он будет обрабатывать все, что явно не обрабатывается чем-то другим. Вы можете добавить к org-file-appsвместо org-file-apps-gnu, но с тех пор xdg-openобычно используется только в системах GNU, это должно быть идеально.

я использовал (setq process-connection-type nil)счастливо долго, но в последние дни я обнаружил, что он сломал интеграцию с ripgrepпосле нескольких часов отладки. Так что я бы сильно препятствовал этому.

Другие вопросы по тегам