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

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-csave-buffers-kill-terminal保存并退出
C-zsuspend-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 的快捷键系统是它最显著的特征之一。理解这个体系后,你会发现它其实很有逻辑性。

按键修饰符

修饰符键名符号说明
ControlCtrlC-最常用的修饰键
MetaAlt(或 Option)M-第二常用的修饰键
SuperWin/Cmds-不太常用
HyperCapsLock 映射H-很少使用
ShiftShiftS-通常与其他修饰键组合

按键序列(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-ffind-file打开文件(或创建新文件)
C-x C-ssave-buffer保存当前缓冲区
C-x ssave-some-buffers保存所有修改过的缓冲区
C-x C-wwrite-file另存为
C-x C-vfind-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-fforward-char前进一个字符
C-bbackward-char后退一个字符
C-nnext-line下一行
C-pprevious-line上一行
C-amove-beginning-of-line行首
C-emove-end-of-line行尾
M-fforward-word前进一个单词
M-bbackward-word后退一个单词
M-abackward-sentence句首
M-eforward-sentence句尾

屏幕级移动

快捷键命令说明
C-vscroll-up-command向下翻页
M-vscroll-down-command向上翻页
C-lrecenter-top-bottom重新居中当前行
M-<beginning-of-buffer文件开头
M->end-of-buffer文件末尾
C-M-lreposition-window重新定位窗口

行号跳转

快捷键命令说明
M-g ggoto-line跳转到指定行号
M-g M-ggoto-line同上(别名)
M-g TABmove-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 bswitch-to-buffer切换到指定缓冲区
C-x C-blist-buffers列出所有缓冲区
C-x kkill-buffer关闭缓冲区
C-x ←previous-buffer上一个缓冲区
C-x →next-buffer下一个缓冲区
C-x ssave-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 0delete-window关闭当前窗口
C-x 1delete-other-windows关闭其他所有窗口
C-x 2split-window-below水平分割
C-x 3split-window-right垂直分割
C-x oother-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 0delete-frame关闭当前框架
C-x 5 1delete-other-frames关闭其他框架
C-x 5 2make-frame-command创建新框架
C-x 5 bswitch-to-buffer-other-frame在新框架中切换缓冲区
C-x 5 ffind-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 uundo撤销(更方便的键)
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-SPCset-mark-command设置标记
C-@set-mark-command同上(终端兼容)
C-x C-SPCpop-global-mark全局标记栈回退
C-u C-SPC跳回上一个标记位置
C-x C-xexchange-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)

快捷键命令说明
DELdelete-backward-char删除前一个字符
C-ddelete-forward-char删除后一个字符
M-dkill-word杀掉(剪切)下一个单词
M-DELbackward-kill-word杀掉上一个单词
C-kkill-line杀掉到行尾
C-S-backspacekill-whole-line杀掉整行
M-kkill-sentence杀掉到句尾

复制与粘贴

快捷键命令说明
C-wkill-region剪切选区
M-wkill-ring-save复制选区
C-yyank粘贴
M-yyank-pop粘贴并切换到杀环中的上一条记录
C-M-wappend-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 kdescribe-key查看按键绑定
C-h fdescribe-function查看函数文档
C-h vdescribe-variable查看变量文档
C-h mdescribe-mode查看当前模式文档
C-h wwhere-is查看命令绑定到哪个按键
C-h cdescribe-key-briefly简短显示按键绑定
C-h aapropos-command搜索命令
C-h iinfo打开 Info 手册
C-h Pdescribe-package查看包信息
F1C-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 章:移动与导航