Emacs 在调用nrepl插口时终止以前的nrepl会话?
此时此刻,我使用nrepl主要是与Clojurescript应用程序对话。我喜欢在emacs中使用nrepl。我通过键入Emacs 在调用nrepl插口时终止以前的nrepl会话?,emacs,clojurescript,Emacs,Clojurescript,此时此刻,我使用nrepl主要是与Clojurescript应用程序对话。我喜欢在emacs中使用nrepl。我通过键入M-x nrepl jack in来启动nrepl 不幸的是,我的nrepl会话经常被完全挂起。发生这种情况时,我会尽职尽责地杀死与nrepl相关的3个缓冲区。这些缓冲区是: *nrepl* *nrepl连接* *nrepl服务器* *nrepl服务器*也有一个活动进程,它问我是否要关闭它,我说是的 然后我再次输入M-x nrepl插孔 这是一种痛苦。 我想重载nrepl插孔,
M-x nrepl jack in
来启动nrepl
不幸的是,我的nrepl会话经常被完全挂起。发生这种情况时,我会尽职尽责地杀死与nrepl相关的3个缓冲区。这些缓冲区是:
*nrepl*
*nrepl连接*
*nrepl服务器*
*nrepl服务器*
也有一个活动进程,它问我是否要关闭它,我说是的
然后我再次输入M-x nrepl插孔
这是一种痛苦。
我想重载nrepl插孔
,以便它自动检查这3个缓冲区是否存在。如果它们中的任何一个确实存在,它将杀死这些缓冲区以及与这些缓冲区关联的任何活动进程。执行此操作后,过载的nrepl插孔将正常工作。我想这样做是因为,每当我检测到nrepl决定再次挂起时,我可以键入M-X nrepl jack in
,然后重新开始我正在做的事情。这应该可以完成工作:
(defun my-nrepl-jack-in ()
(interactive)
(dolist (buffer (buffer-list))
(when (string-prefix-p "*nrepl" (buffer-name buffer))
(kill-buffer buffer)))
(nrepl-jack-in nil))
选择的答案对我来说不太合适。。。nrepl进程sentinel抛出错误,阻止其重新启动。我对它进行了一些研究,得出了以下结论(它还提供了一个单独的kill-nrepl
函数)
当我键入M-x我的nrepl jack in
时,我在*Messages*中得到以下错误:我的nrepl jack in:参数数目错误:#[(提示项目)“ÄÆÆ#ÈÊÌÌÍÎÐ#Ò”*“[prompt project nrepl server command cmd process format”cd%s&%s“ido read directory name”项目:“启动进程shell命令”nrepl server”…]4 nil“P”],0 sentinel通常只会要求您确认是否终止底层缓冲区进程。当我尝试重新启动时,它对我起了作用,但显然我不会像上游那样提交代码;-)
;; Disable prompt on killing buffer with a process
(setq kill-buffer-query-functions
(remq 'process-kill-buffer-query-function
kill-buffer-query-functions))
(defun nrepl-kill ()
"Kill all nrepl buffers and processes"
(interactive)
(when (get-process "nrepl-server")
(set-process-sentinel (get-process "nrepl-server")
(lambda (proc evt) t)))
(dolist (buffer (buffer-list))
(when (string-prefix-p "*nrepl" (buffer-name buffer))
(kill-buffer buffer))))
(defun nrepl-me ()
(interactive)
(nrepl-kill)
(nrepl-jack-in nil))