diff --git a/TeXmacs/progs/texmacs/texmacs/tm-files.scm b/TeXmacs/progs/texmacs/texmacs/tm-files.scm index 3b684e62b4..a32ba57dd1 100644 --- a/TeXmacs/progs/texmacs/texmacs/tm-files.scm +++ b/TeXmacs/progs/texmacs/texmacs/tm-files.scm @@ -293,8 +293,9 @@ ;; ---- ;; doc id 只在用户明确保存时随文档持久化;打开已有文件时不会静默 ;; 写回源文件。 -(define (save-buffer-save name opts) +(define (save-buffer-save name opts . kind*) ;;(display* "save-buffer-save " name "\n") + (let ((kind (if (null? kind*) "save" (car kind*)))) (with vname `(verbatim ,(utf8->cork (url->system name))) (auto-backup-ensure-buffer-doc-id! name) (if (buffer-save name) @@ -308,8 +309,8 @@ ;; Remember directory for file dialog (remember-file-dialog-directory name) (set-message `(concat "Saved " ,vname) "Save file") - (auto-backup-buffer name "on-save") - (save-buffer-post name opts))))) + (auto-backup-buffer name kind) + (save-buffer-post name opts)))))) (define (save-buffer-check-faithful name opts) ;;(display* "save-buffer-check-faithful " name "\n") @@ -432,7 +433,7 @@ (if (and (url-scratch? name) (url-exists? name)) (system-remove name)) (buffer-rename name new-name) (buffer-pretend-modified new-name) - (save-buffer-save new-name opts)) + (save-buffer-save new-name opts "save-as")) (define (save-buffer-as-check-faithful new-name name opts) ;;(display* "save-check-as-check-faithful " new-name ", " name "\n") @@ -489,7 +490,10 @@ (with vto `(verbatim ,(url->system to)) (if (buffer-export name to fm) (set-message `(concat "Could not save " ,vto) "Export file") - (set-message `(concat "Exported to " ,vto) "Export file")))) + (begin + (set-message `(concat "Exported to " ,vto) "Export file") + (when (== fm "pdf") + (auto-backup-buffer name "export-pdf")))))) (define (export-buffer-check-permissions name to fm opts) ;;(display* "export-buffer-check-permissions " name ", " to ", " fm "\n") diff --git a/TeXmacs/progs/texmacs/texmacs/tm-print.scm b/TeXmacs/progs/texmacs/texmacs/tm-print.scm index 0e912dcb6b..8af18c0e87 100644 --- a/TeXmacs/progs/texmacs/texmacs/tm-print.scm +++ b/TeXmacs/progs/texmacs/texmacs/tm-print.scm @@ -81,6 +81,11 @@ (lambda (open?) (when open? (preview-file fname))))) +(define (auto-backup-after-pdf-export fname) + (when (and (== (url-suffix fname) "pdf") + (url-exists? fname)) + (auto-backup-buffer (current-buffer) "export-pdf"))) + (tm-define (wrapped-print-to-file fname) (system-wait "Exporting, " (translate "please wait")) (let* ((cur (current-buffer)) @@ -96,6 +101,7 @@ (remove-style-package "dark")) (print-to-file fname) (switch-to-buffer cur) + (auto-backup-after-pdf-export fname) (buffer-close buf)) (system-wait "" "") (user-confirm-open-pdf fname)) @@ -119,6 +125,7 @@ (unless (attach-doc-to-exported-pdf fname) (notify-now "Fail to attach tm to pdf")) (switch-to-buffer cur) + (auto-backup-after-pdf-export fname) (buffer-close buf)) (system-wait "" "") (user-confirm-open-pdf fname)) @@ -142,6 +149,7 @@ (unless (attach-doc-to-exported-pdf fname) (notify-now "Fail to attach tmu to pdf")) (switch-to-buffer cur) + (auto-backup-after-pdf-export fname) (buffer-close buf)) (system-wait "" "") (user-confirm-open-pdf fname)) diff --git a/devel/200_62.md b/devel/200_62.md new file mode 100644 index 0000000000..29cc2a7cd6 --- /dev/null +++ b/devel/200_62.md @@ -0,0 +1,43 @@ +# [200_62] 保存/另存为/导出PDF 触发自动备份的 copy 动作 + +## 如何测试 + +1. 准备一个可正常保存的 TeXmacs 文档,修改内容后执行保存。 + - 预期:自动备份目录中生成源文档的备份文件。 + - 预期:manifest 中该文档最新版本的 `kind` 为 `save`。 + +2. 对同一文档做出部分修改,执行另存为。 + - 预期:自动备份目录中生成新文件对应的备份文件。 + - 预期:manifest 中文档最新版本的 `kind` 为 `save-as`。 + +3. 对同一文档做出部分修改,执行 PDF 导出。 + - 预期:PDF 文件正常生成。 + - 预期:自动备份目录中生成的是源文档的备份文件,不是 PDF 文件。 + - 预期:manifest 中该文档最新版本的 `kind` 为 `export-pdf`。 + +4. 重复保存或重复导出未修改的文档。 + - 预期:复用既有 md5 去重逻辑,不产生内容相同的重复 version。 + +## 2026/05/07 保存/另存为/导出PDF 触发自动备份的 copy 动作 + +### What + +在保存、另存为、PDF 导出成功后主动调用现有 `auto-backup-buffer`: + +- 保存成功后调用 `(auto-backup-buffer name "save")`。 +- 另存为成功后调用 `(auto-backup-buffer new-name "save-as")`。 +- PDF 导出成功后调用 `(auto-backup-buffer (current-buffer) "export-pdf")`,备份源文档 buffer,不备份导出的 PDF 文件。 + +### Why + +自动备份原先主要由打开、周期、手动恢复等路径触发。用户完成保存、另存为或 PDF 导出后,文档已经处在一个明确的成功操作边界,此时主动生成一次备份,可以把用户认为重要的版本纳入本地备份历史。 + +触发点必须放在操作成功之后,避免失败保存或失败导出污染备份历史;同时要复用已有 manifest、md5 去重和 retention 逻辑,避免引入新的备份存储分支。 + +### How + +- `save-buffer-save` 增加可选 `kind` 参数,默认值为 `save`。普通保存沿用同一个成功分支,只把原来的 `"on-save"` 改为 `"save"`。 +- 另存为流程在 `save-buffer-as-save` 中完成 `buffer-rename` 后调用 `save-buffer-save`,并显式传入 `"save-as"`,避免保存和另存为共用内部函数时生成两次备份或记录错误 kind。 +- `export-buffer-export` 在 `buffer-export` 成功返回后,如果导出格式为 `pdf`,对源 `name` 调用 `"export-pdf"` 备份。 +- `wrapped-print-to-file` 及嵌入文档的 PDF 导出包装函数在临时 buffer 打印完成后切回 `cur`,确认目标 PDF 已存在,再调用 `"export-pdf"`。这样备份对象是源文档 buffer,不是临时 buffer,也不是 PDF 文件。 +- 未修改云插件上传逻辑,未新增 UI。`auto-backup-buffer` 后续仍走现有 manifest、md5 去重和 retention 逻辑。