Files
openidea/docs/zh/guide/refactoring.mdx
T

87 lines
5.9 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: "重命名、引入与提取、内联、移动、更改签名和安全删除,以及哪些重构依赖语言服务器。"
---
**重构** 菜单提供 IntelliJ IDEA 的各项重构,快捷键也和 IDEA 一致。大多数重构由文件的语言服务器完成,所以能用哪些取决于语言:重命名几乎处处可用,而提取方法、内联、更改签名只在服务器提供时出现。如果光标处无法执行某项重构,会有提示说明原因(例如“Cannot perform refactoring. Select the code to extract”)。
## 重构此项
| 操作 | macOS | Windows / Linux |
| ------------- | ----- | ------------------ |
| **重构此项…** | `⌃T` | `Ctrl+Alt+Shift+T` |
**重构此项…** 只列出在当前光标或选区处适用的重构:先是下表中的重构,然后是语言服务器在此处提供的其他重构(例如 TypeScript 的“Convert to arrow function”)。
## 可用的重构
| 重构 | macOS | Windows / Linux | 实现方式 |
| ------------- | ----- | --------------- | --------------------------------------- |
| **重命名…** | `⇧F6` | `Shift+F6` | 语言服务器;局部变量没有服务器也可以 |
| **更改签名…** | `⌘F6` | `Ctrl+F6` | 语言服务器 |
| **引入变量…** | `⌥⌘V` | `Ctrl+Alt+V` | 语言服务器;简单情况没有服务器也可以 |
| **引入常量…** | `⌥⌘C` | `Ctrl+Alt+C` | 语言服务器;简单情况没有服务器也可以 |
| **引入字段…** | `⌥⌘F` | `Ctrl+Alt+F` | 语言服务器 |
| **引入参数…** | `⌥⌘P` | `Ctrl+Alt+P` | 语言服务器 |
| **提取方法…** | `⌥⌘M` | `Ctrl+Alt+M` | 语言服务器 |
| **内联…** | `⌥⌘N` | `Ctrl+Alt+N` | 语言服务器 |
| **移动…** | `F6` | `F6` | 语言服务器(符号);IDE(文件和文件夹) |
| **安全删除…** | `⌘⌦` | `Alt+Delete` | IDE,借助服务器查找引用 |
| **上拉成员…** | — | — | 仅 Java |
| **下推成员…** | — | — | 仅 Java |
## 重命名
<Steps>
<Step title="开始重命名">
把光标放在名称上,按 `⇧F6` / `Shift+F6`。名称会变成可在原地编辑,文件中的其他出现位置随输入同步变化。
</Step>
<Step title="完成或取消">按 `↵` / `Enter` 或 `⇥` / `Tab` 在整个项目中应用重命名,按 `Esc` 恢复原名。</Step>
<Step title="需要更多选项时用对话框">再按一次 `⇧F6` / `Shift+F6` 改为打开重命名对话框。</Step>
</Steps>
如果改动涉及多个文件,或者会重命名、移动文件,写入之前会先显示预览,列出受影响的文件,点击 **执行重构** 确认。如果服务器可能漏掉了一些用法(例如项目还在加载),预览会给出说明,按钮变为 **仍然重命名**。
没有运行中的语言服务器时,只能根据语法树重命名局部变量;成员、类型和其他跨文件的符号要等服务器就绪。
## 引入与提取
**引入变量**、**引入常量**、**引入字段**、**引入参数** 和 **提取方法** 的用法相同:
1. 选中表达式或语句。只放了光标时,会弹出光标周围的表达式供选择,在列表中移动时对应的表达式会被高亮。
2. 如果表达式出现了多次,选择只替换这一处还是全部替换(**找到多个匹配项**)。
3. 接着在原地编辑新名称,`↑` / `↓` 在推荐名称之间切换,`↵` / `Enter` 确认。
语言服务器帮不上忙时,引入变量和引入常量仍能在情况明确时根据语法树完成,否则会给出提示并拒绝执行。
## 移动、复制和重命名文件
在项目视图中,**重命名…**(`⇧F6` / `Shift+F6`)、**移动…**(`F6`、拖放或剪切后粘贴)和 **复制…**(`F5`、复制后粘贴,或按住 `⌥` / `Alt` 拖动)会打开对话框。勾选 **搜索引用** 后,支持此功能的语言服务器会更新对该文件的引用(例如 TypeScript 的 import);**在注释和字符串中搜索** 会把注释和字符串也算进去。改动会先显示预览。
在编辑器中对符号执行 **移动…**,会调用该语言服务器的移动重构(如果有的话)。
## 安全删除
<Steps>
<Step title="开始">把光标放在声明上按 `⌘⌦` / `Alt+Delete`,或在项目视图中对文件使用 **安全删除…**。</Step>
<Step title="确认">确认删除,可以选择同时搜索注释和字符串。</Step>
<Step title="检查用法">
如果符号仍被使用,会弹出 **检测到用法**,可以选择 **查看用法**、**仍然删除** 或
**取消**。没有用法时,声明连同它的文档注释和注解一起删除,整体算一步撤销。
</Step>
</Steps>
## 上拉成员与下推成员
用于在 Java 类和它的父类或子类之间移动字段和方法。在对话框中选择成员和目标类;移动会引起的问题会先在 **检测到问题** 中列出,再决定是否继续。这两项由 OpenIDEA 自带的 Java 扩展提供,其他语言不可用。
## 撤销
一次重构就是一步撤销,即使它改了多个文件。多文件重构完成后,通知中会提供 **撤消**(撤销后变为 **重做**)。
## 限制
- 除了重命名、安全删除和基于语法树的兜底实现,其他重构都需要语言服务器运行并提供相应功能。缺少时先看状态栏的 **语言服务** 微件。
- 只有当服务器把签名重写作为代码操作提供时,才会出现更改签名。
- 这个菜单里没有结构化搜索替换;见 [代码检查](/zh/guide/inspections) 中的 **编辑 › 查找 › 结构化替换…**。