Заставьте Emacs перестать спрашивать: "Активные процессы существуют; убить их и выйти в любом случае"

Несмотря на все советы о том, что это плохая идея, я все же хотел бы, чтобы Emacs прекратил спрашивать меня: "Существуют активные процессы; убей их и все равно выйди", когда я нажму Cc Cx. Я хотел бы просто убить все активные процессы, не спрашивая.

Как я могу сделать это?

6 ответов

Решение

Этот фрагмент (входит в ваш файл настройки.emacs) временно заставит Emacs поверить, что при его уничтожении нет активного процесса, и поэтому вы не получите раздражающее приглашение.

(require 'cl-lib)
(defadvice save-buffers-kill-emacs (around no-query-kill-emacs activate)
  "Prevent annoying \"Active processes exist\" query when you quit Emacs."
  (cl-letf (((symbol-function #'process-list) (lambda ())))
    ad-do-it))

Вы можете сделать это, установив флаг запроса при выходе для каждого процесса на ноль. Вы можете использовать ловушку, чтобы сделать это автоматически при выполнении интерпретатора команд:

(add-hook 'comint-exec-hook 
      (lambda () (set-process-query-on-exit-flag (get-buffer-process (current-buffer)) nil)))

Следующая версия Emacs (25.3 или 26.1) будет иметь новую опцию настройки confirm-kill-processes чтобы сделать это проще. Вы можете сказать M-x customize-variable RET confirm-kill-processes RET и установите переменную в nil подавить запрос подтверждения.

Вы не можете без взлома. Если вы чувствуете себя авантюрным, замените определение save-buffers-kill-emacs в вашем .emacs чтобы он не спрашивал (но не забывайте повторять процедуру каждый раз, когда вы обновляете Emacs впоследствии). Стандартное определение этой функции требует без каких-либо способов настроить это поведение.

РЕДАКТИРОВАТЬ:

В качестве альтернативы, вы можете переопределить yes-or-no-p как это (не проверено):

(defadvice yes-or-no-p (around hack-exit (prompt))
   (if (string= prompt "Active processes exist; kill them and exit anyway? ")
       t
      ad-do-it))
(if (get-buffer your-process-buffer)
      (progn
    (if (get-buffer-process your-process-buffer)
        (set-process-query-on-exit-flag (get-buffer-process your-process-buffer) nil)
      (kill-buffer your-process-buffer))))

Вот что я считаю лучшим решением, которое специально игнорирует только SLIMEбуферы:

      (defun process-ignore-on-exit (regexp)
  (cl-loop for proc in (process-list)
           when (s-matches-p regexp (process-name proc))
           do
           (progn (message "disabling query-on-exit for '%s'" proc)
                  (set-process-query-on-exit-flag proc nil))))

(defun slime-ignore-processes-on-exit (&rest r)
  (process-ignore-on-exit "SLIME"))

(advice-add #'save-some-buffers :before #'slime-ignore-processes-on-exit)
Другие вопросы по тегам