Neovim API 用 Unix domain socket 通信,Emacs make-network-process
就支持,数据格式采用 MessagePack RPC,用了我自己写的 GitHub - xuchunyang/msgpack.el: MessagePack Emacs Lisp library 。作用据我理解就是控制 Neovim,文档有提到做 GUI、remote plugin 的,我也不了解究竟怎么个用法,毕竟 vim、neovim 我都算是是新手
Many clients use the API : user interfaces (GUIs), remote plugins, scripts like “nvr” (GitHub - mhinz/neovim-remote: 👌 Support for --remote and friends. ).
这个 Emacs Lisp 库很原始,没把 vim buffer, window, tab 封装成对象,一来对 vim 不熟悉,而来对 OOP 也不熟悉。
给出一个例子:
(nvim command "echo 'hello'")
表示连接 Neovim(如果还没有连过的话),调用 Neovim API 的 nvim_command
方法,参数是 "echo 'hello'"
,前面提到 API 是个 RPC 格式,RPC 请求需要提供方法和参数。
相关讨论:
Neovim 有个 API ,通过 Unix domain socket + Msgpack-RPC 调用,试试从 Emacs 控制:
建立 Socket 连接:
(make-network-process
:name "nvim"
:buffer "*nvim*"
:service (car (file-expand-wildcards (concat temporary-file-directory "nvim*/*")))
:family 'local
:coding 'binary
:filter (lambda (proc output)
(message "=> %S" (msgpack-decode (vconcat output)))))
比如发送 :quit 命令退出 Neovim:
(process-send-string
(get-process "nvim")
(msgpack-encode [0 1 "nvim_command" ["quit"]]))
上面 [0 1 "nvim_command" ["quit"]…
4 个赞
Emacs控制nvim?比Evil还Evil,太邪恶了(惊喜
在emacs里调用nvim 是证明了emacs的强大呢?还是证明了nvim的强大?
XYZ_C
2020 年3 月 20 日 04:59
6
前几天正讨论到因为 coc-tsserver 应用了 nvim api 而不能替代被抛弃的 typescript-language-server 。现在好啦!有可能用 msgpack 曲线救国吗?
我记得 Neovim 已经有了一个 cl 版的 API 绑定?
可以尝试参照 nvr 仓库,实现启动/attach Neovim instance、remote-send、remote-expr 等功能,有一定适用场景。
XYZ_C
2020 年3 月 20 日 07:24
9
其实没什么想太多的,我看了 coc-tsserver 的代码,引用nvim api的地方并不多,有时间准备fork一个玩玩。
当然在这讨论不合适,跑题了
有啊,GitHub - neovim/neovim: Vim-fork focused on extensibility and usability 写道:
API access from any language including C/C++, C#, Clojure, D, Elixir, Go, Haskell, Java, JavaScript/Node.js, Julia, Lisp, Lua, Perl, Python, Racket, Ruby, Rust
其中 Lisp 应该指 Common Lisp(不知道为什么大家老是把 Common Lisp 「简写」成 Lisp)。
我本来是想模仿 Neovim client for Racket 的,这个是用 OOP 的。