eshell TRAMP 查找具有相对路径(或至少小于完整流浪汉路径)的远程文件



我喜欢 eshell 的 TRAMP 集成。有了它,我可以做cd /ssh:foo:/etc通过 SSH 连接到远程计算机并访问其/etc/目录。我也可以做 find-file motd在我的本地 emacs 中打开这个文件。但是,如果我需要使用 sudo 来更改文件怎么办?我知道我可以给完整路径,如下所示:

find-file /sudo:foo:/etc/motd

但是有没有办法通过 TRAMPs sudo 支持打开文件,而无需键入完整路径?

我设法想出了以下适合我的 eshell 别名:

alias sff 'find-file "${pwd}/$1"(:s/ssh/sudo/)'

它的作用应该相当明显。它预置工作目录路径,但字符串ssh替换为 sudo 。因此它仅适用于通过 SSH 访问的远程文件。我很少在本地使用 sudo 编辑文件,所以这对我来说不是问题。但是,我们也可以使其适用于本地文件,但代价是复杂性:

alias sff 'find-file "${pwd}/$1"(:s,^,/sudo::,:s,::/ssh:,:,)'

也就是说,前置/sudo::(这是本地文件的sudo方法)和随后将任何::/ssh:的出现替换为 : 。(我本来会删除:/ssh:,但 eshell 的 :s/// 结构不接受空的替换。

我找到了另一种答案,在EmacsWiki上效果很好。使用它,您仍然可以像往常一样find-file打开文件,但是随后调用M-x sudo-edit-current-file(如下所示)以 root 用户身份重新打开文件使用流浪汉。我认为这是一个非常优雅的解决方案,因为通常我最初只是想看一个文件,后来发现我需要编辑它。

这是函数,以防它从上面的页面上消失:

(set-default 'tramp-default-proxies-alist (quote ((".*" "\`root\'" "/ssh:%h:"))))
(require 'tramp)
(defun sudo-edit-current-file ()
  (interactive)
  (let ((position (point)))
    (find-alternate-file
     (if (file-remote-p (buffer-file-name))
         (let ((vec (tramp-dissect-file-name (buffer-file-name))))
           (tramp-make-tramp-file-name
            "sudo"
            (tramp-file-name-user vec)
            (tramp-file-name-host vec)
            (tramp-file-name-localname vec)))
       (concat "/sudo:root@localhost:" (buffer-file-name))))
    (goto-char position)))

相关内容

  • 没有找到相关文章

最新更新