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 基础