Tramp-Mode不会与sudo shell断开连接?

时间:2015-05-22 17:10:24

标签: emacs tramp

我使用了emacs&#39; tramp-mode,使用语法/sudo::<filepath>

编辑根拥有的文件

这非常有效,但是我似乎无法通过htop或其他进程管理器手动查杀子进程来获取tramp来结束sudo会话。 tramp-cleanup-*-connection命令不会结束会话。

如何让emacs结束sudo会话?理想情况下,一旦所有sudo打开的缓冲区被杀死,我希望它能够结束会话。

1 个答案:

答案 0 :(得分:0)

我不知道为什么你说&#34; tramp-cleanup-*-connection命令不会结束会话&#34 ;;我的快速测试表明tramp-cleanup-this-connection迫使Tramp在下次尝试做某事时重新连接。 (它会单独缓存密码,因此您不必获得密码提示;但您应该在*Messages*缓冲区中看到&#34;打开连接&#34;。

以下是您可以添加到kill-buffer-hook的功能的快速插入。它不是很优雅,但似乎有效。

(defun tramp-cleanup-sudo-maybe ()
  "If the current buffer is a Tramp \"/sudo:\" buffer, cleanup its connection
if there are no other sudo buffers remaining after killing this one."
  (save-match-data
    (let ((name (buffer-file-name))
          prefix buffers)
      (when (and name (string-match "\\`\\(/sudo:[^:]*:\\)" name))
        (setq prefix (match-string 1 name))
        (mapc (lambda (buf)
                (when (string-prefix-p prefix (or (buffer-file-name buf) ""))
                  (setq buffers (cons buf buffers)) ))
              (buffer-list) )
        (when (< (length buffers) 2)
          (tramp-cleanup-this-connection) ) ) )))

如果你有很多缓冲区,这可能会变慢。如果您觉得需要对其进行优化,我想您可以将每个遥控器的连接数添加到您自己的alist(或者可能是某些现有的Tramp连接结构)。或者实际上只是在全局中存储缓冲区列表的长度(减1,对于我们要杀死的缓冲区),然后在下一次调用时,简单地减去它 - 只有当它达到零时,再次扫描所有缓冲区并且重新初始化变量;如果它确实是具有此前缀的最后一个sudo缓冲区,则进行清理。