mirror of
https://github.com/l0ng-ai/openidea.git
synced 2026-11-14 16:07:52 +00:00
87 lines
5.9 KiB
Plaintext
87 lines
5.9 KiB
Plaintext
---
|
||
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) 中的 **编辑 › 查找 › 结构化替换…**。
|