linux emacs命令

简介: GNU Emacs是一个功能强大的可扩展文本编辑器,也是一个完整的集成开发环境(IDE)。它使用Emacs Lisp作为扩展语言,具有极高的可定制性。
高度可扩展

Emacs Lisp扩展

完整IDE

集成开发环境

强大快捷键

高效键盘操作

多功能

邮件、新闻、日历

命令语法

emacs [选项] [文件...]
emacs [选项] [目录]
emacs [选项] --eval "表达式"
提示: Emacs中的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 设置窗口几何尺寸

Emacs界面组件

Emacs编辑器界面结构
┌─────────────────────────────────────────────────────────────┐
│ 菜单栏 (可隐藏)                                              │
├─────────────────────────────────────────────────────────────┤
│ *scratch*                文件编辑区域                         │
│ 这是Emacs的草稿缓冲区,用于临时编辑和测试Emacs Lisp代码。     │
│                                                            │
│ 可以在这里输入任意文本,或者执行Emacs Lisp表达式。           │
│                                                            │
│                                                            │
│                                                            │
│                                                            │
│                                                            │
├─────────────────────────────────────────────────────────────┤
│ L1 (Fundamental)        模式行 (显示当前模式和状态)          │
├─────────────────────────────────────────────────────────────┤
│ For information about GNU Emacs...  回显区域/迷你缓冲区      │
└─────────────────────────────────────────────────────────────┘
菜单栏 图形界面下的菜单,可以通过M-x menu-bar-mode切换显示
编辑区域 主要的文本编辑区域,可以同时打开多个缓冲区
模式行 显示当前缓冲区信息:文件名、模式、编码、行号等
回显区域/迷你缓冲区 显示消息和用于命令输入的区域

基本操作

1. 启动和退出

# 启动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(终端中)

2. 文件操作

操作 快捷键 说明
打开文件 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 切换只读模式

3. 光标移动

基本移动
C-f向前移动一个字符
C-b向后移动一个字符
C-n向下移动一行
C-p向上移动一行
M-f向前移动一个单词
M-b向后移动一个单词
C-a移动到行首
C-e移动到行尾
M-<移动到缓冲区开头
高级移动
M->移动到缓冲区末尾
C-v向下翻页
M-v向上翻页
M-g gM-g M-g跳转到指定行
C-l重绘屏幕,光标居中
M-x goto-char跳转到指定字符位置
M-x goto-line跳转到指定行
C-s向前搜索
C-r向后搜索

4. 文本编辑

操作 快捷键 说明
删除字符 DeleteC-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 交换标记和光标位置

缓冲区、窗口和框架

1. 缓冲区操作

# 缓冲区列表
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*   # 自动补全缓冲区

2. 窗口操作

# 窗口分割
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         # 向上滚动其他窗口

3. 框架操作(图形界面)

# 框架(窗口)管理
C-x 5 2         # 新建框架
C-x 5 0         # 关闭当前框架
C-x 5 o         # 切换到其他框架
C-x 5 1         # 关闭其他框架

# 多显示器
C-x 5 r         # 将缓冲区移动到右侧框架
C-x 5 b         # 在其他框架中显示缓冲区

搜索和替换

1. 基本搜索

# 增量搜索
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       # 向后单词搜索

2. 正则表达式搜索

# 正则表达式搜索
C-M-s           # 向前正则表达式搜索
C-M-r           # 向后正则表达式搜索

# 常用正则表达式符号
.               # 任意单个字符
.*              # 零个或多个任意字符
^               # 行首
$               # 行尾
[]              # 字符集
[^]             # 不在字符集中的字符
\               # 转义字符
\|              # 或
\( \)           # 分组
\1, \2...       # 引用分组

3. 替换操作

# 交互式替换
M-%             # 查询替换
                 # 选项: y替换, n跳过, !全部替换, q退出
                 # .替换并退出, ,替换但不移动

# 正则表达式替换
C-M-%           # 正则表达式替换

# 无条件替换
M-x replace-string        # 替换字符串
M-x replace-regexp        # 替换正则表达式

# 在区域内替换
C-x h           # 选择整个缓冲区
M-%             # 然后在区域内替换

模式(Modes)

模式类型 说明 示例
主模式 每个缓冲区有一个主模式,决定缓冲区的基本行为 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                    # 显示当前启用的模式及其文档

Emacs Lisp基础

1. 执行Elisp代码

# 在迷你缓冲区执行单行表达式
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 # 加载库

2. 基本语法示例

;; 注释以分号开始

;; 变量定义
(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

1. 配置文件位置

# 主配置文件
~/.emacs
~/.emacs.d/init.el  # 现代Emacs推荐

# 早期配置文件
~/.emacs.el

# 自定义目录
~/.emacs.d/          # 所有Emacs配置和扩展

# 查看配置加载顺序
M-x describe-variable user-init-file

2. 基本配置示例

;; ~/.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)

包管理

1. 内置包管理器

# 打开包管理器
M-x package-list-packages

# 常用操作
i               # 标记安装
d               # 标记删除
U               # 升级所有标记的包
x               # 执行操作
?               # 显示帮助
/               # 搜索包

# 命令方式
M-x package-install    # 安装指定包
M-x package-refresh-contents  # 刷新包列表

2. use-package配置示例

;; 使用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"))))

实际应用场景

场景1:编程开发
# 打开项目
C-x C-f ~/projects/myapp/

# 编译代码
M-x compile

# 调试代码
M-x gdb

# 运行测试
M-x test-run
场景2:文档写作
# 使用Org模式
M-x org-mode

# 导出为多种格式
C-c C-e     # 导出菜单

# 管理待办事项
C-c a       # 打开议程视图

# 表格处理
C-c |       # 创建表格
场景3:系统管理
# 远程文件编辑
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 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   # 显示各模块加载时间

  1. 内置教程
    C-h i m Emacs Lisp Intro  ; Emacs Lisp简介
    C-h i m elisp            ; Emacs Lisp参考手册
  2. 在线资源
    • GNU Emacs Lisp参考手册
    • Emacs Lisp编程入门
    • Elisp Cookbook
  3. 实践方法
    # 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)

学习路径建议

第1周

基础操作
  • ✓ 启动/退出
  • ✓ 文件操作
  • ✓ 光标移动
  • ✓ 基本编辑

第2-3周

核心功能
  • ✓ 缓冲区/窗口
  • ✓ 搜索替换
  • ✓ 模式使用
  • ✓ 快捷键记忆

第4-8周

高级功能
  • ✓ 包管理
  • ✓ 配置定制
  • ✓ 扩展安装
  • ✓ 专用模式

长期

精通定制
  • ✓ Emacs Lisp
  • ✓ 自定义扩展
  • ✓ 工作流优化
  • ✓ 社区参与
学习建议:
  • 从内置教程开始:C-h t(交互教程)
  • 使用C-h(帮助系统)探索功能
  • 渐进式学习,每周掌握几个新命令
  • 参与Emacs社区(邮件列表、Reddit、Stack Exchange)
  • 阅读其他用户的配置获取灵感

相关命令和工具

emacsclient

Emacs客户端

etags

生成标签文件

emacs --batch

批处理模式

org-mode

文档/任务管理