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
после нескольких часов отладки. Так что я бы сильно препятствовал этому.