Emacs,内部进程终止,任何命令?

37
如何在Emacs中停止一个内部进程?例如,我运行M-x shell
我可以使用M-x list-processes检查正在运行的进程,但是如何从此列表中终止进程?
5个回答

30

默认情况下没有键绑定可以用于此操作。但是请参见pjammer的回答 - list-processes+中包括(除其他内容外)对C-k键的绑定 - 以及Joao Tavora的回答 - 仅提供了一个相同键的kill绑定。

event_jr在评论中指出,您可以使用M-:(kill-process)RET来结束当前缓冲区的进程。

更普遍地说,您可以使用M-:(kill-process PROCESS)RET,其中PROCESS“可以是进程、缓冲区或进程或缓冲区的名称”,这些名称如它们出现在list-processes的输出中所示。如果发生冲突,则进程名称优先于缓冲区名称;因此最好习惯性地提供进程名称。

另外,Emacs 23+具有通用系统进程管理器(M-x proced),类似于运行top,并且默认绑定了发送(任意)信号的功能(k)。当然,在该列表中可能不太明显哪个进程是您感兴趣的。


编辑: 迟到总比不到好:)以下使M-xkill-processRET可被使用(在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)))

6
如果您在与进程相关联的缓冲区中,那么(kill-process)无需指定缓冲区即可使用。 - event_jr
如果进程没有关联的缓冲区(或者已经不存在了),那么这似乎不适用,比如当您杀死了缓冲区但并未触发实际进程的终止时,有时可能会出现这种情况。 - Erik Kaplun
(kill-process ...) 在我使用 (make-network-process ...) 的结果上没有起作用。Paulo Tomé的回答 建议使用 (delete-process ...),这是个好办法。看起来 list-processes+ 也使用了 (delete-process ...) - chwarr
1
@MiserableVariable 是的,这是将(interactive...)表单分配给函数,使其成为命令。我代码中nil之前的所有内容只是选择在函数的其余部分有机会运行之前是否发出错误信号。如果它能够通过那个步骤,那么nil就是我为交互式调用返回的实际参数列表(即空列表,因为函数的参数都是可选的,而且我没有填充任何参数)。如果我没有明确说明,那么我将受到前面表单返回的任何值的影响。 - phils
M-x kill-process 是 Emacs 29+ 中默认的命令。 - phils
显示剩余2条评论

20

这个帖子很古老,但是我有一个非常快速的技巧可以完美地解决问题。

(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!")))))

11

另一种方法:

您可以使用M-x eval-expression RET

然后键入:(delete-process "<进程名称>") RET

(其中"进程名称"是之前从M-x list-processes RET中获得的)。

通过重复执行M-x list-processes RET来确认该进程已被终止)。

就是这样。


3

0
如果您使用counsel,则可以运行M-x counsel-list-processes。然后,您可以键入M-o以显示操作,其中之一是kill

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接