aboutsummaryrefslogtreecommitdiff
path: root/compat-27.el
diff options
context:
space:
mode:
authorDaniel Mendler <mail@daniel-mendler.de>2023-01-21 12:57:51 +0100
committerDaniel Mendler <mail@daniel-mendler.de>2023-01-21 12:58:04 +0100
commit2f3813bf78ec129119b86076e7d43f0a30e4eb39 (patch)
tree07a5c7f9262c0a3016eeae458d1694e73e3ce4d2 /compat-27.el
parentef2ec232b8cbaa942ab6bcdd7887fc7cf5ef429a (diff)
compat-27: Add major-mode-suspend and major-mode-restore
Diffstat (limited to 'compat-27.el')
-rw-r--r--compat-27.el31
1 files changed, 31 insertions, 0 deletions
diff --git a/compat-27.el b/compat-27.el
index 01af37d..6f940ce 100644
--- a/compat-27.el
+++ b/compat-27.el
@@ -280,6 +280,37 @@ return nil."
(setq tail tail-cdr))))
alist)
+(compat-defvar major-mode--suspended nil ;; <compat-tests:major-mode-suspend>
+ "Suspended major mode."
+ :local permanent)
+
+(compat-defun major-mode-suspend () ;; <compat-tests:major-mode-suspend>
+ "Exit current major mode, remembering it."
+ (let* ((prev-major-mode (or major-mode--suspended
+ (unless (eq major-mode 'fundamental-mode)
+ major-mode))))
+ (kill-all-local-variables)
+ (setq-local major-mode--suspended prev-major-mode)))
+
+(compat-defun major-mode-restore (&optional avoided-modes) ;; <compat-tests:major-mode-suspend>
+ "Restore major mode earlier suspended with `major-mode-suspend'.
+If there was no earlier suspended major mode, then fallback to `normal-mode',
+though trying to avoid AVOIDED-MODES."
+ (if major-mode--suspended
+ (funcall (prog1 major-mode--suspended
+ (kill-local-variable 'major-mode--suspended)))
+ (let ((auto-mode-alist
+ (let ((alist (copy-sequence auto-mode-alist)))
+ (dolist (mode avoided-modes)
+ (setq alist (rassq-delete-all mode alist)))
+ alist))
+ (magic-fallback-mode-alist
+ (let ((alist (copy-sequence magic-fallback-mode-alist)))
+ (dolist (mode avoided-modes)
+ (setq alist (rassq-delete-all mode alist)))
+ alist)))
+ (normal-mode))))
+
;;;; Defined in simple.el
(compat-guard (not (fboundp 'decoded-time-second))