如何在Emacs中停止一个内部进程?例如,我运行
我可以使用
M-x shell
。我可以使用
M-x list-processes
检查正在运行的进程,但是如何从此列表中终止进程?M-x shell
。M-x list-processes
检查正在运行的进程,但是如何从此列表中终止进程?默认情况下没有键绑定可以用于此操作。但是请参见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-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 "<进程名称>")
RET
(其中"进程名称"
是之前从M-x list-processes
RET中获得的)。
通过重复执行M-x list-processes
RET来确认该进程已被终止)。
就是这样。
(kill-process)
无需指定缓冲区即可使用。 - event_jr(kill-process ...)
在我使用(make-network-process ...)
的结果上没有起作用。Paulo Tomé的回答 建议使用(delete-process ...)
,这是个好办法。看起来list-processes+
也使用了(delete-process ...)
。 - chwarr(interactive...)
表单分配给函数,使其成为命令。我代码中nil
之前的所有内容只是选择在函数的其余部分有机会运行之前是否发出错误信号。如果它能够通过那个步骤,那么nil
就是我为交互式调用返回的实际参数列表(即空列表,因为函数的参数都是可选的,而且我没有填充任何参数)。如果我没有明确说明,那么我将受到前面表单返回的任何值的影响。 - philsM-x kill-process
是 Emacs 29+ 中默认的命令。 - phils