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

标签 emacs tramp

我使用 emacs 的 tramp-mode 来编辑 root 拥有的文件,语法为 /sudo::<filepath>

这非常有效,但我似乎无法在不通过 h​​top 或其他进程管理器手动终止子进程的情况下让 tramp 结束 sudo session 。 tramp-cleanup-*-connection命令不会结束 session 。

如何让 emacs 结束 sudo session ?理想情况下,我希望它在所有 sudo 打开的缓冲区都被杀死后结束 session 。

最佳答案

我不知道你为什么说“tramp-cleanup-*-connection 命令不会结束 session ”;我的快速测试表明 tramp-cleanup-this-connection强制 Tramp 在我下次尝试做某事时重新连接。 (它单独缓存密码,因此您不一定会收到密码提示;但您应该在 *Messages* 缓冲区中看到“打开连接”。)

这里简要介绍了一个可以添加到 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 连接结构中)。或者实际上只是将缓冲区列表的长度(减一,对于我们将要杀死的缓冲区)存储在一个全局变量中,然后在下一次调用时,简单地递减它——只有当它达到零时,再次扫描所有缓冲区并重新初始化变量;如果它确实是最后一个带有此前缀的 sudo 缓冲区,则进行清理。

关于emacs - Tramp-Mode 不会与 sudo shell 断开连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30402346/

相关文章:

emacs - 史莱姆检查员评估 : how to get bindings in the inspector?

emacs - latex ,Emacs : automatically open *TeX Help* buffer on error and close it after correction of the error?

emacs - Flycheck-Google-Cpplint 未正确配置

Emacs shell命令与tramp模式等效

emacs - 使用带有 EmacsW32 和 cygwin 的tramp,可能吗?

emacs lisp 如何将按钮插入临时缓冲区而不切换到它

emacs - 如何在 Emacs Prelude 中创建与现有文件相匹配的新文件?

Emacs:文件名的 Tab 完成附加一个额外的 i:\cygwin

Emacs 流浪汉挂起 "Tramp: found remote shell prompt"