Vim语法感知文本对象的对象选择

5

我刚刚了解到vim的真正强大之处——对象选择功能。在光标位于某个“文本对象”内部时,一组简单的动词可以选择或操作整个对象。例如,在下面引号中的任何位置放置光标(例如在'o'上):

print "Hello, world"
           ^

命令vi"将选择引号内的整个短语。同样的功能也适用于许多vim定义的"文本对象",包括单词、句子、段落以及由引号、括号和大括号括起来的字符。
但现在我希望这个“文本对象”的概念能够意识到我所写的语言。例如,考虑以下Python代码:
re.sub("[^A-Z ]", " ", string)

我希望能够将光标放在某个位置,并选择整个内容。该函数调用是一个明确定义的语法结构,但它不是一个“单词”、“句子”、“段落”,也没有引号或大括号包围。
是否有任何插件或vimrc黑客存在,定义这些依赖于语言的“文本对象”?
5个回答

4

这个脚本使用缩进来定义文本对象。如果您按照常见标准进行格式化,它将适用于许多语言,并且对于Python有保证。


我刚刚为这个旧回答获得了几个赞。但是,如果你仍然需要类似的东西,python-mode包括实际的Python文本对象,用于类和方法(它非常全面,但你可以禁用大部分功能):https://github.com/klen/python-mode - Dav Clark

3
虽然可以构建能够选择整个语法区域的地图,但在您给定的情况下不适用,因为没有“函数调用”语法区域。一种选项是选择括号表达式,然后向后延伸以包括函数调用。
va)oB
  • va) 选择括号内的表达式
  • o 切换光标所在的可视选择端点和扩展方向。
  • B 向后移动一个单词。也就是说,到光标前面的空格之后的字符。

好的回答,但有一个小问题:只有当光标在括号内时才有效,如果光标在"re.sub"部分上则无效。 - Juan Campa
当然,但是可以通过在前面加上 f( 来轻松解决这个问题。由于没有本地方法来完成所要求的操作,显然会有一些约束条件来实现该操作。 - jamessan

1

有一个插件可以创建用户定义的文本对象。虽然评分不高,但也值得一试。


0

我的SameSyntaxMotion插件提供了映射,可以跳转到与光标下相同方式高亮的文本边界和下一个[count]出现次数。 ayiy 文本对象将选择属于相同语法组或以相同方式突出显示的周围文本。


它在GitHub上吗?我想要安装Vundle =) - Ciro Santilli OurBigBook.com
它应该被http://vim-scripts.org镜像,但我在那里找不到它。请向网站所有者投诉;看起来他们的机器人错过了它。 - Ingo Karkat

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接