26.4 写入文件

可以使用 append-to-filewrite-region 函数,将缓冲区或缓冲区部分内容直接写入磁盘文件。请勿使用这些函数写入正被访问的文件,否则可能导致文件访问机制出现混乱。

Command: append-to-file start end filename

该函数将当前缓冲区中由 startend 限定的区域内容追加到文件 filename 末尾。若文件不存在,则自动创建。函数返回 nil

若无法写入或创建 filename,则抛出错误。

从 Lisp 调用时,该函数完全等价于:

(write-region start end filename t)
Command: write-region start end filename &optional append visit lockname mustbenew

该函数将当前缓冲区中由 startend 限定的区域内容写入文件 filename

startnil,则命令将整个缓冲区内容(并非仅可访问部分)写入文件,并忽略 end

start 为字符串,则 write-region 直接写入或追加该字符串,而非缓冲区文本,此时忽略 end

appendnil,则将指定文本追加到现有文件内容(若存在)之后。若 append 为数字,write-region 会从文件开头偏移该数字对应的字节位置开始写入数据。

mustbenewnil,当 filename 已存在时,write-region 会要求用户确认。若 mustbenew 为符号 excl,则不询问确认,而是在文件已存在时抛出 file-already-exists 错误。通常 write-region 会跟随符号链接,并在符号链接悬空时创建指向的目标文件;但当 mustbenewexcl 时,不会跟随符号链接。

mustbenewexcl 时,对文件是否存在的检测使用系统专用特性。至少对本地磁盘文件而言,不会出现其他程序在 Emacs 之前创建同名文件而 Emacs 无法察觉的情况。

visitt,Emacs 会在当前缓冲区与该文件之间建立关联,即缓冲区开始访问此文件。同时会将当前缓冲区的上次文件修改时间设为 filename 的修改时间,并将缓冲区标记为未修改。该功能由 save-buffer 使用,一般不建议自行调用。

visit 为字符串,则指定要关联的文件名。这样可以将数据写入文件 filename,同时记录缓冲区访问的是另一个文件 visit。参数 visit 会用于回显区提示信息与文件加锁,并保存在 buffer-file-name 中。该功能用于实现 file-precious-flag,除非完全明确其用途,否则请勿自行使用。

可选参数 lockname 若非 nil,则指定用于文件加锁与解锁的文件名,覆盖 filenamevisit 的相关设置。

write-region 函数会根据 buffer-file-format 指定的格式转换待写入数据,并调用 write-region-annotate-functions 列表中的函数。See 文件格式转换

默认情况下,write-region 会在回显区显示 ‘Wrote filename’ 信息。若 visit 既非 t、非 nil 也非字符串,或 Emacs 运行在批处理模式下(see Batch Mode),则不显示该信息。该特性适用于程序内部使用、无需用户知晓的文件操作。

Variable: write-region-inhibit-fsync

若该变量值为 nilwrite-region 在写入文件后会调用 fsync 系统调用。若值为 t,则不使用 fsync。默认值为 t。See 文件与辅助存储

Macro: with-temp-file file body…

with-temp-file 使用临时缓冲区作为当前缓冲区执行 body 中的表达式;执行完毕后,将缓冲区内容写入文件 file。完成后销毁临时缓冲区,并恢复执行 with-temp-file 之前的当前缓冲区。最终返回 body 中最后一个表达式的值。

即使通过 throw 或错误异常退出(see 非局部退出),当前缓冲区也会被正确恢复。

with-temp-buffer(see Current Buffer)类似,该宏使用的临时缓冲区不会运行钩子 kill-buffer-hookkill-buffer-query-functions(see Killing Buffers)以及 buffer-list-update-hook(see The Buffer List)。


emacs

Emacs

org-mode

Orgmode

Donations

打赏

Copyright

© Jasper Hsu

Creative Commons

Creative Commons

Attribute

Attribute

Noncommercial

Noncommercial

Share Alike

Share Alike