# Emacs 快速参考

*导航、编辑、缓冲区、搜索、Org 模式、包管理*

> Source: GNU Emacs Manual (gnu.org/software/emacs) · MIT

## 导航

### 光标移动

| Command | Description |
|---------|-------------|
| `C-f / C-b` | 前进 / 后退一个字符 |
| `M-f / M-b` | 前进 / 后退一个单词 |
| `C-n / C-p` | 下一行 / 上一行 |
| `C-a / C-e` | 行首 / 行尾 |
| `M-a / M-e` | 句首 / 句尾 |
| `C-v / M-v` | 向下 / 向上翻页 |
| `M-< / M->` | 缓冲区开头 / 结尾 |
| `M-g g` | 跳转到指定行号 |

### 屏幕定位

| Command | Description |
|---------|-------------|
| `C-l` | 重新居中（循环：顶/中/底） |
| `C-M-l` | 启发式重新定位窗口 |

## 编辑

### Kill 与 Yank（剪切与粘贴）

| Command | Description |
|---------|-------------|
| `C-k` | Kill 到行尾 |
| `C-w` | Kill 区域（剪切） |
| `M-w` | 复制区域 |
| `C-y` | Yank（粘贴） |
| `M-y` | Yank 后循环 kill ring |
| `C-d` | 向前删除字符 |
| `M-d` | 向前 Kill 单词 |
| `M-DEL` | 向后 Kill 单词 |

### 撤销与转置

| Command | Description |
|---------|-------------|
| `C-/ or C-_` | 撤销 |
| `C-g C-/` | 重做（撤销撤销） |
| `C-t` | 转置字符 |
| `M-t` | 转置单词 |
| `C-x C-t` | 转置行 |

### 选区

| Command | Description |
|---------|-------------|
| `C-SPC` | 设置标记（开始选区） |
| `C-x h` | 选中整个缓冲区 |
| `M-h` | 选中段落 |
| `C-x C-x` | 交换 point 和 mark |

## 缓冲区与窗口

### 缓冲区

| Command | Description |
|---------|-------------|
| `C-x b` | 切换到缓冲区 |
| `C-x C-b` | 列出所有缓冲区 |
| `C-x k` | Kill（关闭）缓冲区 |
| `C-x LEFT / RIGHT` | 上一个 / 下一个缓冲区 |

### 窗口

| Command | Description |
|---------|-------------|
| `C-x 2` | 水平分割窗口 |
| `C-x 3` | 垂直分割窗口 |
| `C-x 0` | 关闭当前窗口 |
| `C-x 1` | 关闭其他所有窗口 |
| `C-x o` | 切换到其他窗口 |
| `C-x ^` | 垂直扩大窗口 |
| `C-x {` | 水平缩小窗口 |

### Frame

| Command | Description |
|---------|-------------|
| `C-x 5 2` | 创建新 frame |
| `C-x 5 0` | 删除当前 frame |
| `C-x 5 o` | 切换到其他 frame |

## 搜索与替换

### 增量搜索

| Command | Description |
|---------|-------------|
| `C-s` | 向前搜索（增量） |
| `C-r` | 向后搜索（增量） |
| `C-s C-s` | 重复上次向前搜索 |
| `C-M-s` | 正则向前搜索 |
| `C-M-r` | 正则向后搜索 |
| `RET` | 在当前位置退出搜索 |
| `C-g` | 取消搜索，回到起点 |

### 替换

| Command | Description |
|---------|-------------|
| `M-%` | 查询替换 |
| `C-M-%` | 正则查询替换 |
| `y` | 替换当前匹配 |
| `n` | 跳过当前匹配 |
| `!` | 替换剩余所有 |
| `q` | 退出替换 |

## 文件

### 文件操作

| Command | Description |
|---------|-------------|
| `C-x C-f` | 查找（打开）文件 |
| `C-x C-s` | 保存当前缓冲区 |
| `C-x C-w` | 另存为（写入新文件） |
| `C-x s` | 保存所有已修改缓冲区 |
| `C-x C-r` | 以只读方式打开文件 |
| `C-x i` | 在 point 处插入文件内容 |

### Dired（目录编辑器）

| Command | Description |
|---------|-------------|
| `C-x d` | 在 Dired 中打开目录 |
| `d / x` | 标记待删除 / 执行删除 |
| `R` | 重命名 / 移动文件 |
| `C` | 复制文件 |
| `+` | 创建目录 |
| `g` | 刷新列表 |

