Emacs terminal 远程编辑文件方案

如果只是想避免输入完整 ssh 路径,可以用别名(ssh key 登录)的方式:

$ cat ~/.ssh/config
Host vps01
    Hostname {IP}
    Port 22
    User root
    IdentityFile ~/.ssh/key-of-vps01

在 Emacs 中 C-x C-f 之后输入: /ssh:vps01:~/file,也不要密码了

如何配置 ssh key 登录: https://www.google.com/search?safe=off&q=setup+ssh+keys&oq=setup+ssh+keys&gs_l=serp.3..0l7j0i30k1l3.87441.94022.0.94231.24.19.5.0.0.0.349.2604.0j8j2j2.12.0....0...1.1.64.serp..7.17.2631...0i12k1j0i12i10k1.pjNs2foLhJk

3 个赞

知道文件名的话,尽量自己输入(手动或者自动),可以不用让 Tramp 去补全。补全是个 Feature,不是非用不可的。

如果本机和服务器之间连接本身就非常慢的话,用什么方法都会慢。

的确,但这应该是意料之中的,因为是你要求保存的,如果 Emacs 不卡出的话,异步把文件同步回去的话(可以用异步的 subprocess 做到),会有可能出现版本冲突(?)。如果你担心版本冲突的话,用别的方法都是如此,Emacs 不是例外。

不了解 Tramp 是怎么上传文件的,但是按照常理来讲,跟 scp、ftp、rsync 之类的工具的效率差不多,因为 tramp 应该用的就是它们。

如果反正就不想用 Tramp 的话,可以把文件拷贝下来、本地编辑、最后再上传,比如:

(defun tom-edit-remote-file (remote-file)
  (interactive "sRemote file: ")
  (let ((local-file
         (concat "/tmp/" (replace-regexp-in-string "/" "-" remote-file))))
    (shell-command (format "scp %s %s" remote-file local-file))
    (find-file local-file)
    (setq-local tom-remote-file remote-file)
    (setq-local tom-local-file local-file)))

(defun tom-upload-remote-file ()
  (interactive)
  (shell-command (format "scp %s %s" tom-local-file tom-remote-file)))
1 个赞

补全似乎是可以缓存的 (tramp-completion-reread-directory-timeout),默认每 10 秒钟刷新一次,设置成 nil 可以一直用缓存,如果你的文件树基本不变的话,改成 nil 之后除了第一次补全,后续的补全应该就会快很多了。

tramp-completion-reread-directory-timeout is a variable defined in ‘tramp.el’.
Its value is 10

Documentation:
Defines seconds since last remote command before rereading a directory.
A remote directory might have changed its contents.  In order to
make it visible during file name completion in the minibuffer,
Tramp flushes its cache and rereads the directory contents when
more than ‘tramp-completion-reread-directory-timeout’ seconds
have been gone since last remote command execution.  A value of t
would require an immediate reread during filename completion, nil
means to use always cached values for the directory contents.
1 个赞

TRAMP 是支持多种协议的,我用的就是 ssh(scp),这是连接和传输层面的协议,内容上还要进行 base64,小文件这一步好像也没太大问题。

我在两台 vps 上做测试(vps1:墙外,看 youtube 高清流畅,vps2:墙内,微软云),获取远程目录/文件列表和保存不到1k的文本文件都能感觉到明显的阻塞。

可能时间消耗在连接&握手这些步骤上了,Emacs 的单线程使得感受更明显。

2 个赞

Win+plink+msys或者msys,几乎和Linux下差不多了。linux下没见过比SSH更好用的了

如果本地没有外网ip,ssh mac回来是不是就不行了…

如果有auto-save,保存会更慢。我也是习惯性保存,每次都要卡好久

我又来安利 GitHub - akermu/emacs-libvterm: Emacs libvterm integration

配合 GitHub - jixiuf/vterm-toggle: toggles between the vterm buffer and whatever buffer you are editing. 两种用法,

1.假如你此时在使用tramp打开了远程的文件 ,那么 调用vterm-toggle-cd 则自动打开一相terminal 并自动ssh到这台服务器 并cd到此文件所在的目录

  1. 反过来也可以.

关于terminal里cd时自动更新default-directory可以参照

emacs-libvterm目前的状态基本已经可用了,尤其对evil-mode的用户。

非evil-mode用户 使用还有一些不便,就是在term buffer中search 等操作目前还需要自定义keybinding来解决。类似于term.el的 term-line-mode term-char-mode https://github.com/akermu/emacs-libvterm/issues/75

1 个赞

ssh config里我的配置是:

Host remote
  HostName 123.123.123.123
  Port 9999
  User xyz

打开远程文件后vterm-toggle-cd提示的输入密码却是:

$ ssh nil@remote
[email protected]'s password:

似乎username 没有正确识别。

ok 应该是没处理好 user没输入的情况 更新一下 应该修复了

似乎不支持multi-hops的tramp: 在ssh:[email protected]|ssh:[email protected]:/home/user/里打开终端的话,会验证失败然后报错。

想请教下,我在远程 ssh -p 2000 user@localhost 没有问题了,但在 .ssh/config 加了配置

HOST mac
    Hostname localhost
    User wanngtianshu
    Port 2000

ssh mac 会提示又提示新的 known_hosts,并且需要密码,试了配了IdentityFile ~/.ssh/id_rsa 也这样

过去很久了,加上我也不懂原理,帮不上忙。

1 个赞

仅从能看到的推断,user name 不一样?

谢谢,后来解决了,我也不记得为什么之前不行了

这个方法应该可行,先用 dired 打开远程机器的目录,然后直接在要编辑的文件上回车就打开文件了。

sshfs 将远程文件夹挂载到本地系统。

然后,跟本地文件一样的操作。

一个疑问, 如果可以 ssh 的话可以直接 emacs -nw 吧, 用 emacsclient 有什么好处吗?

请问您用什么时候用mac terminal 什么时候用app呢

连接服务器的时候会使用 mac terminal, 不太理解您说的app 指的是什么,是说emacs么?