如何在Vim中编写脚本以仅从与特定模式匹配的视觉选择(或折叠)中划线?

时间:2014-08-25 11:49:39

标签: vim

我想在.vimrc添加一个命令,允许在视觉选择范围内或当前折叠级别范围内

  • 猛拉所有,但只有那些符合某种模式的行。

并作为奖励

  • 改变他们的命令

  • 执行小型模式替换。

具体的想法是减少编写常见的C语言失败goto-rollback的工作量,即(如果是一个函数的主体(或块)可以在很多C项目中找到最突出的Linux内核)是这个

    someErrorType errorcode;
    if(fail1) {
        errorcode = someError1;
        goto error_1;
    }
    prepare_a();
    if(fail2) { 
        errorcode = someError2;
        goto error_2;
    }

然后所需转换的结果应为此。

error_2:
    /* <insert cleanup code operation that did not fail1 here> */
error_1:

2 个答案:

答案 0 :(得分:3)

对于“yanking all”,你可以这样做:

  • 正常模式:qaq以清除注册a
  • 做视觉选择
  • :,vim将自动添加'<,'>,然后g/pattern/y A<Enter>

您需要的所有行都在注册a中,您可以"ap进行粘贴。对于逆转订单要求,我不明白。你期望什么输出。前后混凝土可能有所帮助。

答案 1 :(得分:1)

对于添加样板代码,通常的解决方案是通过片段插件,它以一般方式解决这个问题(至少部分),而不是构建一个(可能是脆弱的)特殊解决方案,内置Vim -INS。

片段就像类固醇上的内置:abbreviate一样,通常带有参数插入,镜像和内部多个停止。第一个非常着名(并且仍然广泛使用)的Vim插件之一是snipMate(受 TextMate 编辑器的启发);不幸的是,它不再维持;虽然有a fork。现代替代方案(虽然需要Python)是UltiSnips。还有更多内容,请参阅this list on the Vim Tips Wiki

有三件事要评估:第一,摘录引擎本身的功能,第二,作者或其他人提供的片段的质量和广度;第三,添加新片段是多么容易。