强曰为道
与天地相似,故不违。知周乎万物,而道济天下,故不过。旁行而不流,乐天知命,故不忧.
文档目录

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 变量的值和说明

练习:

  1. 使用 C-h k 查看 C-x C-s 绑定了什么命令
  2. 使用 C-h f 查看 save-buffer 函数的文档
  3. 使用 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 章:移动与导航