Як я можу запустити процес асинхронізації у фоновому режимі, не вискочуючи буфер?


23

Я визначив деякі функції для запуску асинхронного фонового процесу за допомогою async-shell-commandмоїх .emacs, але кожного разу, коли я запускаю команди, створюється нове вікно (не кадр) і там відображається буфер процесу. Як я міг запустити команду без буфера "спливаючих вікон"?

Відповіді:


21

Ви можете запустити фонові процеси, з start-processяких не повинно з’являтися буфер:

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

Назви процесів змінюються, щоб уникнути їх дублювання, тому не турбуйтеся про це. Просто дайте йому ім'я, корисне для налагодження в майбутньому!

Якщо ви дасте "buffer-name", буфер буде створений, але не відображатиметься відразу. Це може бути зручно для управління процесами та перегляду результатів. Якщо ви взагалі не хочете створювати буфер, введіть nilяк ім’я буфера:

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

Чи можна використовувати start-processдля команди sudo? Я спробував обгортання мого призову до start-processв , (let ((default-directory "/sudo::")) ... )але він не працює для мене.
sid-kap

@ sid-kap: Не знаю. Вам, мабуть, варто поставити це як окреме питання.
Тихон Єлвіс

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...
Tikhon Jelvis

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.