Emacs, внутренний процесс убийства, любая команда?


Как убить внутренний процесс в Emacs? Например, я запускаю M-x shell.

Я могу проверить запущенные процессы с помощью M-x list-processes, но как я могу убить процесс из этого списка?

4 28

4 ответа:

Для этого нет привязки ключа по умолчанию; однако см. ответ pjammer - list-processes+ включает (среди прочего) привязку kill на C-k - а также ответ Joao Tavora-который обеспечивает только привязку kill (для того же ключа).

Event_jr указывает в комментариях, что вы можете использовать M-: (kill-process) RET , чтобы убить процесстекущего буфера .

В более общем виде: вы можете использовать M-: (kill-process PROCESS) RET , где PROCESS " может быть a process, a buffer, or the name of a process or buffer", причем эти имена будут такими, какими они появляются в выходных данных list-processes. Имена процессов имеют приоритет над именами буферов, если у вас есть конфликт; поэтому, вероятно, лучше иметь привычку предоставлять имя процесса.

В качестве альтернативы Emacs 23+ имеет общий системный менеджер процессов (M-x proced), который больше похож на запуск top и который имеет привязку по умолчанию для отправки (произвольных) сигналов (k). Конечно же это в этом списке может быть гораздо менее очевидно, какой процесс вас интересует.

Edit: лучше поздно, чем никогда:) следующее позволяет M-x kill-process RET для использования (испытано в Emacs 26.1):

;; Enable M-x kill-process (to kill the current buffer's process).
(put 'kill-process 'interactive-form
     '(interactive
       (let ((proc (get-buffer-process (current-buffer))))
         (if (process-live-p proc)
             (unless (yes-or-no-p (format "Kill %S? " proc))
               (error "Process not killed"))
           (error (format "Buffer %s has no process" (buffer-name))))
         nil)))

Эта нить древняя, но вот очень быстрый хак, который отлично работает для меня

(define-key process-menu-mode-map (kbd "C-k") 'joaot/delete-process-at-point)

(defun joaot/delete-process-at-point ()
  (interactive)
  (let ((process (get-text-property (point) 'tabulated-list-id)))
    (cond ((and process
                (processp process))
           (delete-process process)
           (revert-buffer))
          (t
           (error "no process at point!")))))

Альтернативный способ:

Вы можете использовать M-x eval-expression RET

Затем введите: (delete-process "<name-of-the-process>") RET

(где "name-of-the-process" ранее было получено из M-x list-processes RET ).

Подтвердите, что процесс был убит повторением M-x list-processes RET ).

И это все.

Похоже, что есть новый режим или дополнение, которое вы можете использовать вместо этого под названием list process +