当调用nrepl-jack-in时,如何结束之前的nrepl会话?

7
此刻,我主要使用nrepl与Clojurescript应用程序通信。我喜欢在emacs中使用nrepl。我通过键入来启动nrepl。
不幸的是,我的nrepl会经常完全挂起。当这种情况发生时,我会尽职地终止与nrepl相关的3个缓冲区,它们分别为:
1. *nrepl* 2. *nrepl-connection* 3. *nrepl-server*
*nrepl-server*还具有一个活动进程,它会问我是否要关闭它,我选择是。
然后我再次键入M-x nrepl-jack-in。
这很麻烦。
我希望重载nrepl-jack-in,以便自动检查这3个缓冲区是否存在。如果它们中的任何一个存在,它将终止这些缓冲区和与这些缓冲区关联的任何活动进程。在执行此操作后,重载的nrepl-jack-in将像往常一样继续进行。我之所以想要这样做,是因为每当我检测到nrepl再次挂起时,我只需键入M-X nrepl-jack-in即可重新开始我正在进行的工作。
2个回答

4
所选答案对我来说不太适用... nrepl进程哨兵发生错误,阻止其重新启动。 我尝试了一下,并得出了以下结果(还提供了单独的kill-nrepl函数)
;; 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))

哨兵通常会要求您确认杀死底层缓冲进程。当我尝试时,重新启动对我有用,但显然我不会将代码提交为上游的原样;-) - Bozhidar Batsov

4
这应该可以完成任务:
(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))

1
当我输入 M-x my-nrepl-jack-in 时,在 *Messages* 中出现以下错误: my-nrepl-jack-in: 参数数量不正确:#[(prompt-project) "ÄÅÆÇ! # ÈÉÊ #ËÌ"ÍÎ"ÏÐ#ÑÒ!*" [prompt-project nrepl-server-command cmd process format "cd %s && %s" ido-read-directory-name "Project: " start-process-shell-command "nrepl-server" ...] 4 nil "P"], 0 - Stephen Cagle

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