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

Emacs eshell TRAMP查找具有相对路径(或至少小于完整TRAMP路径)的远程文件?,emacs,tramp,eshell,Emacs,Tramp,Eshell,我喜欢埃舍尔的流浪汉融合。有了它,我可以做cd/ssh:foo:/etc ssh访问远程计算机并访问其/etc/目录。我也能做到 查找文件motd以在本地emacs中打开此文件。但是,如果我需要使用sudo来更改文件,该怎么办?我知道我能给你机会 完整路径,如下所示: find-file /sudo:foo:/etc/motd 但是,有没有一种方法可以通过TRAMPs sudo support打开文件,而不必键入完整路径?我找到了以下适合我的eshell别名: alias sff 'find-

我喜欢埃舍尔的流浪汉融合。有了它,我可以做
cd/ssh:foo:/etc
ssh访问远程计算机并访问其
/etc/
目录。我也能做到
查找文件motd
以在本地emacs中打开此文件。但是,如果我需要使用sudo来更改文件,该怎么办?我知道我能给你机会 完整路径,如下所示:

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

但是,有没有一种方法可以通过TRAMPs sudo support打开文件,而不必键入完整路径?

我找到了以下适合我的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//
构造不接受空的
替换。)

我找到了另一个答案,这个答案在at上非常有效。 使用它,您仍然可以像往常一样使用
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)))