From b6815045828e80e1e301b11b900673593d61e419 Mon Sep 17 00:00:00 2001 From: 45mg <45mg@no.mail> Date: Fri, 13 Sep 2024 10:43:26 +0000 Subject: [PATCH] fix(fold): avoid Hideshow-not-supported error Some modes are not supported by `hs-minor-mode`, but can still support some of the `+fold/` commands. For example, `pdf-outline-minor-mode` recognizes the same commands as `outline-minor-mode`, but `hs-minor-mode` is not applicable. In cases like these, we shouldn't try to enable `hs-minor-mode`, as this will produce an error that will terminate the command. --- modules/editor/fold/autoload/fold.el | 58 ++++++++++++++++------------ modules/editor/fold/config.el | 3 +- 2 files changed, 34 insertions(+), 27 deletions(-) diff --git a/modules/editor/fold/autoload/fold.el b/modules/editor/fold/autoload/fold.el index ff668d9f9..46d01338d 100644 --- a/modules/editor/fold/autoload/fold.el +++ b/modules/editor/fold/autoload/fold.el @@ -9,8 +9,16 @@ ;;; Helpers (defun +fold--ensure-hideshow-mode () - (unless (bound-and-true-p hs-minor-mode) - (hs-minor-mode +1))) + "Enable `hs-minor-mode' if not already enabled. + +Return non-nil if successful in doing so." + (if (not (bound-and-true-p hs-minor-mode)) + ;; `hs-grok-mode-type' applies this test; if it fails, it produces an + ;; error indicating that `hs-minor-mode' is not supported here. + (when (and (bound-and-true-p comment-start) + (bound-and-true-p comment-end)) + (hs-minor-mode +1)) + t)) (defun +fold--vimish-fold-p () (and (featurep 'vimish-fold) @@ -23,14 +31,14 @@ (outline-on-heading-p))) (defun +fold--hideshow-fold-p () - (+fold--ensure-hideshow-mode) - (save-excursion - (ignore-errors - (or (hs-looking-at-block-start-p) - (hs-find-block-beginning) - (unless (eolp) - (end-of-line) - (+fold--hideshow-fold-p)))))) + (when (+fold--ensure-hideshow-mode) + (save-excursion + (ignore-errors + (or (hs-looking-at-block-start-p) + (hs-find-block-beginning) + (unless (eolp) + (end-of-line) + (+fold--hideshow-fold-p))))))) ;; NOTE: does this need more? (defun +fold--ts-fold-p () @@ -186,13 +194,13 @@ Targets `vimmish-fold', `hideshow', `ts-fold' and `outline' folds." ((and (featurep 'vimish-fold) (+fold--vimish-fold-p)) (vimish-fold-unfold-all)) ((save-excursion - (+fold--ensure-hideshow-mode) + (when (+fold--ensure-hideshow-mode) + (hs-life-goes-on + (if (integerp level) + (hs-hide-level-recursive level (point-min) (point-max)) + (hs-show-all)))) (if (integerp level) - (progn - (outline-hide-sublevels (max 1 level)) - (hs-life-goes-on - (hs-hide-level-recursive level (point-min) (point-max)))) - (hs-show-all) + (outline-hide-sublevels (max 1 level)) (when (fboundp 'outline-show-all) (outline-show-all))))))) @@ -207,15 +215,15 @@ Targets `vimmish-fold', `hideshow', `ts-fold' and `outline' folds." (progn (when (featurep 'vimish-fold) (vimish-fold-refold-all)) - (+fold--ensure-hideshow-mode) - (hs-life-goes-on - (if (integerp level) - (progn - (outline--show-headings-up-to-level level) - (hs-hide-level-recursive level (point-min) (point-max))) - (hs-hide-all) - (when (fboundp 'outline-hide-sublevels) - (outline-show-only-headings)))))))) + (when (+fold--ensure-hideshow-mode) + (hs-life-goes-on + (if (integerp level) + (hs-hide-level-recursive level (point-min) (point-max)) + (hs-hide-all)))) + (if (integerp level) + (outline--show-headings-up-to-level level) + (when (fboundp 'outline-hide-sublevels) + (outline-show-only-headings))))))) ;;;###autoload (defun +fold/next (count) diff --git a/modules/editor/fold/config.el b/modules/editor/fold/config.el index 1248f4725..c063ecef7 100644 --- a/modules/editor/fold/config.el +++ b/modules/editor/fold/config.el @@ -56,8 +56,7 @@ this." (defadvice! +fold--hideshow-ensure-mode-a (&rest _) "Ensure `hs-minor-mode' is enabled when we need it, no sooner or later." :before '(hs-toggle-hiding hs-hide-block hs-hide-level hs-show-all hs-hide-all) - (unless (bound-and-true-p hs-minor-mode) - (hs-minor-mode +1))) + (+fold--ensure-hideshow-mode)) ;; extra folding support for more languages (unless (assq 't hs-special-modes-alist)