diff --git a/md-ts-mode.el b/md-ts-mode.el index eb990d2..e970d27 100644 --- a/md-ts-mode.el +++ b/md-ts-mode.el @@ -1242,7 +1242,9 @@ VALUE non-nil hides markup, nil shows it." ;;;###autoload (defun md-ts-mode-maybe () - "Enable `md-ts-mode' when its grammar is available." + "Enable `md-ts-mode' when its grammar is available. +This helper is for explicit user configuration; loading the bundled +mode does not register global Markdown file associations or remaps." (declare-function treesit-language-available-p "treesit.c") (if (or (treesit-language-available-p 'markdown) (eq treesit-enabled-modes t) @@ -1250,12 +1252,5 @@ VALUE non-nil hides markup, nil shows it." (md-ts-mode) (fundamental-mode))) -;;;###autoload -(add-to-list 'auto-mode-alist '("\\.md\\'" . md-ts-mode-maybe)) -;;;###autoload -(when (boundp 'treesit-major-mode-remap-alist) - (add-to-list 'treesit-major-mode-remap-alist - '(markdown-mode . md-ts-mode))) - (provide 'md-ts-mode) ;;; md-ts-mode.el ends here diff --git a/test/pi-coding-agent-test-common.el b/test/pi-coding-agent-test-common.el index a2d1867..b8c1ade 100644 --- a/test/pi-coding-agent-test-common.el +++ b/test/pi-coding-agent-test-common.el @@ -38,6 +38,33 @@ previous 90s timeout gave only 38%% margin; 180s gives ~177%%.") "Format SECONDS as a human-readable duration with millisecond precision." (format "%.3fs" (float seconds))) +;;;; Batch Emacs Helpers + +(defun pi-coding-agent-test--read-batch-emacs-result (expression) + "Evaluate EXPRESSION in a fresh batch Emacs and read its printed result. +Initializes packages, then re-prepends the current project root to +`load-path' so the checkout under test wins over any installed copy." + (let* ((emacs (expand-file-name invocation-name invocation-directory)) + (repo-root (file-name-directory (locate-library "pi-coding-agent"))) + (output-buffer (generate-new-buffer " *pi-coding-agent-batch-emacs*")) + (exit-code (call-process emacs nil output-buffer nil + "--batch" "-Q" "-L" repo-root + "--eval" "(require 'package)" + "--eval" "(package-initialize)" + "--eval" "(setq load-prefer-newer t)" + "--eval" + (format "(setq load-path (cons %S load-path))" + repo-root) + "--eval" expression))) + (unwind-protect + (progn + (unless (eq 0 exit-code) + (error "Batch Emacs exited with %s" exit-code)) + (with-current-buffer output-buffer + (goto-char (point-min)) + (read (current-buffer)))) + (kill-buffer output-buffer)))) + ;;;; Waiting Helpers (defun pi-coding-agent-test-wait-until (predicate &optional timeout poll-interval process) diff --git a/test/pi-coding-agent-test.el b/test/pi-coding-agent-test.el index e45928e..73215d2 100644 --- a/test/pi-coding-agent-test.el +++ b/test/pi-coding-agent-test.el @@ -523,5 +523,61 @@ must decide whether this is a no-op." (ignore-errors (kill-buffer "*pi-coding-agent-test-non-pi*")) (delete-other-windows))))) +(ert-deftest pi-coding-agent-test-vendored-md-ts-mode-leaves-global-markdown-settings-alone () + "Loading vendored `md-ts-mode' keeps Markdown associations opt-in." + (let* ((expression + (mapconcat + #'identity + '("(progn" + " (defvar treesit-major-mode-remap-alist nil)" + " (let ((before-auto (copy-tree auto-mode-alist))" + " (before-remap (copy-tree treesit-major-mode-remap-alist)))" + " (require 'md-ts-mode)" + " (prin1 (list" + " :auto-unchanged (equal before-auto auto-mode-alist)" + " :remap-unchanged (equal before-remap treesit-major-mode-remap-alist)" + " :md-mode-defined (fboundp 'md-ts-mode)" + " :md-mode-maybe-defined (fboundp 'md-ts-mode-maybe)" + " :before-md-association (assoc \"\\.md\\'\" before-auto)" + " :after-md-association (assoc \"\\.md\\'\" auto-mode-alist)" + " :before-markdown-remap (alist-get 'markdown-mode before-remap)" + " :after-markdown-remap (alist-get 'markdown-mode treesit-major-mode-remap-alist)))))") + " ")) + (result (pi-coding-agent-test--read-batch-emacs-result expression))) + (should (eq t (plist-get result :auto-unchanged))) + (should (eq t (plist-get result :remap-unchanged))) + (should (eq t (plist-get result :md-mode-defined))) + (should (eq t (plist-get result :md-mode-maybe-defined))) + (should (equal (plist-get result :before-md-association) + (plist-get result :after-md-association))) + (should (equal (plist-get result :before-markdown-remap) + (plist-get result :after-markdown-remap))))) + +(ert-deftest pi-coding-agent-test-package-load-leaves-global-markdown-settings-alone () + "Loading `pi-coding-agent' does not change global Markdown mode settings." + (let* ((expression + (mapconcat + #'identity + '("(progn" + " (defvar treesit-major-mode-remap-alist nil)" + " (let ((before-auto (copy-tree auto-mode-alist))" + " (before-remap (copy-tree treesit-major-mode-remap-alist)))" + " (require 'pi-coding-agent)" + " (prin1 (list" + " :auto-unchanged (equal before-auto auto-mode-alist)" + " :remap-unchanged (equal before-remap treesit-major-mode-remap-alist)" + " :before-md-association (assoc \"\\.md\\'\" before-auto)" + " :after-md-association (assoc \"\\.md\\'\" auto-mode-alist)" + " :before-markdown-remap (alist-get 'markdown-mode before-remap)" + " :after-markdown-remap (alist-get 'markdown-mode treesit-major-mode-remap-alist)))))") + " ")) + (result (pi-coding-agent-test--read-batch-emacs-result expression))) + (should (eq t (plist-get result :auto-unchanged))) + (should (eq t (plist-get result :remap-unchanged))) + (should (equal (plist-get result :before-md-association) + (plist-get result :after-md-association))) + (should (equal (plist-get result :before-markdown-remap) + (plist-get result :after-markdown-remap))))) + (provide 'pi-coding-agent-test) ;;; pi-coding-agent-test.el ends here