使用 TRAMP 远程管理访问文件

首先下载 http://ftp.gnu.org/gnu/tramp/tramp-2.1.4.tar.gz ,这是我接触 TRAMP 的时候的版本。

mkdir ~/Emacs/download.elisp
mkdir ~/Emacs/info
cd ~/tmp
tar -zxf tramp-2.1.4.tar.gz
cd tramp-2.1.4
./configure --with-lispdir=$HOME/Emacs/download.elisp --infodir=$HOME/Emacs/info
make
make install

因为我没有管理员权限,所以没有办法安装在系统目录下,于是就把 elisp 文件安装在 $HOME/Emacs/download.elisp 下, 把帮助文件安装在 $HOME/Emacs/info 下。

在 .emacs 中写

(require 'tramp)
(cond
 ((eq system-type 'windows-nt)
  (setq tramp-default-method "pscp"))
 ((eq system-type 'gnu/linux)
  (setq tramp-default-method "ssh")))

如果你还没有把 $HOME/Emacs/download.elisp 加入到 load-path 中,那么就

(add-to-list 'load-path "Emacs/download.elisp")

我阅读了 tramp.el 中的一些文档,在 windows 下,可以使用 plink 和 pscp 模式, plink 是带内传输, pscp 是带外传输。 这需要安装 putty. 我感觉,如果要交互式的编 译程序的时候, plink 快一些,如果要大量的拷贝文件的时候 pscp 要快一些。

然后就可以 M-x find-file , 然后指定 /username@hostname:/path/to/yourfile

指定的如果是一个目录,那么 dired 也可以用,这样就是一个很不错的 scp 的客户端了, 可以实现远程拷贝文件。

TRAMP 还支持文件名称自动补齐,感觉就像本地访问文件一样。 ido.el 等等一些扩展包都 可以正常和 TRAMP 一起使用。

TRAMP 还支持远程运行命令, M-! (M-x shell-command) 就可以运行远程命令了。

由于 pscp 是带外传输文件的模式,所以每次都要输入密码,这样很烦,下面的方法可以记 住密码

;; 记住密码
(setq password-cache-expiry nil)

下面的方法可以实现远程编译程序,更改错误的过程。

;; 支持远程编译调试。
(require 'tramp-util)

这个有一点不好,就是不能中断编译过程,而且一定要等编译完全结束才能看到结果。我的 Makefile 中修改了一些设置,如果编译成功就直接运行程序,这样程序运行过程中,就看 不到程序的运行结果了。于是自己写了一个改进的版本。只是适合 plink 的使用,其他的 ssh 工具也应该类似吧。

然后就可以用 M-x tramp-compile 和 M-x tramp-recompile , 就像平时使用 M-x compile 和 M-x recompile 一样了。参考 EmacsSmartCompile

(defun wcy-tramp-compile (arg-cmd)
  "reimplement the remote compile."
  (interactive "scompile:")
  (with-parsed-tramp-file-name default-directory foo
    (let* ((key (format "/plink:%s@%s:" foo-user foo-host))
           (passwd (password-read "PASS:" key))
           (cmd (format "plink %s -l %s -pw %s \"(cd %s ; %s)\""
                         foo-host foo-user
                         passwd
                         (file-name-directory foo-localname)
                         arg-cmd)))
      (password-cache-add key passwd)
      (save-some-buffers nil nil)
      (compile-internal cmd "No more errors")
      ;; Set comint-file-name-prefix in the compilation buffer so
      ;; compilation-parse-errors will find referenced files by ange-ftp.
      (with-current-buffer compilation-last-buffer
        (set (make-local-variable 'comint-file-name-prefix)
             (format "/plink:%s@%s:" foo-user foo-host))))))

总之,TRAMP 几乎可以让你感觉不到网络的存在,一切操作和本地的没有什么两样。

可用的

不能用的