27.1.4 备份文件命名

本节所介绍的函数主要用于文档记录,你可以通过重新定义它们来自定义备份文件的命名规则。 如果修改了其中一个,通常也需要同步修改其余相关函数。

Function: backup-file-name-p filename

该函数在 filename 可能为备份文件名时返回非 nil 值。 它仅检查名称本身,不检查该文件是否实际存在。

(backup-file-name-p "foo")
     ⇒ nil
(backup-file-name-p "foo~")
     ⇒ 3

该函数的标准定义如下:

(defun backup-file-name-p (file)
  "Return non-nil if FILE is a backup file \
name (numeric or not)..."
  (string-match "~\\'" file))

可见,该函数在文件名以 ‘~’ 结尾时返回非 nil 值。 (我们使用反斜杠将文档字符串的第一行拆分为文本中的两行,但字符串本身仍为单行。)

这一简单表达式被独立为一个函数,便于重新定义以实现自定义。

Function: make-backup-file-name filename

该函数返回一个字符串,作为文件 filename 的无编号备份文件名。 在类 Unix 系统上,仅需在 filename 后追加波浪号。

大多数操作系统中,该函数的标准定义如下:

(defun make-backup-file-name (file)
  "Create the non-numeric backup file name for FILE..."
  (concat file "~"))

你可以通过重定义此函数来修改备份文件命名规则。下面示例重定义 make-backup-file-name, 使其在追加波浪号的同时在文件名前添加 ‘.’:

(defun make-backup-file-name (filename)
  (expand-file-name
    (concat "." (file-name-nondirectory filename) "~")
    (file-name-directory filename)))

(make-backup-file-name "backups.texi")
     ⇒ ".backups.texi~"

Emacs 的部分功能(包括部分 Dired 命令)假定备份文件名以 ‘~’ 结尾。 若不遵循该约定,不会导致严重问题,但这些命令的效果可能不如预期。

Function: find-backup-file-name filename

该函数计算 filename 新备份文件的文件名,同时可能提议删除部分已有备份文件。 find-backup-file-name 返回一个列表,其 CAR 为新备份文件名,CDR 为建议删除的备份文件列表。 返回值也可为 nil,表示不创建备份。

变量 kept-old-versionskept-new-versions 决定应保留的备份版本, 本函数会将这些版本排除在 CDR 列表之外。See 创建与删除编号备份文件

下例中,返回值表示新备份文件名为 ~rms/foo.~5~~rms/foo.~3~ 为多余版本,调用方可考虑删除。

(find-backup-file-name "~rms/foo")
     ⇒ ("~rms/foo.~5~" "~rms/foo.~3~")
Function: file-backup-file-names filename

该函数返回 filename 所有备份文件名的列表,若无备份则返回 nil。 文件按修改时间降序排列,最新文件排在最前。

Function: file-newest-backup filename

该函数返回 file-backup-file-names 所返回列表的第一个元素。

部分文件比较命令使用该函数,以便自动将文件与其最新备份进行对比。


emacs

Emacs

org-mode

Orgmode

Donations

打赏

Copyright

© Jasper Hsu

Creative Commons

Creative Commons

Attribute

Attribute

Noncommercial

Noncommercial

Share Alike

Share Alike