4

我想知道是否有一种方法可以智能地选择变量,就像使用va}. 例如,有一些特定于语言的解析来区分 php 和 ruby​​。为了将来参考,最好利用它 - 最好围绕各种句法元素进行选择。

例如。我想$array['testing']在以下 php 行中进行选择:

$array['testing'] = 'whatever'

或者,假设我想在|item, index|这里选择块参数列表:

hash.each_with_index { |item, index| print item }

编辑:

特定的正则表达式可能会单独解决各种问题,但我觉得应该有一种方法可以利用句法分析来获得更强大的东西。

4

2 回答 2

3

尽管您给定的示例可以使用内置的 Vim 文本对象快速选择(第一个只是viW,第二个我将使用F|v,),但我承认 Vim 的语法突出显示可能是运动和文本对象的良好来源。

我在SyntaxMotion 插件中看到了这个想法的第一个实现,我最近实现了一个类似的插件:SameSyntaxMotion。第一个定义了正常和可视模式的动作,但没有操作员挂起和文本对象。它不会跳过包含的子语法项目并使用与区分属性相同的颜色,而我的使用语法(可能更精确,但也更难掌握),并且也有文本对象(ayiy)。

于 2012-12-03T09:45:44.647 回答
2

你可以在 Vim中定义你自己的任意文本对象。

执行自定义文本对象的最简单方法是为 Visual 模式部分定义一个:vmap(或),为 Operator-pending 模式部分定义一个。例如,以下映射:xmap:omap

xnoremap aC F:o,
onoremap aC :normal! F:v,<CR>

让您选择一个冒号括起来的文本。尝试在下面的“冒号”一词上做vaP或:daP

Some text :in-colon-text: more of the same.

参见:h omap-info的另一个简短示例:omap


但是,如果您不介意依赖插件,则可以使用 textobj-user。这是由 Kana Natsuno 编写的自定义文本对象的通用框架。已经有一些为该框架编写的优秀文本对象,例如我认为必不可少的 textobj-indent 。

使用它,您可以轻松地为变量实现文件类型相关的文本对象。并提供给所有人!

于 2012-12-03T10:53:38.680 回答