Don't preserve non-module minor modes in erc-open
* lisp/erc/erc-common.el (define-erc-module): Add symbol property `erc-module' to minor modes defined as part of a module. * lisp/erc/erc.el (erc--merge-local-modes): Be more conservative when persisting local minor-mode state across ERC sessions. User and third-party modes that were not defined via `define-erc-modules' should be left alone. (erc-open): Run major-mode hooks and enable minor modes after prompt has been set up. This ensures that module-setup code can access a fully initialized `erc-input-marker'. * test/lisp/erc/erc-tests.el (erc--merge-local-modes): Add mocks for `erc-module' symbol property and a test case covering some foreign ERC mode. (define-erc-module--global, define-erc-module--local): Expect the `erc-module' symbol property to be defined for mode symbols and aliases. (Bug#60784.)
This commit is contained in:
parent
7b8322f628
commit
183e749270
3 changed files with 38 additions and 23 deletions
|
@ -202,12 +202,13 @@ if ARG is omitted or nil.
|
||||||
(,disable)))
|
(,disable)))
|
||||||
,(erc--assemble-toggle local-p name enable mode t enable-body)
|
,(erc--assemble-toggle local-p name enable mode t enable-body)
|
||||||
,(erc--assemble-toggle local-p name disable mode nil disable-body)
|
,(erc--assemble-toggle local-p name disable mode nil disable-body)
|
||||||
,(when (and alias (not (eq name alias)))
|
,@(and-let* ((alias)
|
||||||
`(defalias
|
((not (eq name alias)))
|
||||||
',(intern
|
(aname (intern (format "erc-%s-mode"
|
||||||
(format "erc-%s-mode"
|
(downcase (symbol-name alias))))))
|
||||||
(downcase (symbol-name alias))))
|
`((defalias ',aname #',mode)
|
||||||
#',mode))
|
(put ',aname 'erc-module ',(erc--normalize-module-symbol name))))
|
||||||
|
(put ',mode 'erc-module ',(erc--normalize-module-symbol name))
|
||||||
;; For find-function and find-variable.
|
;; For find-function and find-variable.
|
||||||
(put ',mode 'definition-name ',name)
|
(put ',mode 'definition-name ',name)
|
||||||
(put ',enable 'definition-name ',name)
|
(put ',enable 'definition-name ',name)
|
||||||
|
|
|
@ -1958,7 +1958,8 @@ nil."
|
||||||
(let ((out (list (reverse new-modes))))
|
(let ((out (list (reverse new-modes))))
|
||||||
(pcase-dolist (`(,k . ,v) old-vars)
|
(pcase-dolist (`(,k . ,v) old-vars)
|
||||||
(when (and (string-prefix-p "erc-" (symbol-name k))
|
(when (and (string-prefix-p "erc-" (symbol-name k))
|
||||||
(string-suffix-p "-mode" (symbol-name k)))
|
(string-suffix-p "-mode" (symbol-name k))
|
||||||
|
(get k 'erc-module))
|
||||||
(if v
|
(if v
|
||||||
(cl-pushnew k (car out))
|
(cl-pushnew k (car out))
|
||||||
(setf (car out) (delq k (car out)))
|
(setf (car out) (delq k (car out)))
|
||||||
|
@ -2082,9 +2083,7 @@ Returns the buffer for the given server or channel."
|
||||||
|
|
||||||
(erc-determine-parameters server port nick full-name user passwd)
|
(erc-determine-parameters server port nick full-name user passwd)
|
||||||
|
|
||||||
(save-excursion (run-mode-hooks))
|
;; FIXME consolidate this prompt-setup logic with the pass above.
|
||||||
(dolist (mod (car delayed-modules)) (funcall mod +1))
|
|
||||||
(dolist (var (cdr delayed-modules)) (set var nil))
|
|
||||||
|
|
||||||
;; set up prompt
|
;; set up prompt
|
||||||
(unless continued-session
|
(unless continued-session
|
||||||
|
@ -2097,6 +2096,10 @@ Returns the buffer for the given server or channel."
|
||||||
(erc-display-prompt)
|
(erc-display-prompt)
|
||||||
(goto-char (point-max)))
|
(goto-char (point-max)))
|
||||||
|
|
||||||
|
(save-excursion (run-mode-hooks)
|
||||||
|
(dolist (mod (car delayed-modules)) (funcall mod +1))
|
||||||
|
(dolist (var (cdr delayed-modules)) (set var nil)))
|
||||||
|
|
||||||
;; Saving log file on exit
|
;; Saving log file on exit
|
||||||
(run-hook-with-args 'erc-connect-pre-hook buffer)
|
(run-hook-with-args 'erc-connect-pre-hook buffer)
|
||||||
|
|
||||||
|
|
|
@ -1251,18 +1251,28 @@
|
||||||
(setq calls nil)))))
|
(setq calls nil)))))
|
||||||
|
|
||||||
(ert-deftest erc--merge-local-modes ()
|
(ert-deftest erc--merge-local-modes ()
|
||||||
|
(cl-letf (((get 'erc-b-mode 'erc-module) 'b)
|
||||||
|
((get 'erc-c-mode 'erc-module) 'c)
|
||||||
|
((get 'erc-d-mode 'erc-module) 'd)
|
||||||
|
((get 'erc-e-mode 'erc-module) 'e))
|
||||||
|
|
||||||
(ert-info ("No existing modes")
|
(ert-info ("No existing modes")
|
||||||
(let ((old '((a) (b . t)))
|
(let ((old '((a) (b . t)))
|
||||||
(new '(erc-c-mode erc-d-mode)))
|
(new '(erc-c-mode erc-d-mode)))
|
||||||
(should (equal (erc--merge-local-modes new old)
|
(should (equal (erc--merge-local-modes new old)
|
||||||
'((erc-c-mode erc-d-mode))))))
|
'((erc-c-mode erc-d-mode))))))
|
||||||
|
|
||||||
(ert-info ("Active existing added, inactive existing removed, deduped")
|
(ert-info ("Active existing added, inactive existing removed, deduped")
|
||||||
(let ((old '((a) (erc-b-mode) (c . t) (erc-d-mode . t) (erc-e-mode . t)))
|
(let ((old '((a) (erc-b-mode) (c . t) (erc-d-mode . t) (erc-e-mode . t)))
|
||||||
(new '(erc-b-mode erc-d-mode)))
|
(new '(erc-b-mode erc-d-mode)))
|
||||||
(should (equal (erc--merge-local-modes new old)
|
(should (equal (erc--merge-local-modes new old)
|
||||||
'((erc-d-mode erc-e-mode) . (erc-b-mode)))))))
|
'((erc-d-mode erc-e-mode) . (erc-b-mode))))))
|
||||||
|
|
||||||
|
(ert-info ("Non-module erc-prefixed mode ignored")
|
||||||
|
(let ((old '((erc-b-mode) (erc-f-mode . t) (erc-d-mode . t)))
|
||||||
|
(new '(erc-b-mode)))
|
||||||
|
(should (equal (erc--merge-local-modes new old)
|
||||||
|
'((erc-d-mode) . (erc-b-mode))))))))
|
||||||
|
|
||||||
(ert-deftest define-erc-module--global ()
|
(ert-deftest define-erc-module--global ()
|
||||||
(let ((global-module '(define-erc-module mname malias
|
(let ((global-module '(define-erc-module mname malias
|
||||||
|
@ -1300,13 +1310,15 @@ Some docstring"
|
||||||
(ignore c) (ignore d))
|
(ignore c) (ignore d))
|
||||||
|
|
||||||
(defalias 'erc-malias-mode #'erc-mname-mode)
|
(defalias 'erc-malias-mode #'erc-mname-mode)
|
||||||
|
(put 'erc-malias-mode 'erc-module 'mname)
|
||||||
|
|
||||||
|
(put 'erc-mname-mode 'erc-module 'mname)
|
||||||
(put 'erc-mname-mode 'definition-name 'mname)
|
(put 'erc-mname-mode 'definition-name 'mname)
|
||||||
(put 'erc-mname-enable 'definition-name 'mname)
|
(put 'erc-mname-enable 'definition-name 'mname)
|
||||||
(put 'erc-mname-disable 'definition-name 'mname))))))
|
(put 'erc-mname-disable 'definition-name 'mname))))))
|
||||||
|
|
||||||
(ert-deftest define-erc-module--local ()
|
(ert-deftest define-erc-module--local ()
|
||||||
(let* ((global-module '(define-erc-module mname malias
|
(let* ((global-module '(define-erc-module mname nil ; no alias
|
||||||
"Some docstring"
|
"Some docstring"
|
||||||
((ignore a) (ignore b))
|
((ignore a) (ignore b))
|
||||||
((ignore c) (ignore d))
|
((ignore c) (ignore d))
|
||||||
|
@ -1353,8 +1365,7 @@ When called interactively, do so in all buffers for the current connection."
|
||||||
(setq erc-mname-mode nil)
|
(setq erc-mname-mode nil)
|
||||||
(ignore c) (ignore d))))
|
(ignore c) (ignore d))))
|
||||||
|
|
||||||
(defalias 'erc-malias-mode #'erc-mname-mode)
|
(put 'erc-mname-mode 'erc-module 'mname)
|
||||||
|
|
||||||
(put 'erc-mname-mode 'definition-name 'mname)
|
(put 'erc-mname-mode 'definition-name 'mname)
|
||||||
(put 'erc-mname-enable 'definition-name 'mname)
|
(put 'erc-mname-enable 'definition-name 'mname)
|
||||||
(put 'erc-mname-disable 'definition-name 'mname))))))
|
(put 'erc-mname-disable 'definition-name 'mname))))))
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue