我正在寻找一种通过 vimserver 将文本(程序的输出)输入到 vim 的高度稳定的方法。假设我已经用 gvim --servername vim myfile
开始了 (g)vim session .文件myfile
包含一个(唯一的)行 OUT:
它标记了应该粘贴文本的位置。我可以直接从命令行使用 vim --servername vim --remote-send ':%s/OUT:/TEXT\\rOUT:/<Enter>'
实现这一点.我可以使用相同的命令重复输入更多文本。在 C 程序中,我可以用 system()
执行它.然而TEXT
这是动态的和任意的(在 C 程序中作为流接收)需要在命令行上传递,因此需要对其进行转义。此外使用替换命令 %s
vim 会跳转到 TEXT
的位置被插入。我想找到一种在 vim 中无缝粘贴大块任意文本的方法。一个想法是让 vim 使用 :r pipe
从 posix 管道中读取数据。并将 C 程序中的字符串写入管道。理想情况下,解决方案是我可以连续手动编辑同一个文件,而不会注意到在 OUT:
处添加了输出。只要这个位置在可见区域之外。
此文本提要的目的是为脚本语言创建一个基于命令行的前端。输入 block 由用户在 vim 缓冲区中手动输入,并使用 vim 的 :! [interpreter]
通过管道发送给解释器。命令。 [interpreter]
当然可以将输出写入 stdout
(在原始输入行之前)在这种情况下,输入行被输入和输出替换(例如使用一些前导键字符来区分)。但是,命令可能需要很长时间才能产生实际输出,而用户可能希望继续编辑文件。因此我的想法是[interpreter]
返回 OUT:
立即并在此位置追加后续输出行,因为它们可以使用 vimserver 获得。但是,必须以不会干扰或破坏用户可能同时进行的编辑的方式插入输出。
编辑
建议的解决方案似乎有效。 然而,似乎至少有两个警告:* 如果我以这种方式发送文本两次或更多次,命令的``部分不会将我带回原始光标位置(如果我只发送一次,标记仍然被修改这可能会中断用户手动编辑文件)*如果用户打开不同的缓冲区(例如在线帮助),命令将失败(或者可能将文本插入当前缓冲区)
有什么想法吗?
最佳答案
编辑:实际尝试后,这应该对您有用:
vim --servername vim --remote-send \
":set cpo+=C<CR>/OUT:<CR>:i<CR>HELLO<CR>WORLD<CR>.<CR>\`\`"
据我所知,唯一需要注意的是单行上的句点,它将终止 :insert
而不是被插入,并且<..>
可能被解释为按键的序列。此外,需要将文本中的任何换行符替换为 <CR>
.但是,您不必担心正则表达式会变得困惑,输入不是命令行,所需的转义量很少,并且使用双反引号补偿了跳转。
查看 :help 'cpoptions'
, :help :insert
, 和 :help ''
.
关于c - 通过 vimserver 为 vim 提供稳定的文本馈送,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22519675/