文本选择

走着路睡觉大约 3 分钟

文本选择

扩大/缩小文本选择

实现ExtendWordSelectionHandleropen in new window 接口,并在 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 Selectionopen in new window 可以根据源码的数据结构来调整选择的文本。它可以让你很轻松的选中表达式,代码块,函数,某一行,或 JavaDoc 中的tags 等.

当实现自定义语言支持(ide支持一门新编程语言)的时候。IntelliJ Platform 提供了基础的扩展实现类,可以让你选择某一行或基于PSI 结构的代码块,这个能满足大部分需求。

ExtendWordSelectionHandleropen in new window 扩展点需要实现2个方法:

  • canSelect(PsiElement) 每一个PSI elements 都会调用该方法,如果返回 true,那么光标所在的元素 和 它的所有父元素的文本选择范围 都会是可选的文本范围。

  • select(PsiElement, CharSequence, int, Editor) 返回PSI elements 的所有可选的文本范围

使用示例

自定义语言支持时,如果一个节点调用了有2个参数的方法f(a, b) 。如果光标落在参数 a 上,扩大选择范围的话,第1个范围是 a 参数本身,第2个范围是整个方法调用节点。如果你第2个范围只想要选择方法的所有参数,可以通过以下步骤实现:

  1. 实现ExtendWordSelectionHandleropen in new window 接口,并在 plugin.xml 里使用com.intellij.extendWordSelectionHandler 扩展点 进行注册

  2. canSelect(PsiElement) 方法中的参数为 f(a, b) 的调用节点时,返回true . 那么所有调用 f(a, b) 方法的节点都会调用 select(PsiElement, CharSequence, int, Editor) 方法。

  3. 调用 select(PsiElement, CharSequence, int, Editor) 方法时,您可以返回PSI 元素,或从编辑器文本中提取到的 ab 的文本范围。

进一步的内省和Debugging

想要进一步了解com.intellij.extendWordSelectionHandler 扩展点的工作方式,你可以查看 DocTagSelectioneropen in new window 类,它提供了在 JavaDoc 注释中选择 tag 名称(例如:@param)的实现。另外,在 IntelliJ Platform Exploreropen in new window 中可以搜索到大量的 ExtendWordSelectionHandler.canSelect(PsiElement) 扩展点实现类。

用户在 Debugging 时想增加断点,当用户扩大选择范围的时候,由 SelectWordHandleropen in new window 进行处理,又调用了SelectWordUtilopen in new window 处理了大部分工作,SelectWordUtil.processElement() 会检查所有的com.intellij.extendWordSelectionHandler 扩展,获取 canSelect() 返回 true 的扩展列表。然后调用 SelectWordUtil.askSelectioner() 方法获取到所有的文本范围,可以在这些文本范围上增加断点。

上次编辑于:
贡献者: zhaojingbo
Loading...