Neovim 如何用 --remote 把文件直接打开到已运行的实例中?
【免费下载链接】neovimVim-fork focused on extensibility and usability项目地址: https://gitcode.com/GitHub_Trending/ne/neovim
当你已经在一个 Neovim 实例里工作(比如带着 LSP、terminal 或未保存的修改),又不想再开一个独立窗口,而是希望用命令行直接把某个文件"送进"那个正在运行的实例——这就是 Neovim 的 client-server 机制要解决的场景。通过--remote系列参数,命令行里的文件会经 RPC 发给已运行的 Nvim 服务器,由服务器执行:drop打开文件;文档参考 runtime/doc/remote.txt。
确认服务器已就绪
Nvim 在启动流程的第 4 步会"启动服务器(除非已给定--listen)并设置v:servername",也就是说普通启动的 Nvim 默认就带有 RPC 服务器(见 runtime/doc/starting.txt 的 Initialization 一节)。
如果要用一个自己控制的地址,可以用--listen {addr}启动:
nvim --listen ~/.cache/nvim/server.pipe--listen会在管道或 TCP 地址上启动 RPC 服务器,并把主监听地址v:servername设置为该地址(|serverstart()|等价)。{addr}由你自行指定。
启动后可以在实例内部查看当前地址:v:servername是主监听地址,即serverlist()返回的第一项,通常是启动时创建的命名管道或--listen给定的地址(见 runtime/doc/vvars.txt 的*v:servername*一节)。把它的值取出来,作为下一条命令里--server的参数。
另外,Nvim 从 0.11 起对无效地址会直接启动失败,而不是像以前那样静默跳过(见 runtime/doc/news-0.11.txt),所以--listen给出的地址格式不合法会立刻暴露出来。
用 --remote 把文件打开到远程实例
文档给出的标准用法(来自 runtime/doc/remote.txt 的 Examples 一节):
nvim --server ~/.cache/nvim/server.pipe --remote file.txt在~/.cache/nvim/server.pipe监听的 Nvim 服务器中编辑file.txt。注意两个顺序与语义上的坑:
--server必须放在--remote之前。文档明确说下面这种写法不成立,--remote之后的所有参数都会被当作文件名:nvim --remote --server ~/.cache/nvim/server.pipe file.txt--remote会"吃掉"其后整个命令行,剩余参数一律视为文件列表,不能在里面放任何选项。
执行后发生的事情:--remote会用剩余命令行构造一条:drop命令发送给服务器。:drop的语义是(见 runtime/doc/windows.txt 的*:drop*一节):
- 文件已经在某个窗口打开——切换到那个窗口;
- 没有打开——在当前窗口编辑;若当前缓冲区无法放弃(
|abandon|),则先分屏; - 参数列表会像
:next一样被设置。
同时文档说明"远程 Vim 会被 raise(前置)"。如果不想让它抢占前台,文档给出的替代写法是用--remote-send发一条 Ex 命令:
nvim --remote-send "<C-\><C-N>:n filename<CR>"{filename}替换为你要打开的文件。
可用的变体与替代命令
remote.txt 列出的参数及含义如下,按需选用:
| 参数 | 含义 |
|---|---|
--remote [+{cmd}] {file} ... | 在远程实例打开文件列表;没有服务器时会在本地执行 |
--remote-silent | 同上,但服务器不存在、文件在本地打开时不给出提示 |
--remote-tab/--remote-tab-silent | 同上,但每个文件在新 tabpage 打开 |
--remote-send {keys} | 向服务器发送按键后退出;按键不经过映射,识别<CR>等特殊键名 |
--remote-expr {expr} | 在服务器中求值表达式,把结果打印到 stdout |
--remote-ui | 在当前终端显示服务器 UI,键鼠输入转发到服务器 |
--server {addr} | 指定要连接的命名管道或 socket 地址 |
文档里还给了一个用--remote-send让远程服务器保存全部文件并退出的例子:
nvim --server ~/.cache/nvim/server.pipe --remote-send '<C-\><C-N>:wqa<CR>'已知限制
+{cmd}初始化命令形式:--remote虽在签名里带[+{cmd}],但文档标注"Vim 允许一条 Ex 命令 +{cmd},Nvim 尚不支持"。- 所有
--remote-wait变体(--remote-wait、--remote-wait-silent、--remote-tab-wait、--remote-tab-wait-silent)在 Nvim 中尚未实现,对应错误码E5600(*clientserver-missing*)。 - 不能用这种方式编辑 stdin(
|-|)。 --remote之后的位置不能放任何非文件参数,否则会被当作文件名。
结果判断
没有统一的日志输出,按行为判断即可:文件出现在远程实例中(已打开则切到对应窗口,未打开则在当前窗口或新分屏中打开,参数列表被更新),且命令行进程本身立刻退出。若本地没有可连的服务器,--remote会退化为在本地打开文件;用--remote-silent可以抑制这条提示。
【免费下载链接】neovimVim-fork focused on extensibility and usability项目地址: https://gitcode.com/GitHub_Trending/ne/neovim
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考