如何在 Vim 中将逻辑块视为文本对象?

如何在 Vim 中将逻辑块视为文本对象?

以下是我每天都会遇到的情况:

0  .outer_selector {
1  
2   .inner_selector {
3     margin: 0;
4     padding: 0;
5
6     input { display: none; }
7   }
8
9  } 

现在我想将 剪切并粘贴到.inner_selector其他地方。我该怎么做?我找不到任何方法可以快速删除逻辑.inner_selector它围绕着空格;即,相当于dap这个括号分隔块的 but。这里有各种想法,按复杂程度递增的顺序排列。(aiii映射是通过vim 缩进对象插入。)

  1. 3Gdai。这几乎可以正常工作,但块的右括号仍保留在.inner_selector原处。

  2. 2Gdai。不好;这会删除整个.outer_selector块。

  3. 2Gdii。这将删除正确的块,但不会删除周围的空格(即,相当于dip而不是dap)。

  4. 2Gf{d%. 使用 转到{f{删除匹配的括号 ( d%)。这将删除第 2 行括号到其匹配括号之间的文本,但保留文本“ .inner_selector”。

  5. 2Gf{v%okd. 开始方式与 (4) 相同,然后跳转到所选文本的顶部 ( o),向上扩展一行 ( k),然后删除 ( d)。与上面的 (3) 相同。

  6. 3Gvaikojjd。选择文本,向上选择一行(k),跳转到所选区域的底部(o),向下选择两行(jj),删除(d)。这样可行。

我可以为最后一个定义一个键盘映射并完成它,但在我这样做之前,我想确保我没有遗漏任何东西。由于它是许多语言中如此常见的代码构造,我很惊讶它很难text { /* multiple lines /* }作为文本对象处理,或者没有插件。

答案1

有一个用于括号的文本对象,它是B{}

如果您转到空白处.outer-selector但又超出了它,.inner-selector您会看到它选择了括号Vi{内的所有内容.outer-selector

我也可以.inner-selector通过运行Vi{内部代码来只选中部分代码.inner-selector,然后V再次选中,以强制它选中所有完整的行。这不会让你得到周围的空白.inner-selector,但我认为这也可能很有趣。

相关内容