第 03 章:基本操作
第 03 章:基本操作
3.1 启动与退出
启动 Emacs
# 启动 GUI 版本
emacs
# 启动终端版本
emacs -nw
# 打开指定文件
emacs filename.txt
# 打开多个文件(水平分屏)
emacs file1.txt file2.txt --split-window-horizontally
# 以 daemon 模式启动(后台常驻)
emacs --daemon
# 连接到已运行的 daemon
emacsclient -c # 打开 GUI 窗口
emacsclient -t # 打开终端窗口
emacsclient -nw file.txt # 在终端中打开文件
退出 Emacs
| 快捷键 | 命令 | 说明 |
|---|
C-x C-c | save-buffers-kill-terminal | 保存并退出 |
C-z | suspend-frame | 挂起(终端模式下) |
M-x kill-emacs | — | 不保存直接退出 |
C-x C-z | — | 挂起 GUI(不太常用) |
提示: 使用 daemon 模式时,C-x C-c 只关闭当前窗口,不会终止 daemon。
要终止 daemon,使用 emacsclient -e '(kill-emacs)'。
3.2 Emacs 快捷键体系
Emacs 的快捷键系统是它最显著的特征之一。理解这个体系后,你会发现它其实很有逻辑性。
按键修饰符
| 修饰符 | 键名 | 符号 | 说明 |
|---|
| Control | Ctrl | C- | 最常用的修饰键 |
| Meta | Alt(或 Option) | M- | 第二常用的修饰键 |
| Super | Win/Cmd | s- | 不太常用 |
| Hyper | CapsLock 映射 | H- | 很少使用 |
| Shift | Shift | S- | 通常与其他修饰键组合 |
按键序列(Key Sequence)
Emacs 使用"前缀键"的概念:某些按键组合会进入一个"等待状态",等待后续按键。
C-x C-f → Ctrl+x, 然后 Ctrl+f → 打开文件
C-x b → Ctrl+x, 然后 b → 切换缓冲区
C-x 4 C-f → Ctrl+x, 4, 然后 Ctrl+f → 在新窗口中打开文件
常用前缀键
| 前缀 | 功能域 | 常用示例 |
|---|
C-x | 全局命令 | 文件、缓冲区、窗口操作 |
C-c | 模式相关命令 | 各主模式自定义键位 |
C-h | 帮助系统 | 查看文档 |
M-g | 跳转命令 | 行号跳转、错误定位 |
C-x r | 寄存器/矩形 | 书签、矩形编辑 |
C-x 4 | 窗口命令 | 在其他窗口操作 |
C-x 5 | 框架命令 | 在其他框架操作 |
3.3 文件操作基础
打开与保存
| 快捷键 | 命令 | 说明 |
|---|
C-x C-f | find-file | 打开文件(或创建新文件) |
C-x C-s | save-buffer | 保存当前缓冲区 |
C-x s | save-some-buffers | 保存所有修改过的缓冲区 |
C-x C-w | write-file | 另存为 |
C-x C-v | find-alternate-file | 重新打开当前文件 |
实际操作流程
1. 打开文件:
C-x C-f → 输入文件路径 → RET
2. 编辑文件内容...
3. 保存:
C-x C-s
4. 保存并退出:
C-x C-c
文件名补全
在 C-x C-f 的文件名输入中:
| 按键 | 说明 |
|---|
TAB | 文件名补全 |
SPC | 部分补全(目录部分) |
M-p / M-n | 历史记录导航 |
C-j | 确认输入(等同于 RET) |
;; 配置文件路径显示为相对路径
(setq insert-default-directory nil)
;; 启用文件路径的缩写解析
(setq file-name-handler-alist
(cons '("\\.gz\\'" . jka-compr-handler)
file-name-handler-alist))
3.4 基本光标移动
字符级与行级移动
| 快捷键 | 命令 | 说明 |
|---|
C-f | forward-char | 前进一个字符 |
C-b | backward-char | 后退一个字符 |
C-n | next-line | 下一行 |
C-p | previous-line | 上一行 |
C-a | move-beginning-of-line | 行首 |
C-e | move-end-of-line | 行尾 |
M-f | forward-word | 前进一个单词 |
M-b | backward-word | 后退一个单词 |
M-a | backward-sentence | 句首 |
M-e | forward-sentence | 句尾 |
屏幕级移动
| 快捷键 | 命令 | 说明 |
|---|
C-v | scroll-up-command | 向下翻页 |
M-v | scroll-down-command | 向上翻页 |
C-l | recenter-top-bottom | 重新居中当前行 |
M-< | beginning-of-buffer | 文件开头 |
M-> | end-of-buffer | 文件末尾 |
C-M-l | reposition-window | 重新定位窗口 |
行号跳转
| 快捷键 | 命令 | 说明 |
|---|
M-g g | goto-line | 跳转到指定行号 |
M-g M-g | goto-line | 同上(别名) |
M-g TAB | move-to-column | 跳转到指定列 |
;; 配置行号显示
(global-display-line-numbers-mode 1)
(setq display-line-numbers-type 'relative) ; 相对行号
练习: 打开一个文本文件,练习使用 C-f, C-b, C-n, C-p 移动光标。
然后尝试 M-f, M-b 进行单词级移动。使用 C-v, M-v 翻页。
3.5 缓冲区(Buffer)
缓冲区是 Emacs 中最核心的概念。打开的每一个文件、每一个消息窗口、每一个帮助页面,都是一个缓冲区。
缓冲区操作
| 快捷键 | 命令 | 说明 |
|---|
C-x b | switch-to-buffer | 切换到指定缓冲区 |
C-x C-b | list-buffers | 列出所有缓冲区 |
C-x k | kill-buffer | 关闭缓冲区 |
C-x ← | previous-buffer | 上一个缓冲区 |
C-x → | next-buffer | 下一个缓冲区 |
C-x s | save-some-buffers | 保存所有修改的缓冲区 |
缓冲区列表
MR Buffer Size Mode File
-- ------ ---- ---- ----
.% init.el 2341 Emacs-Lisp ~/.emacs.d/init.el
* *scratch* 119 Lisp <buffer *scratch*>
* *Messages* 357 Fundamental <buffer *Messages*>
main.py 890 Python ~/project/main.py
MR 列显示"已修改"和"只读"状态* 前缀表示特殊缓冲区(非文件缓冲区)- 没有
* 前缀的通常是文件缓冲区
缓冲区命名约定
| 前缀 | 说明 | 示例 |
|---|
*name* | 特殊缓冲区 | *scratch*, *Messages* |
| 空 | 文件缓冲区 | init.el, README.md |
name | 内部缓冲区(空格开头) | minibuf-0 |
;; 关闭 *scratch* 缓冲区的启动消息
(setq initial-scratch-message nil)
;; 设置 *scratch* 的默认模式
(setq initial-major-mode 'org-mode)
;; 自动关闭特殊缓冲区
(setq-default message-log-max 1000)
;; 一键切换到上一个缓冲区
(global-set-key (kbd "C-x C-b") 'ibuffer) ; 用 Ibuffer 替代默认列表
3.6 窗口(Window)
窗口是显示缓冲区的视图区域。一个框架可以包含多个窗口。
窗口操作
| 快捷键 | 命令 | 说明 |
|---|
C-x 0 | delete-window | 关闭当前窗口 |
C-x 1 | delete-other-windows | 关闭其他所有窗口 |
C-x 2 | split-window-below | 水平分割 |
C-x 3 | split-window-right | 垂直分割 |
C-x o | other-window | 切换到下一个窗口 |
C-M-o | — | 反方向切换窗口 |
C-x ^ | enlarge-window | 增大窗口高度 |
C-x } | enlarge-window-horizontally | 增大窗口宽度 |
C-x { | shrink-window-horizontally | 减小窗口宽度 |
C-x - | shrink-window-if-larger-than-buffer | 窗口缩小到内容大小 |
C-x + | balance-windows | 均衡分配窗口大小 |
窗口操作流程图
初始状态(单窗口):
┌─────────────────────────────┐
│ init.el │
│ │
│ │
│ │
└─────────────────────────────┘
C-x 2(水平分割):
┌─────────────────────────────┐
│ init.el │
├─────────────────────────────┤
│ *scratch* │
└─────────────────────────────┘
C-x 3(垂直分割):
┌──────────────┬──────────────┐
│ │ │
│ init.el │ init.el │
│ │ │
│ │ │
└──────────────┴──────────────┘
C-x o(切换窗口):
┌──────────────┬──────────────┐
│ │ ▼光标 │
│ init.el │ init.el │
│ │ │
│ │ │
└──────────────┴──────────────┘
Winner 模式(窗口布局撤销)
;; 启用 Winner 模式
(winner-mode 1)
;; 撤销窗口布局更改
;; C-c ← (winner-undo)
;; C-c → (winner-redo)
Windmove(方向键切换窗口)
;; 使用 Shift+方向键切换窗口
(windmove-default-keybindings)
;; S-← 切换到左边窗口
;; S-→ 切换到右边窗口
;; S-↑ 切换到上方窗口
;; S-↓ 切换到下方窗口
提示: 如果你同时打开了很多窗口,C-x o 的效率会很低。
配合 ace-window 包可以快速跳转到任意窗口:
(use-package ace-window
:bind ("M-o" . ace-window))
3.7 框架(Frame)
框架是操作系统级别的窗口。每个框架可以包含多个窗口。
框架操作
| 快捷键 | 命令 | 说明 |
|---|
C-x 5 0 | delete-frame | 关闭当前框架 |
C-x 5 1 | delete-other-frames | 关闭其他框架 |
C-x 5 2 | make-frame-command | 创建新框架 |
C-x 5 b | switch-to-buffer-other-frame | 在新框架中切换缓冲区 |
C-x 5 f | find-file-other-frame | 在新框架中打开文件 |
;; 设置新框架的默认大小
(add-to-list 'default-frame-alist '(width . 120))
(add-to-list 'default-frame-alist '(height . 40))
;; 设置框架标题格式
(setq frame-title-format
'(:eval (if (buffer-file-name)
(abbreviate-file-name (buffer-file-name))
"%b")))
3.8 撤销与重做
基本撤销
| 快捷键 | 命令 | 说明 |
|---|
C-/ | undo | 撤销 |
C-x u | undo | 撤销(更方便的键) |
C-_ | undo | 撤销(另一种绑定) |
C-? | undo-redo | 重做(Emacs 28+) |
Vundo(可视化撤销树)
;; 安装 vundo 包以获得可视化撤销树
(use-package vundo
:bind ("C-x u" . vundo))
;; 使用说明:
;; C-x u 打开撤销树视图
;; ← → 在树中移动
;; ↑ ↓ 选择不同的分支
;; RET 确认当前位置
;; q 退出
Undo Tree(Doom Emacs 默认)
;; Doom Emacs 使用 undo-fu 或 undo-tree
(use-package undo-tree
:config
(global-undo-tree-mode 1)
(setq undo-tree-visualizer-timestamps t)
(setq undo-tree-visualizer-diff t))
3.9 标记与区域(Mark and Region)
标记操作
| 快捷键 | 命令 | 说明 |
|---|
C-SPC | set-mark-command | 设置标记 |
C-@ | set-mark-command | 同上(终端兼容) |
C-x C-SPC | pop-global-mark | 全局标记栈回退 |
C-u C-SPC | — | 跳回上一个标记位置 |
C-x C-x | exchange-point-and-mark | 交换标记和光标位置 |
选区操作
操作流程:
1. 移动到起始位置
2. C-SPC(设置标记)
3. 移动到结束位置(区域被高亮)
4. 执行操作:
- C-w 剪切(kill)
- M-w 复制(kill-ring-save)
- C-x C-u 转大写
- C-x C-l 转小写
- M-; 注释/取消注释
Transient Mark 模式
;; Transient Mark 模式(默认开启)
;; 设置标记后,区域高亮显示
(transient-mark-mode 1)
;; 禁用后,区域不高亮,但命令仍然作用于区域
(transient-mark-mode -1)
3.10 常用编辑基础
删除与杀掉(Kill)
| 快捷键 | 命令 | 说明 |
|---|
DEL | delete-backward-char | 删除前一个字符 |
C-d | delete-forward-char | 删除后一个字符 |
M-d | kill-word | 杀掉(剪切)下一个单词 |
M-DEL | backward-kill-word | 杀掉上一个单词 |
C-k | kill-line | 杀掉到行尾 |
C-S-backspace | kill-whole-line | 杀掉整行 |
M-k | kill-sentence | 杀掉到句尾 |
复制与粘贴
| 快捷键 | 命令 | 说明 |
|---|
C-w | kill-region | 剪切选区 |
M-w | kill-ring-save | 复制选区 |
C-y | yank | 粘贴 |
M-y | yank-pop | 粘贴并切换到杀环中的上一条记录 |
C-M-w | append-next-kill | 下次杀掉时追加到上次 |
杀环(Kill Ring)
杀环操作流程:
1. C-k → 杀掉行内容 杀环: ["行内容"]
2. C-k → 杀掉下一行 杀环: ["行内容\n下一行"]
3. M-w → 复制选区 杀环: ["选区文本", "行内容\n下一行"]
4. C-y → 粘贴最后一条 插入: "选区文本"
5. M-y → 切换到上一条 插入: "行内容\n下一行"
6. M-y → 再切换一条 循环回到 "选区文本"
;; 设置杀环大小
(setq kill-ring-max 200)
;; 粘贴时保留光标位置
(setq yank-pop-change-region t)
;; 与系统剪贴板交互
(setq select-enable-clipboard t)
(setq select-enable-primary t)
3.11 帮助系统
Emacs 有极其完善的内置帮助系统,这是它"自文档化"理念的体现。
常用帮助命令
| 快捷键 | 命令 | 说明 |
|---|
C-h k | describe-key | 查看按键绑定 |
C-h f | describe-function | 查看函数文档 |
C-h v | describe-variable | 查看变量文档 |
C-h m | describe-mode | 查看当前模式文档 |
C-h w | where-is | 查看命令绑定到哪个按键 |
C-h c | describe-key-briefly | 简短显示按键绑定 |
C-h a | apropos-command | 搜索命令 |
C-h i | info | 打开 Info 手册 |
C-h P | describe-package | 查看包信息 |
F1 | — | 与 C-h 等价 |
使用示例
C-h k C-x C-f
→ 显示 C-x C-f 绑定到 find-file 命令,并显示其文档
C-h f find-file RET
→ 显示 find-file 函数的完整文档
C-h m
→ 显示当前所有激活的主模式和次模式的文档
C-h v kill-ring RET
→ 显示 kill-ring 变量的值和说明
练习:
- 使用
C-h k 查看 C-x C-s 绑定了什么命令 - 使用
C-h f 查看 save-buffer 函数的文档 - 使用
C-h m 查看当前缓冲区激活了哪些模式
3.12 命令执行(M-x)
M-x 是 Emacs 的命令执行入口,可以运行任何命令。
| 快捷键 | 说明 |
|---|
M-x | 打开命令执行界面 |
M-x command RET | 执行指定命令 |
M-: | 执行 Elisp 表达式 |
;; 常用 M-x 命令示例
M-x replace-string ; 字符串替换
M-x goto-line ; 跳转到行
M-x whitespace-mode ; 显示空白字符
M-x auto-fill-mode ; 自动换行
M-x visual-line-mode ; 可视换行
M-x count-words ; 统计字数
M-x sort-lines ; 排序行
M-x align-regexp ; 对齐正则
执行 Elisp 代码
;; M-x eval-expression 或 M-:
;; 在 minibuffer 中输入 Elisp 表达式并执行
;; 示例:
M-: (+ 1 2 3) RET ; → 6
M-: (buffer-name) RET ; → 当前缓冲区名称
M-: (emacs-version) RET ; → Emacs 版本字符串
3.13 本章小结
| 要点 | 说明 |
|---|
| 快捷键体系 | C-x 全局命令,C-c 模式命令,C-h 帮助 |
| 文件操作 | C-x C-f 打开,C-x C-s 保存,C-x C-c 退出 |
| 缓冲区 | C-x b 切换,C-x k 关闭,C-x C-b 列表 |
| 窗口 | C-x 2/3 分割,C-x 0/1 关闭,C-x o 切换 |
| 框架 | C-x 5 2 新建,C-x 5 0 关闭 |
| 移动 | C-f/b/n/p 字符级,M-f/b 单词级,C-v/M-v 翻页 |
| 撤销 | C-/ 撤销,C-? 重做,C-x u 可视化撤销树 |
| 帮助 | C-h k 查键位,C-h f 查函数,C-h m 查模式 |
3.14 扩展阅读
← 上一章 第 02 章:安装与配置 | 下一章 → 第 04 章:移动与导航