Emacs 完全指南 / 第 15 章:终端模拟
第 15 章:终端模拟
15.1 终端方案概览
Emacs 内置多种终端方案,适用于不同场景。
方案对比
| 方案 | 类型 | 颜色 | 速度 | 完整性 | 说明 |
|---|---|---|---|---|---|
| Eshell | Emacs Shell | 是 | 快 | 中 | 纯 Elisp 实现 |
| Shell | Shell Mode | 是 | 中 | 中 | 调用系统 shell |
| Term | Term Mode | 是 | 中 | 高 | 终端模拟器 |
| Vterm | vterm-mode | 是 | 快 | 极高 | 基于 libvterm |
| Eat | eat-mode | 是 | 快 | 高 | 新一代终端 |
选择建议
你需要完整的终端模拟?
├── 是 → Vterm 或 Eat
└── 否 → 你主要运行简单命令?
├── 是 → Eshell 或 Shell
└── 否 → Term
15.2 Eshell
Eshell 是 Emacs 原生的 shell,用 Elisp 实现,跨平台一致性最好。
启动与基本使用
;; 启动 Eshell
M-x eshell
;; 绑定快捷键
(global-set-key (kbd "C-c e") 'eshell)
基本命令
# 文件操作(使用 Emacs 语法或 Unix 语法)
ls -la # 列出文件
cp file1 file2 # 复制
mv file1 file2 # 移动
rm file # 删除
mkdir dir # 创建目录
cat file # 查看文件
pwd # 当前目录
# Emacs 特有命令
find-file file.txt # 在 Emacs 中打开文件
dired . # 在 Dired 中打开当前目录
magit-status # 打开 Magit
kill-buffer *scratch* # 关闭缓冲区
list-buffers # 列出缓冲区
# 管道和重定向
cat file | grep "pattern" > output.txt
ls | sort | unique # Eshell 内置的 sort 和 unique
Eshell 特性
# 变量
echo $PATH
export MY_VAR="hello"
# 通配符
ls *.py
ls **/*.py # 递归通配符
# 历史
!! # 上一条命令
!grep # 最近以 grep 开头的命令
!$ # 上一条命令的最后一个参数
# 目录栈
cd - # 回到上一个目录
dirs # 显示目录栈
pushd dir # 压入目录
popd # 弹出目录
# 进程管理
jobs # 列出后台进程
bg # 后台运行
fg # 前台运行
Eshell 配置
;; Eshell 配置
(use-package eshell
:config
(setq eshell-history-size 10000
eshell-hist-ignoredups t
eshell-cmpl-ignore-case t
eshell-scroll-to-bottom-on-input t))
;; Eshell 提示符自定义
(setq eshell-prompt-function
(lambda ()
(concat (abbreviate-file-name (eshell/pwd))
(if (magit-get-current-branch)
(concat " [" (magit-get-current-branch) "]")
"")
"\n$ ")))
(setq eshell-prompt-regexp "^[^$]*[$] ")
;; Eshell 插件
(use-package eshell-syntax-highlighting
:after eshell
:config
(eshell-syntax-highlighting-global-mode 1))
15.3 Shell Mode
Shell Mode 是 Emacs 调用系统 shell(bash/zsh 等)的方式。
;; 启动
M-x shell
;; 快捷键
(global-set-key (kbd "C-c s") 'shell)
Shell Mode 操作
| 快捷键 | 说明 |
|---|---|
RET | 发送当前行 |
C-c C-c | 中断当前进程 (SIGINT) |
C-c C-z | 挂起当前进程 (SIGTSTP) |
C-c C-d | 发送 EOF |
C-c C-p | 上一条输出 |
C-c C-n | 下一条输出 |
M-p / M-n | 命令历史 |
Shell Mode 限制
⚠️ Shell Mode 的已知限制:
1. 有些命令的输出格式不正确(如 top, htop)
2. 全屏程序(如 vim)不能正常运行
3. 颜色支持有时有问题
4. Tab 补全可能与 Emacs 补全冲突
解决方案:
- 简单命令 → Shell Mode
- 复杂交互 → Vterm
15.4 Vterm(推荐)
Vterm 是基于 libvterm 的完整终端模拟器,是目前最好的终端方案。
安装
# 系统依赖
# Ubuntu/Debian
sudo apt install cmake libvterm-dev
# macOS
brew install cmake libvterm
# Arch Linux
sudo pacman -S cmake libvterm
(use-package vterm
:bind ("C-c v" . vterm)
:config
(setq vterm-max-scrollback 10000
vterm-buffer-name-string "vterm: %s"
vterm-always-compile-module t))
;; 多 vterm 实例
(use-package multi-vterm
:bind ("C-c V" . multi-vterm))
Vterm 操作
| 快捷键 | 说明 |
|---|---|
C-c C-c | 中断 |
C-c C-d | EOF |
C-c C-z | 挂起 |
C-c C-e | 发送 escape |
C-c C-t | 发送任意按键 |
C-c C-n / C-c C-p | 下/上一条输出 |
C-c C-q | 进入粘贴模式(发送特殊字符) |
C-c C-x | 切换到 Emacs 按键模式 |
Vterm 与 Eshell 对比
| 特性 | Vterm | Eshell |
|---|---|---|
| 终端完整性 | 完整 | 部分 |
| 性能 | 快(C 实现) | 中(Elisp) |
| 全屏程序 | 支持 | 不支持 |
| 跨平台 | 需编译 | 原生 |
| Emacs 集成 | 中 | 极高 |
| 可编程性 | 低 | 高 |
15.5 Eat(新选择)
;; Eat - Emacs 的另一个终端模拟器
;; 基于 Elisp 实现,无需编译
(use-package eat
:config
;; 通过 eshell 使用
(add-hook 'eshell-load-hook #'eat-eshell-mode)
(add-hook 'eshell-load-hook #'eat-eshell-visual-command-mode))
15.6 终端中的复制粘贴
;; Vterm 中的复制粘贴
;; 方法 1:进入复制模式
;; C-c C-t → 进入复制模式,可以用 Emacs 的方式选择和复制
;; C-c C-y → 粘贴 kill-ring 内容
;; 方法 2:鼠标选择
;; 鼠标选择文本后自动复制
;; Eshell 中的复制粘贴
;; 直接使用 C-w / M-w / C-y(与 Emacs 一致)
15.7 本章小结
| 方案 | 启动命令 | 适用场景 |
|---|---|---|
| Eshell | M-x eshell | Emacs 深度集成、跨平台 |
| Shell | M-x shell | 简单命令、脚本运行 |
| Vterm | M-x vterm | 完整终端、全屏程序 |
| Eat | M-x eat | 轻量终端、无编译依赖 |
15.8 扩展阅读
← 上一章 第 14 章:Git 集成 | 下一章 → 第 16 章:界面定制