Files
openidea/docs/zh/guide/code-intelligence.mdx
T

130 lines
9.8 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
title: "代码智能"
description: "代码补全、导航、查找用法、文档、层次结构与文件结构,以及这些结果从哪里来。"
---
## 结果从哪里来
代码智能有两个来源:
- **语言服务器。** 每种语言在 `languages/<id>.toml` 中配置一个或多个 [LSP](https://microsoft.github.io/language-server-protocol/) 服务器(例如 Python 用 basedpyright 和 Ruff,Rust 用 rust-analyzer,Java 用 JDT LS)。打开某种语言的文件时,对应的服务器随之启动,负责补全、导航、用法、文档、诊断、格式化和重构。一种语言可以同时由多个服务器提供服务,结果会合并。
- **IDE 自己的索引和语法树。** OpenIDEA 用内置的 tree-sitter 语法解析文件,并在后台为项目的文件和符号建立索引。转到文件 / 类 / 符号、结构视图、代码折叠、扩展选区和语法高亮都依赖它;没有可用的语言服务器时,它也是兜底:导航、查找用法、局部变量重命名和引入变量会根据语法树完成能确定的部分,查找用法会把同名匹配作为文本出现列出。
缺少某个语言服务器时,会弹出通知提示安装。已安装的服务器、版本和设置在 **设置 › 语言和框架 › 语言服务器** 中管理。状态栏的 **语言服务** 微件显示当前项目运行着哪些服务器,并可以重启它们。各语言具体用什么,见 [语言](/zh/languages/index)。
插件可以在此基础上再提供补全项、快速修复等功能,详见“插件”标签页。
## 代码补全
| 操作 | macOS | Windows / Linux |
| -------------------------- | -------- | --------------- |
| **代码 › 代码补全 › 基本** | `⌃Space` | `Ctrl+Space` |
| **循环补全单词** | `⌥/` | `Alt+/` |
| **循环补全单词(反向)** | `⌥⇧/` | `Alt+Shift+/` |
| **形参信息** | `⌘P` | `Ctrl+P` |
输入时补全列表会自动弹出。`↵` / `Enter` 插入选中项,`⇥` / `Tab` 替换光标后的剩余标识符。选中项的文档显示在列表旁边。实时模板和后缀模板也会出现在列表中(见 [Live Templates](/zh/guide/templates))。
输入 `(` 和 `,` 后会自动显示形参信息,`⇥` / `⇧⇥` 在参数之间切换。
**循环补全单词** 不依赖语言服务器,用当前文件和其他已打开编辑器里的单词补全光标处的词,连续按会依次切换候选。
补全的行为(大小写匹配、唯一候选时自动插入、排序、自动补括号、何时显示文档)在 **设置 › 编辑器 › 常规 › 代码补全** 中设置。**设置 › 编辑器 › 常规 › 自动导入** 控制粘贴时插入导入,以及自动添加无歧义的导入。
### 内联补全
支持 LSP 内联补全的语言服务器会在输入时于光标处显示灰色建议。可以在 **设置 › 编辑器 › 常规 › 内联补全** 中关闭它、改为停止输入一段时间后再显示,或只对部分语言启用。
| 操作 | macOS | Windows / Linux |
| ----------------------------------- | ----------- | ----------------- |
| **调用内联补全** | `⌥\` | `Alt+\` |
| **插入内联建议** | `⇥` | `Tab` |
| **插入内联建议:下一个单词** | `⌘→` | `Ctrl+Right` |
| **显示下一个内联建议** / **上一个** | `⌥]` / `⌥[` | `Alt+]` / `Alt+[` |
| **隐藏内联建议** | `Esc` | `Esc` |
## 导航
| 操作 | macOS | Windows / Linux |
| ------------------------------- | ------------------ | ---------------------------------- |
| **转到声明或用法** | `⌘B` 或 `⌘`+单击 | `Ctrl+B` 或 `Ctrl`+单击 |
| **转到实现** | `⌥⌘B` 或 `⌥⌘`+单击 | `Ctrl+Alt+B` 或 `Ctrl+Alt`+单击 |
| **转到类型声明** | `⇧⌘B` | `Ctrl+Shift+B` |
| **超方法** | `⌘U` | `Ctrl+U` |
| **导航 › 测试** | `⇧⌘T` | `Ctrl+Shift+T` |
| **后退** / **前进** | `⌘[` / `⌘]` | `Ctrl+Alt+Left` / `Ctrl+Alt+Right` |
| **下一个方法** / **上一个方法** | `⌃⇧↓` / `⌃⇧↑` | `Alt+Down` / `Alt+Up` |
- 在声明本身上执行 **转到声明或用法**,会改为显示它的用法。
- 按住 `⌘` / `Ctrl` 把鼠标悬停在名称上,名称会显示为链接,并附带简要信息。
- 装订区域的图标标出被实现或被重写的类型和方法(↓),以及实现或重写了其他方法的方法(↑),单击即可跳转。
- **导航 › 测试** 按命名约定在类和它的测试之间跳转;还没有测试时会提供 **创建新测试…**。
按名称跳转到文件、类和符号,见 [搜索与导航](/zh/guide/search)。
## 查找用法
| 操作 | macOS | Windows / Linux |
| --------------------------------- | ------------- | ------------------------------- |
| **查找用法** | `⌥F7` | `Alt+F7` |
| **显示用法** | `⌥⌘F7` | `Ctrl+Alt+F7` |
| **高亮文件中的用法** | `⇧⌘F7` | `Ctrl+Shift+F7` |
| **下一个高亮的用法** / **上一个** | `⌃⌥↓` / `⌃⌥↑` | `Ctrl+Alt+Down` / `Ctrl+Alt+Up` |
**查找用法** 把结果按文件分组列在 **查找用法** 工具窗口中,并带预览。**显示用法** 在光标处用弹窗显示。移动光标时,编辑器会自动高亮光标下符号的所有出现位置。
声明上方会显示用法数量(如 `3 usages`)和这段代码最后的作者(来自 Git blame)。可以在 **设置 › 编辑器 › 嵌入提示** 的 **Code Vision** 一节中关闭。
## 文档与信息
| 操作 | macOS | Windows / Linux |
| ------------------ | -------- | --------------- |
| **快速文档** | `F1` | `Ctrl+Q` |
| **快速定义** | `⌥Space` | `Ctrl+Shift+I` |
| **表达式类型信息** | `⌃⇧P` | `Ctrl+Shift+P` |
| **错误描述** | `⌘F1` | `Ctrl+F1` |
| **上下文信息** | `⌃⇧Q` | `Alt+Q` |
鼠标在代码上停留片刻,会显示文档以及指针下的问题。在 **快速文档** 弹窗中,链接会在原地打开其他符号的文档,`←` / `→` 前后翻看,`F4` 跳到源代码。弹窗获得焦点时再按 `F1`,会把它移到 **文档** 工具窗口;该窗口打开期间,`F1` 的文档都会显示在窗口里而不是弹窗中。
**快速定义** 在弹窗中显示定义的源代码,不用离开当前文件。**上下文信息** 显示光标周围的声明行(类、方法、代码块的开头),在它们已经滚出视野时很有用。
## 嵌入提示
参数名、推断出的类型以及其他细节(例如链式调用的类型)的内联提示由语言服务器提供。可以在 **设置 › 编辑器 › 嵌入提示** 中按种类和语言开关,也可以右键单击某个提示来关闭这一类。提示中指向声明的部分可以 `⌘`+单击 / `Ctrl`+单击跳转过去。
## 结构与层次结构
| 操作 | macOS | Windows / Linux |
| ----------------- | ------ | --------------- |
| **文件结构** | `⌘F12` | `Ctrl+F12` |
| **结构** 工具窗口 | `⌘7` | `Alt+7` |
| **调用层次结构** | `⌃⌥H` | `Ctrl+Alt+H` |
| **类型层次结构** | `⌃H` | `Ctrl+H` |
**文件结构** 弹出当前文件的声明列表,输入文字过滤,按 `↵` / `Enter` 跳转。**结构** 工具窗口显示同样的大纲,可通过它的工具栏设置跟随光标。编辑器顶部或底部的痕迹导航显示光标所在位置,位置和适用语言在 **设置 › 编辑器 › 常规 › 痕迹导航** 中设置。
**调用层次结构** 和 **类型层次结构** 在 **层次结构** 工具窗口中打开,展开时逐级加载。它们需要语言服务器支持 LSP 的调用层次和类型层次请求。
## 生成代码
| 操作 | macOS | Windows / Linux |
| ------------- | ----- | --------------- |
| **生成…** | `⌘N` | `Alt+Insert` |
| **实现方法…** | `⌃I` | `Ctrl+I` |
| **重写方法…** | `⌃O` | `Ctrl+O` |
这些命令列出语言服务器在光标处能生成的内容(构造函数、getter 和 setter、缺失的成员等),可选项因语言而异。快速修复和意图操作见 [代码检查](/zh/guide/inspections),重构见 [重构](/zh/guide/refactoring)。
## 语义高亮
除了语法高亮,还会应用语言服务器语义令牌(semantic tokens)提供的颜色。**语义高亮**(每个局部变量和参数名在整个文件中使用各自固定的颜色)和 **彩虹括号** 是可以在查找操作中运行的开关命令,也可以在 **设置 › 编辑器 › 配色方案** 中设置。
## 不工作时怎么排查
- 先看状态栏的 **语言服务** 微件:服务器可能还在启动、启动失败,或者没有安装。
- 不在模块源代码目录中的文件(例如不在模块源根下的 Java 文件),部分服务器只做语法检查,编辑器顶部会有横幅说明。
- **文件 › 省电模式** 会关闭补全和形参信息的自动弹出、悬停文档、用法高亮、用法提示和内联补全。
- 项目打开后索引在后台进行。搜索会先用已经建好的索引给出结果,索引完成后结果才完整。
- 更多检查项和日志位置见 [故障排查](/zh/reference/troubleshooting)。