Как я могу запустить асинхронный процесс в фоновом режиме, не открывая буфер?


23

Я определил некоторые функции для запуска асинхронного фонового процесса, используя async-shell-commandв моем .emacs, но каждый раз, когда я запускаю команды, создается новое окно (не фрейм), и там отображается буфер процесса. Как я могу выполнить команду без буфера «всплывающих»?

Ответы:


21

Вы можете запустить фоновые процессы start-process, которые не должны открывать буфер:

(start-process "process-name" "buffer-name" "program")

Имена процессов модифицируются, чтобы избежать дублирования при необходимости, поэтому не беспокойтесь об этом. Просто дайте ему имя, полезное для отладки в будущем!

Если вы дадите a "buffer-name", буфер будет создан, но не показан сразу. Это может быть удобно для управления процессами и просмотра результатов. Если вы вообще не хотите создавать буфер, передайте nilимя буфера:

(start-process "process-name" nil "program")

Можно ли использовать start-processкоманду sudo? Я попытался обертывание моего призыва к start-processв , (let ((default-directory "/sudo::")) ... )но он не работает для меня.
Сид-Кап

@ Сид-Кап: я не знаю. Вы, вероятно, должны задать это как самостоятельный вопрос.
Тихон Джелвис

1
"program"в этом случае только имя программы (например, nautilus, caja, firefox) и "arg1 arg2 ..."должно быть в четвертом позиционном аргументе start-process. Я понял это, прочитав документацию :)
biocyberman

8

Как упоминал Тихон, (start-process)это путь. Если вы не хотите создавать буфер, но по-прежнему хотите реагировать на состояние фонового процесса, вы также можете использовать его (set-process-sentinel). Вот модифицированный пример, который я беру из своей projectorпосылки:

(set-process-sentinel (start-process "process-name" nil "command") #'output-message-sentinel)

(defun output-message-sentinel (process msg)
  (when (memq (process-status process) '(exit signal))
    (message (concat (process-name process) " - " msg))))

Из описания функции Emacs:

(set-process-sentinel PROCESS SENTINEL)

Give PROCESS the sentinel SENTINEL; nil for default.
The sentinel is called as a function when the process changes state.
It gets two arguments: the process, and a string describing the change.

GNU страницы руководства на процессы довольно хорошо для получения дополнительной информации.


Не могли бы вы описать, что set-process-sentinelделает немного точнее? Я получил общее представление о наличии функции, которая управляет процессом, но я не до конца понимаю все детали. Благодарность!
Тихон Джелвис

Если вы это сделаете M-x describe-functionи введете, set-process-sentinelвы получите краткий ответ из документации Emacs: (set-process-sentinel PROCESS SENTINEL) Дайте PROCESS сторожевого SENTINEL; ноль по умолчанию. Часовой вызывается как функция, когда процесс меняет состояние. Он получает два аргумента: процесс и строку, описывающую изменение.
waymondo

1
В справочные страницы GNU Emacs на Стражей и процессы , на самом деле очень хорошо для получения более подробной информации.
waymondo

Круто. Возможно, вы могли бы отредактировать ссылки в своем ответе? Я думаю, что можно также узнать больше, используя C-h f...
Тихон Джелвис

2

Нет необходимости менять способ запуска асинхронной команды. Emacs имеет общую способность , чтобы позволить вам контролировать , где , или любой буфер будет всплывающим, изменяя единую структуру данных, то display-buffer-alist.

В приведенном ниже решении вы можете видеть, что функция действия display-buffer-no-window(т. Е. Без всплывающего окна) настроена на привязку к любому буферу с началом имени *Asynchronous Shell Command*(emacs добавляет инкрементный суффикс, когда его просят создать более одного).

Чтобы увидеть список других доступных параметров отображения, введите C-h f display-bufferи найдите список «функций действия».

;; Buffers that I don't want popping up by default
(add-to-list 'display-buffer-alist
  '("\\*Async Shell Command\\*.*" display-buffer-no-window))
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.