强曰为道

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

第 07 章:文件操作

第 07 章:文件操作

7.1 文件操作命令

基本文件命令

快捷键命令说明
C-x C-ffind-file打开文件
C-x C-ssave-buffer保存文件
C-x C-wwrite-file另存为
C-x C-vfind-alternate-file重新打开(替换当前缓冲区)
C-x iinsert-file在当前位置插入文件内容
C-x C-rfind-file-read-only以只读模式打开
C-x 4 ffind-file-other-window在其他窗口打开
C-x 5 ffind-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 ddired打开 Dired
C-x C-dlist-directory简单文件列表
C-x 4 ddired-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:/pathSSH 连接
SCP/scp:user@host:/pathSCP 传输
Sudo/sudo::/path本地 sudo
Docker/docker:container:/pathDocker 容器
kubectl/kubectl:pod:/pathKubernetes Pod
SMB/smb:user@host:/share/pathWindows 共享
FTP/ftp:user@host:/pathFTP 连接

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
最近文件RecentfC-x C-r
文件管理DiredC-x d,标记 → 执行
批量重命名WdiredC-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 基础