如何在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:
对于“猛拉所有”,您可以执行以下操作:
- 正常模式:
清除regqaq
a
- 进行视觉选择
- 按
,vim将自动添加:
”,用于“拉动所有”,您可以执行以下操作:
- 正常模式:
清除regqaq
a
- 进行视觉选择
- 按下
,vim将自动添加:
”对于添加样板代码,通常的解决方案是通过一个snippets插件,它以一种通用的方式(至少部分地)解决这个问题,而不是使用vim内置构建一个(可能很脆弱的)特殊解决方案 代码片段类似于类固醇中内置的
:缩写
,通常在其中插入参数、镜像和多次停止。最早的、非常著名(并且仍然广泛使用)的Vim插件之一是(受TextMate编辑器的启发);不幸的是,它不再被维护;虽然有。一个现代的替代方案(尽管需要Python)是。还有更多,请参阅
有三件事需要评估:第一,代码片段引擎本身的特性,第二,作者或其他人提供的代码片段的质量和广度;第三,添加新代码片段是多么容易。对于添加样板代码,通常的解决方案是通过一个代码片段插件,它以一种通用的方式(至少部分地)解决这个问题,而不是用Vim内置构建一个(可能很脆弱的)特殊解决方案 代码片段类似于类固醇中内置的:缩写
,通常在其中插入参数、镜像和多次停止。最早的、非常著名(并且仍然广泛使用)的Vim插件之一是(受TextMate编辑器的启发);不幸的是,它不再被维护;虽然有。一个现代的替代方案(尽管需要Python)是。还有更多,请参阅
有三件事需要评估:第一,代码片段引擎本身的特性,第二,作者或其他人提供的代码片段的质量和广度;第三,添加新代码片段是多么容易。我提供了一些惯用代码。其基本思想是,按照创建资源分配的相反顺序回滚资源分配。因此,如果存在到标签“a”、“b”、“c”的故障回滚GOTO,回滚操作的顺序将是“c”、“b”、“a”。替换模式将是
@datenwolf我想我得到了你想要的。快速(但不干净)的方法是/goto(.*)/\1://
,然后在缓冲区的开头反向列出匹配的行,然后转到缓冲区的开头编辑新添加的块,删除g/pattern/m0
并更改最后一个goto
代码>->
。这对于vim magic(或宏)来说并不困难。最后剪切块并粘贴到正确的位置。另一种方法是编写一个函数,首先将所选内容中匹配的行过滤到列表中,反转列表,进行替换,将结果写入寄存器,以便粘贴到某个位置。我提供了一些惯用代码。其基本思想是,按照创建资源分配的相反顺序回滚资源分配。因此,如果存在到标签“a”、“b”、“c”的故障回滚GOTO,回滚操作的顺序将是“c”、“b”、“a”。替换模式将是:
@datenwolf我想我得到了你想要的。快速(但不干净)的方法是/goto(.*)/\1://
,然后在缓冲区的开头反向列出匹配的行,然后转到缓冲区的开头编辑新添加的块,删除g/pattern/m0
并更改最后一个goto
代码>->
。这对于vim magic(或宏)来说并不困难。最后剪切块并粘贴到正确的位置。另一种方法是编写一个函数,首先将您选择的匹配行过滤到列表中,反转列表,进行替换,将结果写入寄存器,以便您可以粘贴到某个位置。一个qood答案,用于错误的问题。这里我不是问样板代码片段,而是问动态文本转换。所有代码片段插件都支持镜像,因此当您在:
语句中键入if
标签时,它将自动插入下面的标签中。在此期间,至少UltiSnips还支持转换。我得说这很接近你想要的。(而且比自定义转换更容易实现!)一个错误问题的qood答案。这里我不是问样板代码片段,而是问动态文本转换。所有代码片段插件都支持镜像,因此当您在error\u 1
语句中键入if
标签时,它将自动插入下面的标签中。在此期间,至少UltiSnips还支持转换。我得说这很接近你想要的。(而且比自定义转换更容易实现!)error\u 1
error_2: /* <insert cleanup code operation that did not fail1 here> */ error_1:
- 正常模式: