C 通过vimserver为vim提供稳定的文本提要

C 通过vimserver为vim提供稳定的文本提要,c,shell,vim,C,Shell,Vim,我正在寻找一种高度稳定的方法,通过vimserver将文本(程序输出)输入vim。假设我已经用gvim--servername vim myfile启动了一个(g)vim会话。文件myfile包含一个(唯一的)行OUT:,该行标记文本应粘贴的位置。我可以直接从命令行使用vim--servername vim--remote send':%s/OUT:/TEXT\\rOUT://'实现这一点。我可以使用相同的命令反复输入更多文本。在C程序中,我可以使用system()执行它。但是,TEXT是动态和

我正在寻找一种高度稳定的方法,通过vimserver将文本(程序输出)输入vim。假设我已经用
gvim--servername vim myfile
启动了一个(g)vim会话。文件
myfile
包含一个(唯一的)行
OUT:
,该行标记文本应粘贴的位置。我可以直接从命令行使用
vim--servername vim--remote send':%s/OUT:/TEXT\\rOUT://'
实现这一点。我可以使用相同的命令反复输入更多文本。在C程序中,我可以使用
system()
执行它。但是,
TEXT
是动态和任意的(在C程序中作为流接收)需要在命令行上传递,因此需要转义。此外,使用替换命令
%s
vim将跳转到插入
TEXT
的位置。我想找到一种在vim中无缝粘贴大块任意文本的方法。一个想法是让vim使用
:r pipe
从posix管道读取,并将字符串从C程序中写入管道。理想的解决方案是,只要该位置在可见区域之外,我就可以连续手动编辑同一文件,而不必注意在
OUT:
添加输出

此文本提要的目的是为脚本语言创建基于命令行的前端。用户在vim缓冲区中手动输入输入块,并使用vim的
::通过管道发送到解释器![解释器]
命令。
[解释器]
当然可以将输出写入
stdout
(前面是原始输入行),在这种情况下,输入行被输入和输出所取代(例如,使用一些前导键字符来区分)。但是,当用户可能希望继续编辑文件时,命令可能需要很长时间才能生成实际输出。因此,我的想法是让
[解释器]
立即返回
输出:
,并在使用vimserver时将后续的输出行追加到此位置。但是,必须以不会干扰或破坏用户同时可能进行的编辑的方式插入输出

编辑

提议的解决方案似乎有效。 然而,似乎至少有两个警告:*如果我以这种方式发送文本两次或两次以上,``部分命令将不会将我带回原始光标位置(如果我只这样做一次,标记仍会被修改,这可能会中断用户手动编辑文件)*如果用户打开不同的缓冲区(例如联机帮助)命令将失败(或者可能在当前缓冲区中插入文本)


有什么想法吗?

编辑:在实际尝试之后,这应该适合您:

vim --servername vim --remote-send \
    ":set cpo+=C<CR>/OUT:<CR>:i<CR>HELLO<CR>WORLD<CR>.<CR>\`\`"
vim--servername vim--remote send\
“:设置cpo+=C/OUT::iHELLOWORLD.\`”
据我所知,唯一需要注意的是单行上的句点,它将终止
:插入
,而不是插入,以及可能被解释为按键的
序列。此外,需要将文本中的任何换行符替换为
。但是,您不必担心正则表达式会变得混乱,输入不是命令行,所需的转义量是最小的,并且使用双回跳来补偿跳跃


查看
:help'cpoptions'
:help:insert
,和
:help'
,我宁愿使用较低级别的函数,而不是处理转义。使用
let lnum=search(“^OUT:$”)
定位标记行,并
调用setline(lnum,[text,'OUT:'])
再次插入文本和标记行。

这无疑是一种改进。不过我觉得还是有点复杂。在这种情况下,我不仅需要满足vim命令的限制,还需要满足shell的限制。例如,在表达式中,我需要在要插入的字符串中转义反斜杠。将其更改为
vim--servername vim--remote send':设置cpo+=C/OUT::i\012OUT:.``
(带单引号)我仍然需要至少转义单引号。此外,字符串的总长度将受到限制(否则我将得到“参数列表太长”)。注意:字符串也可以是utf8。在这种情况下,您可以利用
:-1r
从临时文件中读取,而不是
:i
,并且
:调用delete(…)
删除文件,从而通知插入已完成。我试着用先进先出(FIFO)来做,虽然这看起来是个好主意,但这让我的系统有点不稳定。以文件方式进行,根本不需要转义,也没有长度或编码问题。谢谢,它似乎可以工作。不过,我可能会从管道中读取,而不会删除它。这样可以避免每次都将字符串物理写入磁盘。但是请看我对这个问题的编辑。对我来说,使用低级函数似乎非常合理。您的
呼叫设置行(lnum,[text,'OUT:'])
中的
文本有什么要求?需要逃走吗?如果我使用低级命令从文件中读取文本,会是什么样子?唯一不能直接插入的是换行符(
\n
)字符(而是传递其他列表元素),所有其他字符都按原样插入,因此在Vim中没有转义;试试看!我会尝试,但在我看来,如下所示,我至少需要转义单引号
。是的,要生成正确的文本字符串,
必须加倍为
。但这是在您的shell脚本包装器中,而不是在Vim中转义。似乎可以工作。但是,请参阅我对问题的编辑。重新编辑:请停止在问题上堆积更多要求;相反,这一切的用例是什么将是有趣的,以避免错误。请参阅修改。我认为这太过分了