Emacs 完全指南 / 第 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 章:移动与导航