2012-09-28 76 views
3

我有时会发现自己正在编写文本,其中部分文件是由外部程序生成的。例如,考虑包含vim:执行光标后的其余行作为vim命令

/* 
* 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:...),粘贴&运行它C源文件,等待命令完成,选择'a!}sort -u并粘贴&运行它。这是不雅的,因为它只是半自动的,我认为它可以是全自动的。我阅读:execute和朋友的vim在线帮助,但它看起来像没有做我想做的事。我正在考虑用适当的命令填充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

我会让防爆处理命令,而不是普通模式命令(例如ma在你的例子中);通过:normal ma很容易执行后者,但是将Ex命令送入普通模式有问题(例如,你如何编码输入必须得出结论Ex命令?)

这里有一个自定义命令:

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

而这里的一个映射:

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

哦aha。':@ z'用于寄存器比'^ R'寄存器'完成'更容易(也可以描述)+1 – sehe

+0

'nnoremap'不会将光标移动到适当的行。修改修复了这个问题:'“zy $ 2j:@z '。 – Jens

3

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

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

我做

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

按Enter键,获利。


我曾经有过类似的东西。但我很懒,经常只做Y并编辑命令行。在Windows中,我发现按住Shift键插入 vim的命令行有点顺畅,所以我会再使用“+ Y复制到Windows剪贴板上。但是,我离题

+0

难道说在C-v是错在这里?当我执行'y $:'''时,被抽出的文本被粘贴到命令模式。 – Jens

+0

@Jens你是对的,我正在做一个映射与'live'执行混淆,修复它。谢谢你的提示 – sehe