> ## Documentation Index
> Fetch the complete documentation index at: https://openidea.sh/llms.txt
> Use this file to discover all available pages before exploring further.

# 重构

> 重命名、引入与提取、内联、移动、更改签名和安全删除，以及哪些重构依赖语言服务器。

**重构** 菜单提供 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 |

## 重命名

**1. 开始重命名**

把光标放在名称上，按 `⇧F6` / `Shift+F6`。名称会变成可在原地编辑，文件中的其他出现位置随输入同步变化。

**2. 完成或取消**

按 `↵` / `Enter` 或 `⇥` / `Tab` 在整个项目中应用重命名，按 `Esc` 恢复原名。

**3. 需要更多选项时用对话框**

再按一次 `⇧F6` / `Shift+F6` 改为打开重命名对话框。

如果改动涉及多个文件，或者会重命名、移动文件，写入之前会先显示预览，列出受影响的文件，点击 **执行重构** 确认。如果服务器可能漏掉了一些用法（例如项目还在加载），预览会给出说明，按钮变为 **仍然重命名**。

没有运行中的语言服务器时，只能根据语法树重命名局部变量；成员、类型和其他跨文件的符号要等服务器就绪。

## 引入与提取

**引入变量**、**引入常量**、**引入字段**、**引入参数** 和 **提取方法** 的用法相同：

1. 选中表达式或语句。只放了光标时，会弹出光标周围的表达式供选择，在列表中移动时对应的表达式会被高亮。
2. 如果表达式出现了多次，选择只替换这一处还是全部替换（**找到多个匹配项**）。
3. 接着在原地编辑新名称，`↑` / `↓` 在推荐名称之间切换，`↵` / `Enter` 确认。

语言服务器帮不上忙时，引入变量和引入常量仍能在情况明确时根据语法树完成，否则会给出提示并拒绝执行。

## 移动、复制和重命名文件

在项目视图中，**重命名…**（`⇧F6` / `Shift+F6`）、**移动…**（`F6`、拖放或剪切后粘贴）和 **复制…**（`F5`、复制后粘贴，或按住 `⌥` / `Alt` 拖动）会打开对话框。勾选 **搜索引用** 后，支持此功能的语言服务器会更新对该文件的引用（例如 TypeScript 的 import）；**在注释和字符串中搜索** 会把注释和字符串也算进去。改动会先显示预览。

在编辑器中对符号执行 **移动…**，会调用该语言服务器的移动重构（如果有的话）。

## 安全删除

**1. 开始**

把光标放在声明上按 `⌘⌦` / `Alt+Delete`，或在项目视图中对文件使用 **安全删除…**。

**2. 确认**

确认删除，可以选择同时搜索注释和字符串。

**3. 检查用法**

如果符号仍被使用，会弹出 **检测到用法**，可以选择 **查看用法**、**仍然删除** 或
**取消**。没有用法时，声明连同它的文档注释和注解一起删除，整体算一步撤销。

## 上拉成员与下推成员

用于在 Java 类和它的父类或子类之间移动字段和方法。在对话框中选择成员和目标类；移动会引起的问题会先在 **检测到问题** 中列出，再决定是否继续。这两项由 OpenIDEA 自带的 Java 扩展提供，其他语言不可用。

## 撤销

一次重构就是一步撤销，即使它改了多个文件。多文件重构完成后，通知中会提供 **撤消**（撤销后变为 **重做**）。

## 限制

* 除了重命名、安全删除和基于语法树的兜底实现，其他重构都需要语言服务器运行并提供相应功能。缺少时先看状态栏的 **语言服务** 微件。
* 只有当服务器把签名重写作为代码操作提供时，才会出现更改签名。
* 这个菜单里没有结构化搜索替换；见 [代码检查](https://openidea.sh/zh/guide/inspections.md) 中的 **编辑 › 查找 › 结构化替换…**。


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.