vim:将光标后的文本作为vim命令执行

3

有时我会写一些文本,其中部分文件是由外部程序生成的。例如,考虑包含以下内容的C源代码文件:

/*
 * To regenerate the following data, place the cursor at the beginning
 * of the next line after this comment, then run
 *   ma:r!find /foo -name '*.in' | xargs whatever | some complicated processing
 * and merge the result with
 *   'a!}sort -u
 */
some
generated
stuff
here

我最终使用鼠标选择第一个命令 (ma:...) ,粘贴并运行它,等待命令完成,然后选择 'a!}sort -u 并粘贴并运行它。这是不优雅的,因为它只是半自动的,而我认为它可以完全自动化。我阅读了 vim 的在线帮助文档和相关内容,但看起来并不能满足我的需求。我的想法是将正确的命令(s)填充到 vim 寄存器中,然后执行寄存器内容。在线:help registers 目前没有给出任何线索。

理想情况下,新的注释应该说些什么:

/*
 * To regenerate the following data, place the cursor on the 'j' on the
 * next line in this comment, then execute it with <SHORT-MAGIC-VIM-INCANTATION>
 *   jjma:r!find /foo -name '*.in' | xargs whatever | ...<CR>'a!}sort -u<CR>
 */

这怎么实现呢?
2个回答

4

我希望它能处理Ex命令,而不是正常模式下的命令(例如您示例中的ma);可以通过:normal ma轻松执行后者,但将Ex命令输入正常模式时会出现转义问题(例如,如何编码必须结束Ex命令的Enter?)

以下是自定义命令:

command! -bar -range ExecuteFromCursor execute 'normal! "zy$' | @z

这里是一个映射:

nnoremap <Leader>e "zy$:@z<CR>

1
哦,:@z 作为寄存器比 ^R 寄存器的“完成”要容易得多(描述起来也是如此)。+1 - sehe
nnoremap 命令本身不会将光标移动到适当的行。稍作修改即可解决此问题:"zy$2j:@z<CR> - Jens

3

编辑 Ingo 执行注册表的方法比我的更简单(使用@"而不是<^R>")。

我的方法的优点是,在按Enter键执行之前,您有机会像任何其他命令行一样交互式地编辑命令行。

我会这样做

y$:<^R>"
  • y$:复制至行尾
  • ::进入命令模式
  • C-r":粘贴刚才复制的内容

按下回车键,即可完成操作。


我之前也曾经将类似的功能进行了映射。但是我变得更懒了,通常我只是使用 Y,然后在命令行中进行编辑。在 Windows 上,我发现通过 Shift-Insert 来实现 vim 命令行更加流畅,所以我会使用 "+Y 来复制到 Windows 剪贴板。但我偏离了主题。


这里的C-v可能有问题吗?当我执行y$:<C-R>"时,复制的文本会粘贴到命令模式。 - Jens
@Jens 你说得对。我把制作映射和“实时”执行混淆了。已经修复了。感谢提醒。 - sehe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接