gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 07:55:09 25 4
gpt4 key购买 nike

我使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com