c - 通过 vimserver 为 vim 提供稳定的文本馈送

标签 c shell vim

我正在寻找一种通过 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/

相关文章:

关闭和隐藏之间的 vim/gvim 区别

c - 我无法声明一个非常基本的函数

linux - Bash 无法更改文件内容

objective-c - 从 C 函数调用 Objective C 方法

linux - vim ctags,两个相同的条目,不会直接跳转到定义

bash - 从名称中带有空格的服务器挂载 SMB 共享

linux - Vim 复制一个 block 并粘贴到多行

c++ - Vim 无法通过 clang 设置 omnifunction

java - C libssh 中的 SSH 客户端用 Java jsch 重写

c - 从文本文件C中读取