From 308ea02ba36d06e440cd50cff39818ae1273fa3c Mon Sep 17 00:00:00 2001 From: notfoundzzz Date: Mon, 9 Feb 2026 14:10:21 +0800 Subject: [PATCH 1/2] =?UTF-8?q?Revert=20"[222=5F34]=20=E6=89=93=E5=BC=80?= =?UTF-8?q?=E5=B7=B2=E6=9C=89=E6=96=87=E4=BB=B6=E6=97=B6=E5=88=A0=E9=99=A4?= =?UTF-8?q?=E6=A0=87=E9=A2=98=E6=A0=8F=E9=A2=9D=E5=A4=96=E5=87=BA=E7=8E=B0?= =?UTF-8?q?=E2=80=9C=E6=97=A0=E6=A0=87=E9=A2=98=E6=96=87=E4=BB=B6=E2=80=9D?= =?UTF-8?q?=20(#2677)"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit 90c676f0e8e3295a7fa80f02cb2a2dd81cf3f962. --- TeXmacs/progs/texmacs/texmacs/tm-files.scm | 18 ++------ devel/222_34.md | 53 ---------------------- 2 files changed, 5 insertions(+), 66 deletions(-) delete mode 100644 devel/222_34.md diff --git a/TeXmacs/progs/texmacs/texmacs/tm-files.scm b/TeXmacs/progs/texmacs/texmacs/tm-files.scm index 01028541d7..bef1ffbb55 100644 --- a/TeXmacs/progs/texmacs/texmacs/tm-files.scm +++ b/TeXmacs/progs/texmacs/texmacs/tm-files.scm @@ -548,19 +548,11 @@ ((in? :new-window opts) (open-buffer-in-window name (buffer-get name) "")) (else - ;; Remember current buffer to check if it's an unmodified scratch buffer - (let ((prev-buffer (current-buffer))) - (with wins (buffer->windows-of-tabpage name) - (if (and (!= wins '()) - (in? (current-window) wins)) - (switch-to-buffer* name) - (switch-to-buffer name))) - ;; Close the previous unmodified scratch buffer after loading new file - (when (and prev-buffer - (!= prev-buffer name) - (url-scratch? prev-buffer) - (not (buffer-modified? prev-buffer))) - (cpp-buffer-close prev-buffer))))) + (with wins (buffer->windows-of-tabpage name) + (if (and (!= wins '()) + (in? (current-window) wins)) + (switch-to-buffer* name) + (switch-to-buffer name))))) (buffer-notify-recent name) ;; Remember directory for file dialog (remember-file-dialog-directory name) diff --git a/devel/222_34.md b/devel/222_34.md deleted file mode 100644 index b3aa855b0c..0000000000 --- a/devel/222_34.md +++ /dev/null @@ -1,53 +0,0 @@ -# [222_34] 打开已有文件时删除标题栏额外出现“无标题文件” -## 如何测试 -打开任意TMU文件 -观察标题栏,不会出现“无标题文件”,只会出现打开文件的文件名 - -## 2026/01/23 -### What - -Fix :修复打开已有文件但标题栏额外出现“无标题文件[1]” - -### How -之前的修复在 load-buffer-open 函数中添加了逻辑:在打开新文件后,自动关闭之前未修改的 scratch buffer。但这个修复有一个关键缺陷: - -```scheme -(let ((prev-buffer (current-buffer))) - (cond ((in? :background opts) (noop)) ; ← 后台模式只是noop - ...) - ;; 问题:这个when块在cond之后无条件执行! - (when (and prev-buffer - (!= prev-buffer name) - (url-scratch? prev-buffer) - (not (buffer-modified? prev-buffer))) - (cpp-buffer-close prev-buffer))) -``` - -1. 当以 :background 模式加载文件时,cond 分支只执行 (noop),不切换buffer -2. 但 when 块在 cond 之后仍然会执行 -3. 这导致在后台加载时,当前正在使用的 scratch buffer 被意外关闭 -4. 用户仍在这个已关闭的buffer中操作,导致崩溃 - -正确的修复方案:关闭旧 scratch buffer 的逻辑应该只在实际发生buffer切换时执行,即放在 else 分支内部。这样在:background 和 :new-window 模式下不会触发关闭逻辑 -只有在正常切换buffer的场景下才会关闭旧的空白scratch buffer - -```scheme -(define (load-buffer-open name opts) - ;(display* "load-buffer-open " name ", " opts "\n") - (cond ((in? :background opts) (noop)) - ((in? :new-window opts) - (open-buffer-in-window name (buffer-get name) "")) - (else - (let ((prev-buffer (current-buffer))) ; ← 只在else分支记录 - (with wins (buffer->windows-of-tabpage name) - (if (and (!= wins '()) - (in? (current-window) wins)) - (switch-to-buffer* name) - (switch-to-buffer name))) - ;; 只在成功切换后才关闭旧的scratch buffer - (when (and prev-buffer - (!= prev-buffer name) - (url-scratch? prev-buffer) - (not (buffer-modified? prev-buffer))) - (cpp-buffer-close prev-buffer)))))) -``` \ No newline at end of file From 479d3016ba5fb73f05d2330a7dc74dcd95d1d697 Mon Sep 17 00:00:00 2001 From: notfoundzzz Date: Tue, 10 Feb 2026 10:15:43 +0800 Subject: [PATCH 2/2] =?UTF-8?q?[222=5F42]=20=E5=90=AF=E5=8A=A8=E6=97=B6?= =?UTF-8?q?=E9=81=BF=E5=85=8D=E5=A4=9A=E5=87=BA=E6=97=A0=E6=A0=87=E9=A2=98?= =?UTF-8?q?=E7=BC=93=E5=86=B2=E5=8C=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- TeXmacs/progs/doc/help-funcs.scm | 22 +++++++--- TeXmacs/progs/texmacs/texmacs/tm-files.scm | 50 ++++++++++++++++++++++ devel/222_42.md | 21 +++++++++ src/System/Boot/init_texmacs.cpp | 22 +++++++--- 4 files changed, 102 insertions(+), 13 deletions(-) create mode 100644 devel/222_42.md diff --git a/TeXmacs/progs/doc/help-funcs.scm b/TeXmacs/progs/doc/help-funcs.scm index 534a144f14..3d7a3d2bb5 100644 --- a/TeXmacs/progs/doc/help-funcs.scm +++ b/TeXmacs/progs/doc/help-funcs.scm @@ -138,15 +138,23 @@ (load-buffer (get-remote-planet-url))) ;; 加载Mogan欢迎页面 -(tm-define (mogan-welcome) - ;; 根据当前语言设置加载相应语言的Mogan欢迎文档 +;; 获取Mogan欢迎文档路径 +;; 返回值: 文档路径字符串 +(define (mogan-welcome-path) (let* ((lan (string-take (language-to-locale (get-output-language)) 2)) (path (string-append "$TEXMACS_PATH/doc/about/mogan/stem." lan ".tmu")) (en_doc (string-append "$TEXMACS_PATH/doc/about/mogan/stem.en.tmu"))) - ;; 优先加载本地化语言文档,如果不存在则加载英语文档 - (if (url-exists? path) - (load-buffer (system->url path)) - (load-buffer (system->url en_doc))))) + (if (url-exists? path) path en_doc))) + +(tm-define (mogan-welcome) + ;; 根据当前语言设置加载相应语言的Mogan欢迎文档 + (load-buffer (system->url (mogan-welcome-path)))) + +;; 启动时加载欢迎文档,复用当前空白缓冲区 +(tm-define (mogan-welcome-startup) + ;; @brief 启动阶段加载欢迎文档,避免多出“无标题”缓冲区。 + ;; 例:首次启动时只显示欢迎文档。 + (load-buffer-into-current (system->url (mogan-welcome-path)))) ;; 加载Xmacs星球页面 (tm-define (xmacs-planet) @@ -220,4 +228,4 @@ ((url-exists? local_lan_doc) (load-buffer local_lan_doc)) ((url-exists? lan_doc) (load-buffer lan_doc)) ((url-exists? local_en_doc) (load-buffer local_en_doc)) - (else (load-buffer en_doc))))) \ No newline at end of file + (else (load-buffer en_doc))))) diff --git a/TeXmacs/progs/texmacs/texmacs/tm-files.scm b/TeXmacs/progs/texmacs/texmacs/tm-files.scm index bef1ffbb55..c957562be9 100644 --- a/TeXmacs/progs/texmacs/texmacs/tm-files.scm +++ b/TeXmacs/progs/texmacs/texmacs/tm-files.scm @@ -617,6 +617,56 @@ (load-buffer-check-permissions name opts))))) (load-buffer-check-permissions name opts))) +(tm-define (load-buffer-into-current name . opts) + ;; @brief 启动阶段复用当前空白缓冲区加载文档,避免多出“无标题”缓冲区。 + ;; 例:双击文件启动时,当前空白缓冲区会被重命名并加载目标文档。 + (let ((cur (current-buffer))) + (if (and cur (url-scratch? cur) (not (buffer-modified? cur)) + (url-exists? name)) + (letrec + ;; @brief 复用当前缓冲区加载指定文档,保持与正常加载一致的提示行为。 + ;; 例:遇到 autosave 时仍然弹出恢复确认框。 + ((load-into-current + (lambda (target) + (let* ((doc (tree-import target (url-format target)))) + (buffer-rename cur name) + (buffer-set name doc) + (load-buffer-open name opts)))) + (load-check-permissions + (lambda () + (let* ((path (url->system name)) + (vname `(verbatim ,(utf8->cork path)))) + (cond ((and (not (url-test? name "f")) (url-exists? name)) + (with msg "The file cannot be loaded or created:" + (begin + (debug-message "debug-io" (string-append msg "\n" path)) + (notify-now `(concat ,msg "
" ,vname))))) + ((and (url-test? name "f") (not (url-test? name "r"))) + (with msg `(concat ,(translate "You do not have read access to") " " ,vname) + (show-message msg "Load file"))) + ((buffer-exists? name) + ;; 复用当前空白缓冲区前,优先切换到已打开的目标缓冲区。 + (load-buffer-open name opts) + (buffer-close cur)) + (else (load-into-current name))))))) + (if (and (autosave-propose name) (nin? :strict opts)) + (with question (if (autosave-rescue? name) + "Rescue file from crash?" + "Load more recent autosave file?") + (user-confirm question #t + (lambda (answ) + (if answ + (let* ((autosave-name (autosave-propose name)) + (format (url-format name)) + (doc (tree-import autosave-name format))) + (buffer-rename cur name) + (buffer-set name doc) + (load-buffer-open name opts) + (buffer-pretend-modified name)) + (load-check-permissions))))) + (load-check-permissions))) + (apply load-buffer-main (cons name opts))))) + (tm-define (load-buffer-main name . opts) ;;(display* "load-buffer-main " name ", " opts "\n") (if (and (not (url-exists? name)) diff --git a/devel/222_42.md b/devel/222_42.md new file mode 100644 index 0000000000..9362b72e84 --- /dev/null +++ b/devel/222_42.md @@ -0,0 +1,21 @@ +# 222_42 启动时避免多出“无标题”缓冲区 + +### 如何测试 +1. 删除 `%APPDATA%\moganlab\system\settings.scm` 后启动 + 预期:仅显示欢迎文档,不出现额外“无标题” +2. 从文件管理器用软件打开 `.tmu` 文件 + 预期:仅显示目标文件,不出现额外“无标题” +3. 无参数启动(非首次) + 预期:显示一个空白文档 + +## 2026/02/10 + +### What +- 启动时复用空白缓冲区加载欢迎文档,避免多出“无标题”缓冲区 +- 通过“打开方式”启动文件时,复用空白缓冲区加载目标文档 +- 若有启动文件参数,则不再加载欢迎文档 + +### Why +- 启动阶段必须先有可用视图,避免崩溃 +- 用户打开欢迎文档或直接打开文件时,不应额外出现“无标题”文档 + diff --git a/src/System/Boot/init_texmacs.cpp b/src/System/Boot/init_texmacs.cpp index 5099d22b1b..0edbeb576f 100644 --- a/src/System/Boot/init_texmacs.cpp +++ b/src/System/Boot/init_texmacs.cpp @@ -591,7 +591,9 @@ init_texmacs () { void load_welcome_doc () { if (DEBUG_STD) debug_boot << "Loading welcome message...\n"; - string cmd= "(mogan-welcome)"; + /// @brief 启动阶段加载欢迎文档,复用空白缓冲区以避免多出“无标题”文档。 + /// 例:首次启动时仅显示欢迎文档。 + string cmd= "(mogan-welcome-startup)"; exec_delayed (scheme_cmd (cmd)); } @@ -899,6 +901,9 @@ TeXmacs_main (int argc, char** argv) { server sv (app_type::RESEARCH); string where = ""; bool first_file= true; + /// @brief 启动时是否已有外部文件待打开(例如:双击文件或命令行传入)。 + /// 目的:若已打开文件,则不再显示欢迎文档,避免多余缓冲区。 + bool has_startup_file= false; for (i= 1; i < argc; i++) { if (argv[i] == NULL) break; string s= argv[i]; @@ -909,9 +914,10 @@ TeXmacs_main (int argc, char** argv) { if (!is_rooted (u)) u= resolve (url_pwd (), "") * u; string b= scm_quote (as_string (u)); string cmd; + has_startup_file= true; // only open window once if (first_file) { - cmd = "(load-buffer " * b * " " * where * ")"; + cmd = "(load-buffer-into-current " * b * " " * where * ")"; first_file= false; } else { @@ -929,15 +935,19 @@ TeXmacs_main (int argc, char** argv) { i++; } } - if (install_status == 1 || install_status == 2) { - load_welcome_doc (); - } - if (number_buffers () == 0) { + /// @brief 启动时确保至少有一个窗口与缓冲区可用。 + /// 例:无论打开文件或欢迎文档,都需要有效视图避免崩溃。 if (DEBUG_STD) debug_boot << "Creating 'no name' buffer...\n"; open_window (); } + /// @brief 仅在无启动文件时加载欢迎文档,避免“打开文件 + 欢迎文档”并存。 + /// 例:从文件管理器“打开方式”启动时,不应额外弹出欢迎文档。 + if ((install_status == 1 || install_status == 2) && !has_startup_file) { + load_welcome_doc (); + } + if (DEBUG_BENCH) lolly::system::bench_print (std_bench); bench_reset ("initialize texmacs"); bench_reset ("initialize plugins");