从 Emacs 调用 Neovim API

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"]] 是 Msgpack-RPC 规定格式 [type, msgid, method, params]nvim_command 是 Neovim 的 API,quit 是 Vim 命令。


好像还没人给 Emacs Lisp 实现 Msgpack,暂时用命令行工具 GitHub - ludocode/msgpack-tools: Command-line tools for converting between MessagePack and JSON / msgpack.org[UNIX Shell] 代替:

(defun msgpack-encode (object)
  (with-temp-buffer
    (set-buffer-multibyte nil)
    (let ((coding-system-for-read 'binary)
          (coding-system-for-write 'binary))
      (call-process-region (json-encode object) nil "json2msgpack" nil t)
      (buffer-string))))

(defun msgpack-decode (data)
  (with-temp-buffer
    (set-buffer-multibyte nil)
    (let ((coding-system-for-read 'binary)
          (coding-system-for-write 'binary))
      (call-process-region
       (if (vectorp data)
           (apply #'unibyte-string (append data nil))
         data)
       nil "msgpack2json" nil t)
      (goto-char (point-min))
      (json-read))))
4 个赞

msgpack的协议很精巧,不过有点复杂了,实现起来有难度

有 lisp 绑定: Related projects · neovim/neovim Wiki · GitHub

嗯,客户端有很多,包括 Common Lisp。如果要开发Emacs Lisp 的客户端,一个问题是没有现成的 Msgpack 库。

大佬这是想干嘛?

瘫痪局域网内所有人的 Neovim,促使他们改投 Emacs。就像每次苹果发布新产品,库克都会按下桌面上个让旧型机变慢变糟的按钮。

16 个赞

:joy: 太黑暗了 我来PR

iOS13 和 macOS Catalina都bug一堆,垃圾得不行。已经用不着库克按按钮了。现在苹果整体软件水平已经到加新功能和稳定系统只能二选一的地步了。不知道和内部的管理有没有关系。

这篇文章来看,波音的衰落和企业管理和整个社会风气都有关联。软件工程和工业工程在管理上,就我这个外行来看应该有不少可以互相借鉴的地方。像操作系统这种大型软件的开发即使不比客机设计制造复杂,也不是个一个随便就能管理好的项目。

3 个赞

怎么话题转变这么快?

私以为近年来操作系统开发走入了一定的误区,一个劲的吹捧敏捷,导致质量越来越差。看看 Windows 10 也是一个鸟样,更新就是一堆 bug。macOS、iOS 也好不到哪里去,死机、无响应、崩溃比以前多了很多。Linux 也就 LTS 用着放心些。

1 个赞

How? 顺便把他们的 lsp 也瘫痪了,大家一起恰瓜子。

送你一块板砖,绝对好使。。。。。

局域网没法控制吧,Unix domain socket 只能本机通信。

之前一种high sierra. 最近换电脑,用上了catalina,直想给库克寄刀片。 bug多的和windows98有的一拼

现在mac也不能第一时间更新了,世风当下啊。

新闻说苹果已经在考虑改变代码管理方式了……希望真能起到作用;btw,以bug著称的Windows10也不能承让啊 :rofl:

这种用做服务的态度去做系统的方式,我总是持怀疑态度……

1 个赞

对于生产力工具而言,苹果系统的每次升级,基本上都是灾难级别的.而且还变着法儿逼着你升级.

这也是我几年前放弃苹果,下决心完全切换倒linux工作环境的主要原因.

包了个rust的库给Emacs用 https://github.com/Jimx-/msgpack.el 想将Emacs包装成一个nvim后端然后用nvim的UI,不知道可不可行

1 个赞

应该反过来吧? 让emacs做nvim的UI前端, 相当于在emacs里面使用nvim, 这样比evil更原生一点. nvim的UI前端据说比较容易开发.

我的想法是用nvim的UI来操作emacs,因为感觉nvim的UI比emacs的好看不少

这样可能需要实现很多nvim的功能, nvim搞了那么久才实现, 如果简单的话, vim应该早就抄过去了吧?