Skip to content

Vim - 远程文件编辑

处理远程服务器上的文件是一项常见的任务。虽然你可以通过 SSH 连接到服务器并在那里编辑文件,但 Vim 允许你直接从本地 Vim 实例(利用你的本地配置和插件)编辑远程文件。这主要得益于内置的 netrw 插件。

  • 访问远程文件
  • 理解 netrw 如何处理读取和写入
  • 其他支持的协议

Vim 的 netrw 插件(默认启用)允许你通过网络编辑文件。打开远程文件的语法是:

vim <protocol>://[user@]hostname/<path_to_file>

例如,要使用 SCP 协议,以用户 john 的身份编辑 remote-server.com 上的 /tmp/message.txt 文件:

$ vim scp://john@remote-server.com//tmp/message.txt

注意主机名后面的双斜杠 // 表示服务器上的绝对路径。单斜杠 / 将表示相对于用户主目录的路径 (例如,scp://john@remote-server.com/project/file.txt)。如果已配置,Vim 会提示输入密码或使用 SSH 密钥。

你也可以在已运行的 Vim 会话中,使用 :edit (或 :e) 命令打开远程文件:

:e scp://john@remote-server.com//etc/config.conf

文件打开后,你可以像编辑任何本地文件一样编辑它。当你使用 :w 保存时,netrw 会处理将文件传回远程服务器的操作。

当你打开一个远程文件时,netrw 会将其获取到临时本地文件。你编辑的是这个本地副本。当你写入文件时 (例如使用 :w),netrw 会将此临时文件的内容传回远程位置。

原教程中提到了 :Nread 和 :Nwrite。这些是底层的 netrw 命令。通常,用户通过标准 Vim 命令(如 :e、:w、:split 等)应用于远程路径来透明地与 netrw 交互。

例如,要明确地将远程文件读入当前缓冲区 (不如使用 :e 常见):

:Nread scp://john@remote-server.com//tmp/status.log

并将当前缓冲区的内容写入远程文件:

:Nwrite scp://john@remote-server.com//var/www/html/index.html

然而,使用 :e remote_path 然后 :w 是更常用的工作流程。

你也可以通过打开一个目录路径来浏览远程目录:

:e scp://john@remote-server.com/projects/

这会打开一个 netrw 浏览器窗口,列出远程目录的内容。你可以从那里导航并打开文件。更多详情请参见 :help netrw。

除了 SCP,netrw 还支持其他几种用于远程文件访问的协议:

  • FTP: ftp://[user[:password]@]hostname/path
  • SFTP: sftp://[user@]hostname/path (对于交互使用通常比 SCP 更受欢迎)
  • HTTP/HTTPS: http://hostname/path 或 https://hostname/path (通常只读)
  • rsync: rsync://[user@]hostname[:port]/path (用于文件传输,通常需要在本地和远程都安装 rsync)
  • DAV (WebDAV): dav://[user@]hostname/path 或 davs://... 用于安全的 WebDAV

这些协议的可用性和行为取决于你的 Vim 编译选项和系统配置。如果你的服务器支持 SSH,SFTP 是一个可靠的选择。

另一种方法:为了更无缝地进行远程编辑,一些用户更喜欢在操作系统级别使用 sshfs 等工具挂载远程文件系统。挂载后,远程文件对 Vim 和所有其他应用程序来说就显示为本地文件了。