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

Emacs 完全指南 / 第 15 章:终端模拟

第 15 章:终端模拟

15.1 终端方案概览

Emacs 内置多种终端方案,适用于不同场景。

方案对比

方案类型颜色速度完整性说明
EshellEmacs Shell纯 Elisp 实现
ShellShell Mode调用系统 shell
TermTerm Mode终端模拟器
Vtermvterm-mode极高基于 libvterm
Eateat-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-dEOF
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 对比

特性VtermEshell
终端完整性完整部分
性能快(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 本章小结

方案启动命令适用场景
EshellM-x eshellEmacs 深度集成、跨平台
ShellM-x shell简单命令、脚本运行
VtermM-x vterm完整终端、全屏程序
EatM-x eat轻量终端、无编译依赖

15.8 扩展阅读


← 上一章 第 14 章:Git 集成 | 下一章 → 第 16 章:界面定制