以编程方式将命令发送到vim

Hon*_*rny 8 javascript vim

我想在Javascript中构建一个接口,我收集按键并将它们发送到远程vim实例,并让实例报告任何更改.我非常有信心我可以实现所有的浏览器 - 服务器通信和javascript ---我只是不确定如何将数据传递给vim以及如何让它与我交谈.

任何指针将不胜感激!谢谢

编辑:可以在Github上找到初始实现.

rom*_*inl 21

看看TextAid(特别是Perl服务器).也许你会找到有用的想法.

--re-EDIT--

因为我喜欢你的想法,所以我看起来更进一步.

假设编译了Vim +clientserver,你可以像这样启动vim:

$ vim --servername MYSERVER /path/to/tempfile`
Run Code Online (Sandbox Code Playgroud)

在你的遥控盒子上.Vim在服务器模式下启动,您可以发送命令,如:

$ vim --servername MYSERVER --remote-send 'ihello<Esc>'
Run Code Online (Sandbox Code Playgroud)

具有:

hello
Run Code Online (Sandbox Code Playgroud)

在第一行,如果您发送:

$ vim --servername MYSERVER --remote-send 'A world<Esc>'
Run Code Online (Sandbox Code Playgroud)

你获得:

hello world
Run Code Online (Sandbox Code Playgroud)

如果你发送:

$ vim --servername MYSERVER --remote-send 'yy5p'
Run Code Online (Sandbox Code Playgroud)

你获得:

hello world
hello world
hello world
hello world
hello world
Run Code Online (Sandbox Code Playgroud)

如果你发送:

$ vim --servername MYSERVER --remote-send ':%s/hello/goodbye cruel<CR>'
Run Code Online (Sandbox Code Playgroud)

你获得:

goodbye cruel world
goodbye cruel world
goodbye cruel world
goodbye cruel world
goodbye cruel world
Run Code Online (Sandbox Code Playgroud)

这有点酷,但你需要通过编写临时文件并每个命令后将其内容发送回客户端来发回缓冲区的新状态.这意味着您的服务器上有很多读/写.还可以编写一个宏,在每次"更改"时将缓冲区的内容发送到某个外部进程.

- 编辑 -

如果您已经按照链接而不是忽略我的回答,您会看到上面的扩展通过HTTP将文本区域的内容发送到Perl服务器.

如果Vim是本地或远程服务器,我认为这根本不重要.

服务器将其写入临时文件,然后使用Vim打开.

当Vim写入文件时,其内容随后由服务器发送回扩展.

您的JS将执行扩展所做的操作:获取textarea的内容,通过AJAX POST请求将其发送到您的服务器,等待答案并使用它更新textarea的内容.

实际上,我认为你甚至可以按原样使用上面的脚本.或者至少将它作为您自己的应用程序的起点.

  • 好吧,你应该从一开始就这么说:我误解了你想做什么,因为你没有解释.我想到了两件事:1)Vim有很多键绑定,用听众增加textarea和自定义方法,显然需要超过几Mb的JS.这可能是你提到的其他客户端编辑不这样做的原因,也是为什么许多客户端Vim模拟器也不这样做的原因.从这个角度来看,我认为你的想法很好.2)要将命令发送到正在运行的Vim,请参阅`:help remote.txt`,`FUNCTIONS`一章. (2认同)