结果从哪里来
代码智能有两个来源:- 语言服务器。 每种语言在
languages/<id>.toml中配置一个或多个 LSP 服务器(例如 Python 用 basedpyright 和 Ruff,Rust 用 rust-analyzer,Java 用 JDT LS)。打开某种语言的文件时,对应的服务器随之启动,负责补全、导航、用法、文档、诊断、格式化和重构。一种语言可以同时由多个服务器提供服务,结果会合并。 - IDE 自己的索引和语法树。 OpenIDEA 用内置的 tree-sitter 语法解析文件,并在后台为项目的文件和符号建立索引。转到文件 / 类 / 符号、结构视图、代码折叠、扩展选区和语法高亮都依赖它;没有可用的语言服务器时,它也是兜底:导航、查找用法、局部变量重命名和引入变量会根据语法树完成能确定的部分,查找用法会把同名匹配作为文本出现列出。
代码补全
输入时补全列表会自动弹出。
↵ / Enter 插入选中项,⇥ / Tab 替换光标后的剩余标识符。选中项的文档显示在列表旁边。实时模板和后缀模板也会出现在列表中(见 Live Templates)。
输入 ( 和 , 后会自动显示形参信息,⇥ / ⇧⇥ 在参数之间切换。
循环补全单词 不依赖语言服务器,用当前文件和其他已打开编辑器里的单词补全光标处的词,连续按会依次切换候选。
补全的行为(大小写匹配、唯一候选时自动插入、排序、自动补括号、何时显示文档)在 设置 › 编辑器 › 常规 › 代码补全 中设置。设置 › 编辑器 › 常规 › 自动导入 控制粘贴时插入导入,以及自动添加无歧义的导入。
内联补全
支持 LSP 内联补全的语言服务器会在输入时于光标处显示灰色建议。可以在 设置 › 编辑器 › 常规 › 内联补全 中关闭它、改为停止输入一段时间后再显示,或只对部分语言启用。导航
- 在声明本身上执行 转到声明或用法,会改为显示它的用法。
- 按住
⌘/Ctrl把鼠标悬停在名称上,名称会显示为链接,并附带简要信息。 - 装订区域的图标标出被实现或被重写的类型和方法(↓),以及实现或重写了其他方法的方法(↑),单击即可跳转。
- 导航 › 测试 按命名约定在类和它的测试之间跳转;还没有测试时会提供 创建新测试…。
查找用法
查找用法 把结果按文件分组列在 查找用法 工具窗口中,并带预览。显示用法 在光标处用弹窗显示。移动光标时,编辑器会自动高亮光标下符号的所有出现位置。
声明上方会显示用法数量(如
3 usages)和这段代码最后的作者(来自 Git blame)。可以在 设置 › 编辑器 › 嵌入提示 的 Code Vision 一节中关闭。
文档与信息
鼠标在代码上停留片刻,会显示文档以及指针下的问题。在 快速文档 弹窗中,链接会在原地打开其他符号的文档,
← / → 前后翻看,F4 跳到源代码。弹窗获得焦点时再按 F1,会把它移到 文档 工具窗口;该窗口打开期间,F1 的文档都会显示在窗口里而不是弹窗中。
快速定义 在弹窗中显示定义的源代码,不用离开当前文件。上下文信息 显示光标周围的声明行(类、方法、代码块的开头),在它们已经滚出视野时很有用。
嵌入提示
参数名、推断出的类型以及其他细节(例如链式调用的类型)的内联提示由语言服务器提供。可以在 设置 › 编辑器 › 嵌入提示 中按种类和语言开关,也可以右键单击某个提示来关闭这一类。提示中指向声明的部分可以⌘+单击 / Ctrl+单击跳转过去。
结构与层次结构
文件结构 弹出当前文件的声明列表,输入文字过滤,按
↵ / Enter 跳转。结构 工具窗口显示同样的大纲,可通过它的工具栏设置跟随光标。编辑器顶部或底部的痕迹导航显示光标所在位置,位置和适用语言在 设置 › 编辑器 › 常规 › 痕迹导航 中设置。
调用层次结构 和 类型层次结构 在 层次结构 工具窗口中打开,展开时逐级加载。它们需要语言服务器支持 LSP 的调用层次和类型层次请求。
生成代码
这些命令列出语言服务器在光标处能生成的内容(构造函数、getter 和 setter、缺失的成员等),可选项因语言而异。快速修复和意图操作见 代码检查,重构见 重构。
语义高亮
除了语法高亮,还会应用语言服务器语义令牌(semantic tokens)提供的颜色。语义高亮(每个局部变量和参数名在整个文件中使用各自固定的颜色)和 彩虹括号 是可以在查找操作中运行的开关命令,也可以在 设置 › 编辑器 › 配色方案 中设置。不工作时怎么排查
- 先看状态栏的 语言服务 微件:服务器可能还在启动、启动失败,或者没有安装。
- 不在模块源代码目录中的文件(例如不在模块源根下的 Java 文件),部分服务器只做语法检查,编辑器顶部会有横幅说明。
- 文件 › 省电模式 会关闭补全和形参信息的自动弹出、悬停文档、用法高亮、用法提示和内联补全。
- 项目打开后索引在后台进行。搜索会先用已经建好的索引给出结果,索引完成后结果才完整。
- 更多检查项和日志位置见 故障排查。