可以使用 append-to-file 和 write-region 函数,将缓冲区或缓冲区部分内容直接写入磁盘文件。请勿使用这些函数写入正被访问的文件,否则可能导致文件访问机制出现混乱。
该函数将当前缓冲区中由 start 和 end 限定的区域内容追加到文件 filename 末尾。若文件不存在,则自动创建。函数返回 nil。
若无法写入或创建 filename,则抛出错误。
从 Lisp 调用时,该函数完全等价于:
(write-region start end filename t)
该函数将当前缓冲区中由 start 和 end 限定的区域内容写入文件 filename。
若 start 为 nil,则命令将整个缓冲区内容(并非仅可访问部分)写入文件,并忽略 end。
若 start 为字符串,则 write-region 直接写入或追加该字符串,而非缓冲区文本,此时忽略 end。
若 append 非 nil,则将指定文本追加到现有文件内容(若存在)之后。若 append 为数字,write-region 会从文件开头偏移该数字对应的字节位置开始写入数据。
若 mustbenew 非 nil,当 filename 已存在时,write-region 会要求用户确认。若 mustbenew 为符号 excl,则不询问确认,而是在文件已存在时抛出 file-already-exists 错误。通常 write-region 会跟随符号链接,并在符号链接悬空时创建指向的目标文件;但当 mustbenew 为 excl 时,不会跟随符号链接。
当 mustbenew 为 excl 时,对文件是否存在的检测使用系统专用特性。至少对本地磁盘文件而言,不会出现其他程序在 Emacs 之前创建同名文件而 Emacs 无法察觉的情况。
若 visit 为 t,Emacs 会在当前缓冲区与该文件之间建立关联,即缓冲区开始访问此文件。同时会将当前缓冲区的上次文件修改时间设为 filename 的修改时间,并将缓冲区标记为未修改。该功能由 save-buffer 使用,一般不建议自行调用。
若 visit 为字符串,则指定要关联的文件名。这样可以将数据写入文件 filename,同时记录缓冲区访问的是另一个文件 visit。参数 visit 会用于回显区提示信息与文件加锁,并保存在 buffer-file-name 中。该功能用于实现 file-precious-flag,除非完全明确其用途,否则请勿自行使用。
可选参数 lockname 若非 nil,则指定用于文件加锁与解锁的文件名,覆盖 filename 与 visit 的相关设置。
write-region 函数会根据 buffer-file-format 指定的格式转换待写入数据,并调用 write-region-annotate-functions 列表中的函数。See 文件格式转换。
默认情况下,write-region 会在回显区显示 ‘Wrote filename’ 信息。若 visit 既非 t、非 nil 也非字符串,或 Emacs 运行在批处理模式下(see Batch Mode),则不显示该信息。该特性适用于程序内部使用、无需用户知晓的文件操作。
若该变量值为 nil,write-region 在写入文件后会调用 fsync 系统调用。若值为 t,则不使用 fsync。默认值为 t。See 文件与辅助存储。
宏 with-temp-file 使用临时缓冲区作为当前缓冲区执行 body 中的表达式;执行完毕后,将缓冲区内容写入文件 file。完成后销毁临时缓冲区,并恢复执行 with-temp-file 之前的当前缓冲区。最终返回 body 中最后一个表达式的值。
即使通过 throw 或错误异常退出(see 非局部退出),当前缓冲区也会被正确恢复。
与 with-temp-buffer(see Current Buffer)类似,该宏使用的临时缓冲区不会运行钩子 kill-buffer-hook、kill-buffer-query-functions(see Killing Buffers)以及 buffer-list-update-hook(see The Buffer List)。