Emacs 完全指南 / 第 07 章:文件操作
第 07 章:文件操作
7.1 文件操作命令
基本文件命令
| 快捷键 | 命令 | 说明 |
|---|
C-x C-f | find-file | 打开文件 |
C-x C-s | save-buffer | 保存文件 |
C-x C-w | write-file | 另存为 |
C-x C-v | find-alternate-file | 重新打开(替换当前缓冲区) |
C-x i | insert-file | 在当前位置插入文件内容 |
C-x C-r | find-file-read-only | 以只读模式打开 |
C-x 4 f | find-file-other-window | 在其他窗口打开 |
C-x 5 f | find-file-other-frame | 在其他框架打开 |
远程文件(使用 TRAMP)
;; 直接打开远程文件
;; C-x C-f /ssh:user@host:/path/to/file RET
;; C-x C-f /sudo::/etc/hosts RET → 以 sudo 权限打开
自动保存与备份
;; 备份文件设置
(setq backup-by-copying t) ; 备份时复制(不移动)
(setq backup-directory-alist
'(("." . "~/.emacs.d/backups"))) ; 备份目录
(setq delete-old-versions t) ; 删除旧备份
(setq kept-new-versions 6) ; 保留 6 个新版本
(setq kept-old-versions 2) ; 保留 2 个旧版本
(setq version-control t) ; 使用版本号备份
;; 自动保存设置
(setq auto-save-default t)
(setq auto-save-timeout 20) ; 20 秒无操作后自动保存
(setq auto-save-interval 200) ; 每 200 次击键自动保存
(setq auto-save-file-name-transforms
`((".*" "~/.emacs.d/auto-saves/" t)))
;; 创建自动保存目录
(make-directory "~/.emacs.d/auto-saves" t)
;; 自动恢复文件
;; 启动时如果有自动保存文件,提示恢复
(setq auto-save-visited-mode nil)
;; 使用 super-save:在切换窗口或失去焦点时自动保存
(use-package super-save
:diminish super-save-mode
:config
(super-save-mode +1)
(setq super-save-auto-save-when-idle t))
7.2 Recentf(最近文件)
;; 启用最近文件记录
(recentf-mode 1)
(setq recentf-max-saved-items 200
recentf-exclude '("/tmp/"
"/ssh:"
"/sudo:"
"~/.emacs.d/elpa/"))
;; 绑定快捷键
(global-set-key (kbd "C-x C-r") 'recentf-open-files)
;; 使用 consult-recentf(更好的体验)
(use-package consult
:bind ("C-x C-r" . consult-recent-file))
7.3 Dired(文件管理器)
Dired 是 Emacs 内置的文件管理器,是直接在编辑器中管理文件的利器。
启动 Dired
| 快捷键 | 命令 | 说明 |
|---|
C-x d | dired | 打开 Dired |
C-x C-d | list-directory | 简单文件列表 |
C-x 4 d | dired-other-window | 在其他窗口打开 Dired |
Dired 导航
| 快捷键 | 说明 |
|---|
RET / f | 打开文件/进入目录 |
^ | 返回上级目录 |
j | 跳转到指定文件 |
n / p | 下/上一个文件 |
s | 切换排序方式(名称/时间) |
g | 刷新目录列表 |
+ | 创建目录 |
C-x C-f | 在当前目录新建文件 |
Dired 标记操作
Dired 的核心概念是"标记 → 执行"。
| 快捷键 | 说明 |
|---|
m / * m | 标记当前文件 |
* * | 标记所有可执行文件 |
* / | 标记所有目录 |
* . | 标记匹配扩展名的文件 |
* c | 更改标记字符 |
u | 取消当前标记 |
U / * ! | 取消所有标记 |
d | 标记删除 |
x | 执行所有标记的操作 |
% m | 正则标记 |
% d | 正则标记删除 |
Dired 文件操作
| 快捷键 | 说明 |
|---|
C | 复制文件 |
R | 重命名/移动 |
D | 立即删除 |
S | 创建符号链接 |
H | 创建硬链接 |
M | 修改权限(chmod) |
G | 修改所属组 |
O | 修改所有者 |
T | 修改时间戳 |
Z | 压缩/解压 |
Dired 操作流程
场景:批量重命名 .txt 文件为 .md 文件
1. C-x d → 进入目录
2. * . → 标记所有文件
3. % R → 正则重命名
From: \(.*\)\.txt$
To: \1.md
4. y → 确认每个替换
5. 完成
场景:删除所有临时文件
1. C-x d → 进入目录
2. % d → 正则标记删除
Regexp: \.tmp$
3. x → 执行删除
4. y → 确认
Dired 进阶配置
;; 使用 dired-x 增强
(require 'dired-x)
;; 显示隐藏文件
(setq dired-listing-switches "-alh")
;; 递归复制和删除
(setq dired-recursive-copies 'always)
(setq dired-recursive-deletes 'always)
;; 重用当前 Dired 缓冲区浏览目录
(setq dired-kill-when-opening-new-dired-buffer t)
;; 使用 dired-single(单缓冲区 Dired)
(use-package dired-single
:after dired
:bind (:map dired-mode-map
("RET" . dired-single-buffer)
("^" . dired-single-up-directory)))
;; 使用 dired-hide-details 简化视图
(add-hook 'dired-mode-hook 'dired-hide-details-mode)
;; 图标显示
(use-package all-the-icons-dired
:hook (dired-mode . all-the-icons-dired-mode))
;; dired-subtree(树状展开)
(use-package dired-subtree
:after dired
:bind (:map dired-mode-map
("<tab>" . dired-subtree-toggle)
("<backtab>" . dired-subtree-remove)))
;; wdired(可编辑的 Dired)
;; C-x C-q 进入编辑模式
;; 直接编辑文件名
;; C-c C-c 退出编辑模式并应用更改
Dired 中的 Wdired
Wdired 是 Dired 的杀手级功能:
允许在 Dired 中直接编辑文件名!
1. 在 Dired 中,C-x C-q 进入 Wdired 编辑模式
2. 所有文件名变为可编辑的文本
3. 直接修改文件名(可以使用矩形编辑、宏等所有编辑功能)
4. C-c C-c 提交更改
5. C-c C-k 取消更改
场景:批量添加前缀
1. C-x C-q(进入 Wdired)
2. C-x r t(矩形编辑)
3. 输入前缀 "backup_"
4. C-c C-c(应用)
7.4 TRAMP(远程编辑)
TRAMP(Transparent Remote Access, Multiple Protocols)是 Emacs 最独特的功能之一,允许你像编辑本地文件一样编辑远程文件。
基本用法
;; SSH 连接
C-x C-f /ssh:user@host:/path/to/file RET
;; Sudo 打开本地文件
C-x C-f /sudo::/etc/hosts RET
;; Sudo 打开远程文件
C-x C-f /ssh:user@host|sudo:host:/etc/hosts RET
;; 多跳连接
C-x C-f /ssh:hop1|ssh:hop2:/path/file RET
;; 使用不同端口
C-x C-f /ssh:user@host#2222:/path/file RET
支持的协议
| 协议 | 语法 | 说明 |
|---|
| SSH | /ssh:user@host:/path | SSH 连接 |
| SCP | /scp:user@host:/path | SCP 传输 |
| Sudo | /sudo::/path | 本地 sudo |
| Docker | /docker:container:/path | Docker 容器 |
| kubectl | /kubectl:pod:/path | Kubernetes Pod |
| SMB | /smb:user@host:/share/path | Windows 共享 |
| FTP | /ftp:user@host:/path | FTP 连接 |
TRAMP 性能优化
;; 优化 TRAMP 连接速度
(setq tramp-default-method "ssh")
(setq tramp-auto-save-directory "~/.emacs.d/tramp-autosave")
(setq tramp-chunksize 500)
;; 禁用版本控制远程文件(大幅提速)
(setq vc-ignore-dir-regexp
(format "\\(%s\\)\\|\\(%s\\)"
vc-ignore-dir-regexp
tramp-file-name-regexp))
;; 使用 ControlMaster 复用 SSH 连接
;; 在 ~/.ssh/config 中配置:
;; Host *
;; ControlMaster auto
;; ControlPath ~/.ssh/sockets/%r@%h-%p
;; ControlPersist 600
;; TRAMP 调试
;; C-h C-f /ssh:user@host:/path → 查看 TRAMP 状态
;; (setq tramp-verbose 6) → 提高日志级别
TRAMP 使用场景
场景 1:编辑服务器配置文件
C-x C-f /ssh:admin@web-server:/etc/nginx/nginx.conf RET
→ 像本地文件一样编辑
C-x C-s → 自动保存回服务器
场景 2:用 sudo 编辑系统文件
C-x C-f /sudo::/etc/hosts RET
→ 输入密码后以 root 权限编辑
场景 3:在远程服务器上运行 shell
M-x shell → 连接后自动在远程运行
场景 4:跨跳板机连接
C-x C-f /ssh:jump|ssh:internal:/app/config.yml RET
→ 自动通过跳板机连接内部服务器
场景 5:编辑 Docker 容器中的文件
C-x C-f /docker:container_name:/app/config.json RET
7.5 本章小结
| 功能 | 工具 | 核心操作 |
|---|
| 文件操作 | 内置 | C-x C-f/v/w/i |
| 最近文件 | Recentf | C-x C-r |
| 文件管理 | Dired | C-x d,标记 → 执行 |
| 批量重命名 | Wdired | C-x C-q 进入编辑模式 |
| 远程编辑 | TRAMP | /ssh:user@host:/path |
| 多跳连接 | TRAMP | /ssh:hop1|ssh:hop2:/path |
| Sudo 编辑 | TRAMP | /sudo::/path |
| 备份管理 | 内置 | backup-directory-alist |
7.6 扩展阅读
← 上一章 第 06 章:缓冲区管理 | 下一章 → 第 08 章:Org-mode 基础