我使用emacs的tramp-模式来用语法/sudo::<filepath>编辑根拥有的文件。
这非常好,但我似乎无法在不通过htop或其他流程管理器手动终止子进程的情况下终止sudo会话。tramp-cleanup-*-connection命令不会结束会话。
我怎样才能让emacs结束sudo会议?理想情况下,我希望一旦所有sudo打开的缓冲区都被杀死,它就会结束会话。
发布于 2015-05-22 18:17:51
我不知道为什么要说“tramp-cleanup-*-connection命令不会结束会话”;我的快速测试表明,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连接结构中)。或者实际上只需将缓冲区列表的长度(对于我们将要杀死的缓冲区来说是减1)存储在全局中,然后在下一次调用时,简单地减少它--只有当它达到零时,才再次扫描所有缓冲区并重新初始化变量;如果它确实是带有此前缀的最后一个sudo缓冲区,则进行清理。
https://stackoverflow.com/questions/30402346
复制相似问题