Відповіді:
Ви можете запустити фонові процеси, з start-process
яких не повинно з’являтися буфер:
(start-process "process-name" "buffer-name" "program")
Назви процесів змінюються, щоб уникнути їх дублювання, тому не турбуйтеся про це. Просто дайте йому ім'я, корисне для налагодження в майбутньому!
Якщо ви дасте "buffer-name"
, буфер буде створений, але не відображатиметься відразу. Це може бути зручно для управління процесами та перегляду результатів. Якщо ви взагалі не хочете створювати буфер, введіть nil
як ім’я буфера:
(start-process "process-name" nil "program")
"program"
у цьому випадку є лише назва програми (наприклад, nautilus, caja, firefox) і "arg1 arg2 ..."
має бути в четвертому позиційному аргументі start-process
. Я зрозумів це, прочитавши документацію :)
Як згадував Тихон, (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; нуль за замовчуванням. Дозорний викликається функцією, коли процес змінює стан. Він отримує два аргументи: процес та рядок, що описує зміну.
C-h f
...
Не потрібно змінювати спосіб виконання асинхронної команди. 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))
start-process
для команди sudo? Я спробував обгортання мого призову доstart-process
в ,(let ((default-directory "/sudo::")) ... )
але він не працює для мене.