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 在线帮助,:execute但看起来这不是我想要的。我正在考虑用正确的命令填充 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>
 */

如何做到这一点?

4

2 回答 2

4

我会让它处理 Ex 命令,而不是普通模式命令(就像ma在你的例子中一样);通过 执行后者很容易:normal ma,但是将 Ex 命令输入正常模式会出现转义问题(例如,您如何编码Enter必须结束 Ex 命令的?)

这是一个自定义命令:

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

这是一个映射:

nnoremap <Leader>e "zy$:@z<CR>
于 2012-09-28T11:02:21.027 回答
3

Edit Ingo 执行寄存器的方法比我的更容易(@"而不是<^R>")。

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

我会做

y$:<^R>"
  • y$ 拉到行尾
  • : 启动命令模式
  • C-r" 插入抽出的文本

按 Enter,利润。


我曾经有类似的映射。但我变得懒惰,经常只是做Y和编辑命令行。在 windowsShift-Insert上,我发现 vim 命令行更流畅一些,所以我会使用它"+Y来复制到 windows 剪贴板。但我离题了

于 2012-09-28T10:37:10.313 回答