文本选择
文本选择
扩大/缩小文本选择
实现ExtendWordSelectionHandler 接口,并在 plugin.xml 里使用com.intellij.extendWordSelectionHandler 扩展点 进行注册 。当扩大或缩小选择的时候,将可以提供一个额外的文本选择范围列表。
ExtendWordSelectionHandler.canSelect(PsiElement) 方法会判断是否为 PsiElement 提供额外的文本选择范围。
如果 ExtendWordSelectionHandler.canSelect(PsiElement) 返回 true ,IntelliJ Platform 将会调用List<TextRange> textRanges = ExtendWordSelectionHandler.select(PsiElement, CharSequence, int, Editor) 方法来获取为该 PsiElement 提供的文本选择范围。
也可以查看下面文档(下面文档一般用不到,暂不翻译):
概述
IntelliJ Platform 的 Extend Selection and Shrink Selection 可以根据源码的数据结构来调整选择的文本。它可以让你很轻松的选中表达式,代码块,函数,某一行,或 JavaDoc 中的tags 等.
当实现自定义语言支持(ide支持一门新编程语言)的时候。IntelliJ Platform 提供了基础的扩展实现类,可以让你选择某一行或基于PSI 结构的代码块,这个能满足大部分需求。
ExtendWordSelectionHandler 扩展点需要实现2个方法:
canSelect(PsiElement) 每一个PSI elements 都会调用该方法,如果返回 true,那么光标所在的元素 和 它的所有父元素的文本选择范围 都会是可选的文本范围。
select(PsiElement, CharSequence, int, Editor) 返回PSI elements 的所有可选的文本范围
使用示例
自定义语言支持时,如果一个节点调用了有2个参数的方法f(a, b) 。如果光标落在参数 a 上,扩大选择范围的话,第1个范围是 a 参数本身,第2个范围是整个方法调用节点。如果你第2个范围只想要选择方法的所有参数,可以通过以下步骤实现:
实现ExtendWordSelectionHandler 接口,并在 plugin.xml 里使用com.intellij.extendWordSelectionHandler 扩展点 进行注册
canSelect(PsiElement) 方法中的参数为 f(a, b) 的调用节点时,返回true . 那么所有调用 f(a, b) 方法的节点都会调用 select(PsiElement, CharSequence, int, Editor) 方法。
调用 select(PsiElement, CharSequence, int, Editor) 方法时,您可以返回PSI 元素,或从编辑器文本中提取到的 a 和 b 的文本范围。
进一步的内省和Debugging
想要进一步了解com.intellij.extendWordSelectionHandler 扩展点的工作方式,你可以查看 DocTagSelectioner 类,它提供了在 JavaDoc 注释中选择 tag 名称(例如:@param)的实现。另外,在 IntelliJ Platform Explorer 中可以搜索到大量的 ExtendWordSelectionHandler.canSelect(PsiElement) 扩展点实现类。
用户在 Debugging 时想增加断点,当用户扩大选择范围的时候,由 SelectWordHandler 进行处理,又调用了SelectWordUtil 处理了大部分工作,SelectWordUtil.processElement() 会检查所有的com.intellij.extendWordSelectionHandler 扩展,获取 canSelect() 返回 true 的扩展列表。然后调用 SelectWordUtil.askSelectioner() 方法获取到所有的文本范围,可以在这些文本范围上增加断点。