## 模式

### 主模式

| Command | Description |
|---------|-------------|
| `M-x fundamental-mode` | 纯文本编辑 |
| `M-x text-mode` | 带填充和拼写的文本 |
| `M-x prog-mode` | 编程模式基础 |
| `M-x python-mode` | Python 编辑与缩进 |
| `M-x shell-mode` | 缓冲区中的交互式 shell |

### 常用次要模式

| Command | Description |
|---------|-------------|
| `M-x display-line-numbers-mode` | 切换行号显示 |
| `M-x auto-fill-mode` | 在填充列处自动换行 |
| `M-x flyspell-mode` | 实时拼写检查 |
| `M-x column-number-mode` | 在模式行显示列号 |
| `M-x whitespace-mode` | 可视化空白字符 |
| `M-x electric-pair-mode` | 自动闭合括号和引号 |

## Org 模式基础

### 结构

| Command | Description |
|---------|-------------|
| `* / ** / ***` | 1 / 2 / 3 级标题 |
| `TAB` | 循环切换标题可见性 |
| `S-TAB` | 循环切换全局可见性 |
| `M-RET` | 在同级插入标题 |
| `M-LEFT / M-RIGHT` | 提升 / 降级标题 |
| `M-UP / M-DOWN` | 上移 / 下移子树 |

### TODO 与复选框

| Command | Description |
|---------|-------------|
| `C-c C-t` | 循环切换 TODO 状态 |
| `C-c C-d` | 设置截止日期 |
| `C-c C-s` | 安排日程 |
| `C-c C-c` | 切换复选框 [ ] / [X] |
| `C-c a` | 打开议程视图 |

### 链接与导出

| Command | Description |
|---------|-------------|
| `C-c C-l` | 插入 / 编辑链接 |
| `C-c C-o` | 打开 point 处的链接 |
| `C-c C-e` | 导出调度器（HTML、PDF 等） |

## 包管理

### package.el

| Command | Description |
|---------|-------------|
| `M-x list-packages` | 浏览可用包 |
| `i / d / x` | 标记安装 / 删除 / 执行 |
| `U` | 标记所有可升级包 |
| `M-x package-refresh-contents` | 刷新包列表 |

### use-package（init.el）

```
(use-package magit
  :ensure t
  :bind ("C-x g" . magit-status))
(use-package company
  :ensure t
  :hook (prog-mode . company-mode))
```

## 配置

### 关键配置文件

| Command | Description |
|---------|-------------|
| `~/.emacs.d/init.el` | 主配置文件 |
| `~/.emacs.d/early-init.el` | 早期初始化（GUI 前，Emacs 27+） |
| `~/.emacs.d/custom.el` | Customize 写入的配置 |

### 常用配置

```
(setq inhibit-startup-screen t)
(tool-bar-mode -1)
(set-face-attribute 'default nil :height 120)
(global-display-line-numbers-mode 1)
(setq make-backup-files nil)
```

### 帮助系统

| Command | Description |
|---------|-------------|
| `C-h k` | 描述快捷键绑定 |
| `C-h f` | 描述函数 |
| `C-h v` | 描述变量 |
| `C-h m` | 描述当前模式 |
| `C-h t` | 打开 Emacs 教程 |
| `C-h i` | 打开 Info 文档 |

## 常用模式

### 矩形编辑

| Command | Description |
|---------|-------------|
| `C-x SPC` | 开始矩形标记模式 |
| `C-x r k` | Kill 矩形 |
| `C-x r y` | Yank 矩形 |
| `C-x r t` | 用字符串替换矩形 |
| `C-x r o` | 插入空白矩形 |

### 宏

| Command | Description |
|---------|-------------|
| `C-x (` | 开始录制宏 |
| `C-x )` | 停止录制宏 |
| `C-x e` | 执行上次宏 |
| `C-u 10 C-x e` | 执行宏 10 次 |
| `M-x name-last-kbd-macro` | 命名宏以便复用 |

### Shell 与执行

| Command | Description |
|---------|-------------|
| `M-x shell` | 在缓冲区中打开 shell |
| `M-x eshell` | Emacs Lisp shell |
| `M-!` | 运行 shell 命令 |
| `M-x eval-buffer` | 将整个缓冲区作为 Elisp 求值 |
| `C-x C-e` | 对 point 前的 Elisp 表达式求值 |
