【问题标题】:eshell TRAMP find remote file with relative path (or at least less than the full Tramp path)?eshell TRAMP 找到具有相对路径(或至少小于完整 Tramp 路径)的远程文件?
【发布时间】:2016-02-01 21:59:24
【问题描述】:

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

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

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

【问题讨论】:

    标签: emacs tramp eshell


    【解决方案1】:

    我设法想出了以下适用于我的 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/// 构造不接受空 替换。)

    【讨论】:

      【解决方案2】:

      我在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)))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-07-08
        • 1970-01-01
        • 2016-08-03
        • 2011-12-11
        • 1970-01-01
        • 2014-09-26
        • 1970-01-01
        • 2020-11-03
        相关资源
        最近更新 更多