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

时间:2016-02-01 21:59:24

标签: emacs tramp eshell

我喜欢eshell的TRAMP集成。有了它,我可以cd /ssh:foo:/etc来 ssh到远程计算机并访问其/etc/目录。我也可以 find-file motd在我的本地emacs中打开此文件。但是,如果我需要使用sudo来更改文件呢?我知道我可以给予 完整路径,如:

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

但有没有办法通过TRAMPs sudo支持打开文件,而不必输入完整路径?

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

我在EmacsWiki找到了一个非常有效的替代答案。 使用它,你仍然像往常一样用find-file打开文件,但随后 调用M-x sudo-edit-current-file(如下所示)以root身份重新打开文件 使用Tramp。我认为这是一个非常优雅的解决方案,因为我常常 最初只是想查看一个文件,然后发现我需要编辑它。

这是函数,如果它从上面的页面中消失:

(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)))