如何在Vim中编写脚本,仅从符合特定模式的视觉选择(或折叠)中拉出线条?

如何在Vim中编写脚本,仅从符合特定模式的视觉选择(或折叠)中拉出线条?,vim,Vim,我想在我的.vimrc中添加一个命令,该命令允许在视觉选择范围内或在当前折叠级别的范围内 用力拉所有的线,但只拉那些符合特定图案的线 作为奖励 颠倒顺序 及 执行一个小的模式替换 具体来说,这个想法是为了减少编写常见C语言习惯用法fail goto rollback时的工作量,即(在许多C项目中,最突出的是Linux内核),如果函数体(或块)是这样的话 然后,所需转换的结果应为 error_2: /* <insert cleanup code operation th

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

  • 用力拉所有的线,但只拉那些符合特定图案的线
作为奖励

  • 颠倒顺序

  • 执行一个小的模式替换

具体来说,这个想法是为了减少编写常见C语言习惯用法fail goto rollback时的工作量,即(在许多C项目中,最突出的是Linux内核),如果函数体(或块)是这样的话

然后,所需转换的结果应为

error_2:
    /* <insert cleanup code operation that did not fail1 here> */
error_1:
错误2:
/*  */
错误1:
对于“猛拉所有”,您可以执行以下操作:

  • 正常模式:
    qaq
    清除reg
    a
  • 进行视觉选择
  • ,vim将自动添加
    ”,用于“拉动所有”,您可以执行以下操作:

    • 正常模式:
      qaq
      清除reg
      a
    • 进行视觉选择

    • 按下
      ,vim将自动添加
      ”对于添加样板代码,通常的解决方案是通过一个snippets插件,它以一种通用的方式(至少部分地)解决这个问题,而不是使用vim内置构建一个(可能很脆弱的)特殊解决方案

      代码片段类似于类固醇中内置的
      :缩写
      ,通常在其中插入参数、镜像和多次停止。最早的、非常著名(并且仍然广泛使用)的Vim插件之一是(受TextMate编辑器的启发);不幸的是,它不再被维护;虽然有。一个现代的替代方案(尽管需要Python)是。还有更多,请参阅


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

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

      代码片段类似于类固醇中内置的
      :缩写
      ,通常在其中插入参数、镜像和多次停止。最早的、非常著名(并且仍然广泛使用)的Vim插件之一是(受TextMate编辑器的启发);不幸的是,它不再被维护;虽然有。一个现代的替代方案(尽管需要Python)是。还有更多,请参阅


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

      我提供了一些惯用代码。其基本思想是,按照创建资源分配的相反顺序回滚资源分配。因此,如果存在到标签“a”、“b”、“c”的故障回滚GOTO,回滚操作的顺序将是“c”、“b”、“a”。替换模式将是
      /goto(.*)/\1://
      @datenwolf我想我得到了你想要的。快速(但不干净)的方法是
      g/pattern/m0
      ,然后在缓冲区的开头反向列出匹配的行,然后转到缓冲区的开头编辑新添加的块,删除
      goto
      并更改最后一个
      ->
      。这对于vim magic(或宏)来说并不困难。最后剪切块并粘贴到正确的位置。另一种方法是编写一个函数,首先将所选内容中匹配的行过滤到列表中,反转列表,进行替换,将结果写入寄存器,以便粘贴到某个位置。我提供了一些惯用代码。其基本思想是,按照创建资源分配的相反顺序回滚资源分配。因此,如果存在到标签“a”、“b”、“c”的故障回滚GOTO,回滚操作的顺序将是“c”、“b”、“a”。替换模式将是
      /goto(.*)/\1://
      @datenwolf我想我得到了你想要的。快速(但不干净)的方法是
      g/pattern/m0
      ,然后在缓冲区的开头反向列出匹配的行,然后转到缓冲区的开头编辑新添加的块,删除
      goto
      并更改最后一个
      ->
      。这对于vim magic(或宏)来说并不困难。最后剪切块并粘贴到正确的位置。另一种方法是编写一个函数,首先将您选择的匹配行过滤到列表中,反转列表,进行替换,将结果写入寄存器,以便您可以粘贴到某个位置。一个qood答案,用于错误的问题。这里我不是问样板代码片段,而是问动态文本转换。所有代码片段插件都支持镜像,因此当您在
      if
      语句中键入
      error\u 1
      标签时,它将自动插入下面的标签中。在此期间,至少UltiSnips还支持转换。我得说这很接近你想要的。(而且比自定义转换更容易实现!)一个错误问题的qood答案。这里我不是问样板代码片段,而是问动态文本转换。所有代码片段插件都支持镜像,因此当您在
      if
      语句中键入
      error\u 1
      标签时,它将自动插入下面的标签中。在此期间,至少UltiSnips还支持转换。我得说这很接近你想要的。(而且比自定义转换更容易实现!)
      error_2:
          /* <insert cleanup code operation that did not fail1 here> */
      error_1: