Emacs Lisp扩展
集成开发环境
高效键盘操作
邮件、新闻、日历
emacs [选项] [文件...]
emacs [选项] [目录]
emacs [选项] --eval "表达式"
C-表示Ctrl键,M-表示Meta键(通常是Alt键)。例如:C-x C-s表示先按Ctrl+X,再按Ctrl+S。
| 选项 | 说明 |
|---|---|
-nw 或 --no-window-system |
在终端中运行(无图形界面) |
-q 或 --no-init-file |
不加载初始化文件 |
--daemon |
以守护进程模式启动 |
-c 或 --create-frame |
创建新图形窗口(当有守护进程时) |
-t 文件 或 --terminal=文件 |
使用指定终端设备 |
-batch |
批处理模式(不交互) |
--eval "表达式" |
执行Emacs Lisp表达式 |
--script 文件 |
运行Emacs Lisp脚本文件 |
+行号 |
启动后跳转到指定行 |
+行号:列号 |
启动后跳转到指定行和列 |
-fg 颜色 或 --foreground-color=颜色 |
设置前景色 |
-bg 颜色 或 --background-color=颜色 |
设置背景色 |
--fullscreen |
全屏模式 |
--geometry=宽x高+X+Y |
设置窗口几何尺寸 |
┌─────────────────────────────────────────────────────────────┐
│ 菜单栏 (可隐藏) │
├─────────────────────────────────────────────────────────────┤
│ *scratch* 文件编辑区域 │
│ 这是Emacs的草稿缓冲区,用于临时编辑和测试Emacs Lisp代码。 │
│ │
│ 可以在这里输入任意文本,或者执行Emacs Lisp表达式。 │
│ │
│ │
│ │
│ │
│ │
├─────────────────────────────────────────────────────────────┤
│ L1 (Fundamental) 模式行 (显示当前模式和状态) │
├─────────────────────────────────────────────────────────────┤
│ For information about GNU Emacs... 回显区域/迷你缓冲区 │
└─────────────────────────────────────────────────────────────┘
| 菜单栏 | 图形界面下的菜单,可以通过M-x menu-bar-mode切换显示 |
| 编辑区域 | 主要的文本编辑区域,可以同时打开多个缓冲区 |
| 模式行 | 显示当前缓冲区信息:文件名、模式、编码、行号等 |
| 回显区域/迷你缓冲区 | 显示消息和用于命令输入的区域 |
# 启动Emacs(图形界面)
emacs
# 在终端中启动(无图形界面)
emacs -nw
# 启动并打开指定文件
emacs 文件名.txt
emacs -nw 文件名.txt # 终端模式
# 启动并跳转到第10行
emacs +10 文件名.txt
# 启动Emacs守护进程
emacs --daemon
# 连接到守护进程(创建新窗口)
emacsclient -c
# 退出Emacs
C-x C-c # 退出(保存修改)
C-x C-c (选择n) # 不保存退出
C-z # 挂起Emacs(终端中)
| 操作 | 快捷键 | 说明 |
|---|---|---|
| 打开文件 | C-x C-f |
查找文件并打开 |
| 保存文件 | C-x C-s |
保存当前文件 |
| 另存为 | C-x C-w |
写入文件(另存为) |
| 保存所有文件 | C-x s |
保存所有修改的缓冲区 |
| 插入文件 | C-x i |
插入文件到当前位置 |
| 恢复文件 | M-x recover-file |
从自动保存文件恢复 |
| 最近文件 | C-x C-r |
打开最近访问的文件 |
| 只读模式 | C-x C-q |
切换只读模式 |
C-f | 向前移动一个字符 |
C-b | 向后移动一个字符 |
C-n | 向下移动一行 |
C-p | 向上移动一行 |
M-f | 向前移动一个单词 |
M-b | 向后移动一个单词 |
C-a | 移动到行首 |
C-e | 移动到行尾 |
M-< | 移动到缓冲区开头 |
M-> | 移动到缓冲区末尾 |
C-v | 向下翻页 |
M-v | 向上翻页 |
M-g g 或 M-g M-g | 跳转到指定行 |
C-l | 重绘屏幕,光标居中 |
M-x goto-char | 跳转到指定字符位置 |
M-x goto-line | 跳转到指定行 |
C-s | 向前搜索 |
C-r | 向后搜索 |
| 操作 | 快捷键 | 说明 |
|---|---|---|
| 删除字符 | Delete 或 C-d |
删除光标后的字符 |
| 删除前字符 | Backspace |
删除光标前的字符 |
| 删除单词 | M-d |
删除光标后的单词 |
| 删除前单词 | M-Delete |
删除光标前的单词 |
| 删除行 | C-k |
删除从光标到行尾 |
| 删除整行 | C-S-backspace |
删除整行 |
| 复制区域 | M-w |
复制标记区域 |
| 剪切区域 | C-w |
剪切标记区域 |
| 粘贴 | C-y |
粘贴(yank) |
| 撤销 | C-/ 或 C-x u |
撤销操作 |
| 重做 | C-g C-/ |
重做操作 |
| 设置标记 | C-@ 或 C-Space |
开始选择区域 |
| 交换标记点 | C-x C-x |
交换标记和光标位置 |
# 缓冲区列表
C-x C-b # 显示缓冲区列表
C-x b # 切换缓冲区(输入缓冲区名)
C-x k # 杀死(关闭)缓冲区
# 缓冲区管理
M-x rename-buffer # 重命名缓冲区
M-x revert-buffer # 重新从文件加载缓冲区
M-x kill-some-buffers # 选择性地杀死缓冲区
# 特殊缓冲区
*scratch* # 草稿缓冲区(用于临时编辑)
*Messages* # 消息缓冲区
*Help* # 帮助缓冲区
*Completions* # 自动补全缓冲区
# 窗口分割
C-x 2 # 水平分割窗口
C-x 3 # 垂直分割窗口
C-x 1 # 关闭其他窗口(保留当前)
C-x 0 # 关闭当前窗口
C-x o # 切换到其他窗口
C-x ^ # 增加窗口高度
C-x } # 增加窗口宽度
C-x { # 减少窗口宽度
C-x - # 缩小窗口到合适大小
C-x + # 使所有窗口大小相同
# 窗口导航
C-M-v # 向下滚动其他窗口
C-M-S-v # 向上滚动其他窗口
# 框架(窗口)管理
C-x 5 2 # 新建框架
C-x 5 0 # 关闭当前框架
C-x 5 o # 切换到其他框架
C-x 5 1 # 关闭其他框架
# 多显示器
C-x 5 r # 将缓冲区移动到右侧框架
C-x 5 b # 在其他框架中显示缓冲区
# 增量搜索
C-s # 向前增量搜索
C-r # 向后增量搜索
Enter # 退出搜索(保持光标位置)
C-g # 退出搜索(回到起始位置)
# 搜索时
C-s C-s # 重复向前搜索
C-r C-r # 重复向后搜索
C-w # 将光标处的单词添加到搜索
M-e # 编辑搜索字符串
# 单词搜索
M-s w # 向前单词搜索
M-s w C-r # 向后单词搜索
# 正则表达式搜索
C-M-s # 向前正则表达式搜索
C-M-r # 向后正则表达式搜索
# 常用正则表达式符号
. # 任意单个字符
.* # 零个或多个任意字符
^ # 行首
$ # 行尾
[] # 字符集
[^] # 不在字符集中的字符
\ # 转义字符
\| # 或
\( \) # 分组
\1, \2... # 引用分组
# 交互式替换
M-% # 查询替换
# 选项: y替换, n跳过, !全部替换, q退出
# .替换并退出, ,替换但不移动
# 正则表达式替换
C-M-% # 正则表达式替换
# 无条件替换
M-x replace-string # 替换字符串
M-x replace-regexp # 替换正则表达式
# 在区域内替换
C-x h # 选择整个缓冲区
M-% # 然后在区域内替换
| 模式类型 | 说明 | 示例 |
|---|---|---|
| 主模式 | 每个缓冲区有一个主模式,决定缓冲区的基本行为 | fundamental-mode, text-mode, prog-mode |
| 次模式 | 可以同时启用多个次模式,提供额外功能 | auto-fill-mode, line-number-mode, abbrev-mode |
| 编程模式 | 特定编程语言的支持 | python-mode, emacs-lisp-mode, c-mode |
| 文本模式 | 文本编辑相关模式 | markdown-mode, org-mode, latex-mode |
# 切换模式
M-x 模式名-mode # 启用或禁用指定模式
# 常用模式
M-x text-mode # 文本模式
M-x fundamental-mode # 基本模式
M-x auto-fill-mode # 自动换行模式
M-x line-number-mode # 显示行号模式
M-x column-number-mode # 显示列号模式
M-x display-time-mode # 显示时间模式
# 查看当前模式
C-h m # 显示当前启用的模式及其文档
# 在迷你缓冲区执行单行表达式
M-: # 打开表达式求值器
# 示例:
(+ 1 2) # 返回3
(message "Hello, Emacs!") # 显示消息
# 在缓冲区中执行
C-x C-e # 执行光标前的表达式
# 执行区域代码
M-x eval-region
# 执行整个缓冲区
M-x eval-buffer
# 加载Elisp文件
M-x load-file # 加载指定文件
M-x load-library # 加载库
;; 注释以分号开始
;; 变量定义
(setq my-variable "Hello")
;; 函数定义
(defun hello-world ()
"打印Hello World消息"
(interactive) ; 使函数可交互调用
(message "Hello, World!"))
;; 条件语句
(if (> 5 3)
(message "5大于3")
(message "5不大于3"))
;; 循环
(dotimes (i 5)
(message "索引: %d" i))
;; 列表操作
(setq my-list '(1 2 3 4 5))
(car my-list) ; 返回1
(cdr my-list) ; 返回(2 3 4 5)
;; 定义快捷键
(global-set-key (kbd "C-c h") 'hello-world)
# 主配置文件
~/.emacs
~/.emacs.d/init.el # 现代Emacs推荐
# 早期配置文件
~/.emacs.el
# 自定义目录
~/.emacs.d/ # 所有Emacs配置和扩展
# 查看配置加载顺序
M-x describe-variable user-init-file
;; ~/.emacs.d/init.el - Emacs配置文件示例
;; 禁止启动画面
(setq inhibit-startup-screen t)
;; 显示行号
(global-display-line-numbers-mode t)
;; 设置主题
(load-theme 'modus-vivendi t) ; 深色主题
;; (load-theme 'modus-operandi t) ; 浅色主题
;; 设置字体
(set-frame-font "Fira Code 12" nil t)
;; 缩进设置
(setq-default indent-tabs-mode nil) ; 使用空格而不是Tab
(setq-default tab-width 4) ; Tab宽度为4空格
(setq c-basic-offset 4) ; C语言缩进4空格
;; 备份文件设置
(setq backup-directory-alist '(("." . "~/.emacs.d/backups")))
(setq delete-old-versions t)
(setq version-control t)
(setq vc-make-backup-files t)
;; 启用自动保存
(setq auto-save-default t)
(setq auto-save-file-name-transforms '((".*" "~/.emacs.d/auto-save-list/" t)))
;; 包管理初始化
(require 'package)
(setq package-archives '(("gnu" . "https://elpa.gnu.org/packages/")
("melpa" . "https://melpa.org/packages/")))
(package-initialize)
;; 使用use-package管理包
(unless (package-installed-p 'use-package)
(package-refresh-contents)
(package-install 'use-package))
(eval-when-compile
(require 'use-package))
;; 自定义快捷键
(global-set-key (kbd "C-c c") 'compile)
(global-set-key (kbd "C-c g") 'magit-status)
(global-set-key (kbd "M-/") 'hippie-expand)
# 打开包管理器
M-x package-list-packages
# 常用操作
i # 标记安装
d # 标记删除
U # 升级所有标记的包
x # 执行操作
? # 显示帮助
/ # 搜索包
# 命令方式
M-x package-install # 安装指定包
M-x package-refresh-contents # 刷新包列表
;; 使用use-package管理扩展
;; 语法高亮
(use-package highlight-symbol
:ensure t
:hook (prog-mode . highlight-symbol-mode)
:config
(setq highlight-symbol-idle-delay 0.5))
;; 自动补全
(use-package company
:ensure t
:hook (prog-mode . company-mode)
:config
(setq company-idle-delay 0.3)
(setq company-minimum-prefix-length 2))
;; 项目管理
(use-package projectile
:ensure t
:config
(projectile-mode t)
(setq projectile-project-search-path '("~/projects/")))
;; Git集成
(use-package magit
:ensure t
:bind ("C-c g" . magit-status))
;; Org模式增强
(use-package org
:ensure t
:config
(setq org-agenda-files '("~/org/"))
(setq org-todo-keywords '((sequence "TODO" "DOING" "DONE"))))
# 打开项目
C-x C-f ~/projects/myapp/
# 编译代码
M-x compile
# 调试代码
M-x gdb
# 运行测试
M-x test-run
# 使用Org模式
M-x org-mode
# 导出为多种格式
C-c C-e # 导出菜单
# 管理待办事项
C-c a # 打开议程视图
# 表格处理
C-c | # 创建表格
# 远程文件编辑
C-x C-f /ssh:user@host:/path/file
# Shell模式
M-x shell
# 终端仿真
M-x term
# 目录浏览
M-x dired
| 扩展包 | 功能 | 安装命令 |
|---|---|---|
magit |
Git客户端,功能强大 | M-x package-install magit |
company |
代码自动补全 | M-x package-install company |
projectile |
项目管理 | M-x package-install projectile |
ivy/counsel/swiper |
补全和搜索框架 | M-x package-install ivy |
which-key |
快捷键提示 | M-x package-install which-key |
evil |
Vim模拟模式 | M-x package-install evil |
org |
Org模式增强 | M-x package-install org |
helm |
另一种补全框架 | M-x package-install helm |
| 特性 | Emacs | Vim |
|---|---|---|
| 哲学 | 一切皆可定制,编辑器操作系统 | 专注文本编辑,效率至上 |
| 扩展语言 | Emacs Lisp(图灵完备) | VimScript/Python/Lua等 |
| 学习曲线 | 陡峭,但功能全面 | 陡峭,但编辑效率高 |
| 快捷键 | Ctrl和Meta组合键 | 模式化快捷键(hjkl等) |
| 启动速度 | 较慢(尤其是加载配置后) | 非常快 |
| 内存占用 | 较高 | 较少 |
| 生态系统 | 非常丰富(邮件、新闻、日历等) | 专注于编辑,插件丰富 |
| 定制能力 | 极强(可修改几乎所有行为) | 强大,但不如Emacs彻底 |
Emacs无响应时的处理方法:
# 1. 尝试取消当前操作
C-g # 取消当前命令(多次按)
# 2. 如果C-g无效,尝试
C-x C-g # 另一种取消方式
# 3. 从另一个终端查看Emacs进程
ps aux | grep emacs
# 4. 如果以守护进程运行
emacsclient -e "(kill-emacs)" # 安全关闭
# 5. 强制终止
kill -9 [emacs进程ID]
# 6. 恢复会话
# Emacs会自动保存会话,下次启动时可恢复
# 检查~/.emacs.d/auto-save-list/目录
# 方法1:临时不加载配置启动
emacs -q # 不加载任何配置文件
emacs -Q # 不加载配置和站点初始化文件
# 方法2:测试配置
# 将配置文件重命名后启动
mv ~/.emacs.d/init.el ~/.emacs.d/init.el.bak
emacs
# 方法3:使用特定配置文件测试
emacs -q -l ~/test-config.el
# 方法4:调试配置
# 在init.el开头添加
(setq debug-on-error t) ; 启用错误调试
# 方法5:查看启动时间
emacs --timed-requires # 显示各模块加载时间
C-h i m Emacs Lisp Intro ; Emacs Lisp简介
C-h i m elisp ; Emacs Lisp参考手册
# 1. 在*scratch*缓冲区练习
# 2. 使用C-x C-e执行表达式
# 3. 查看函数文档:C-h f 函数名
# 4. 查看变量文档:C-h v 变量名
# 5. 阅读现有配置和包源码
;; 1. 使用use-package的:defer选项延迟加载
(use-package some-package
:defer t ; 延迟加载
:init ; 立即执行的配置
(setq some-variable value)
:config ; 包加载后执行的配置
(some-package-mode t))
;; 2. 使用autoload延迟加载函数
(autoload 'some-function "some-package")
;; 3. 禁用不需要的模式
(setq package-enable-at-startup nil)
;; 4. 使用Emacs守护进程模式
# 终端中:
emacs --daemon
emacsclient -c # 快速启动客户端
;; 5. 字节编译配置文件
M-x byte-compile-file ; 编译单个文件
M-x byte-recompile-directory ; 编译整个目录
;; 6. 减少初始化操作
;; 将耗时操作放到 idle-timer 中
(run-with-idle-timer 5 nil 'some-heavy-function)
C-h t(交互教程)C-h(帮助系统)探索功能emacsclientEmacs客户端
etags生成标签文件
emacs --batch批处理模式
org-mode文档/任务管理