mirror of
https://github.com/joaotavora/yasnippet.git
synced 2025-10-13 21:13:04 +00:00
Activate extra and major modes first
This prevents snippets from a parent mode from overriding those of the major-mode's (or yas--extra-modes). Snippets of ancestor modes may still override snippets of some other ancestor modes, but hopefully this won't cause much trouble in practice. See [1] and subsequent comments. [1]: https://github.com/capitaomorte/yasnippet/issues/619#issuecomment-149127150 * yasnippet.el (yas--modes-to-activate): Reverse result, so that parents of yas--extra-modes and major are later in the list. * yasnippet-tests.el (loading-with-cyclic-parenthood) (extra-modes-parenthood): Test it. Close #626.
This commit is contained in:
parent
b8687bb0fe
commit
cd05da61f9
@ -497,6 +497,7 @@ TODO: correct this bug!"
|
||||
emacs-lisp-mode
|
||||
lisp-interaction-mode))
|
||||
(observed (yas--modes-to-activate)))
|
||||
(should (equal major-mode (car observed)))
|
||||
(should (equal (sort expected #'string<) (sort observed #'string<))))))))
|
||||
|
||||
(ert-deftest extra-modes-parenthood ()
|
||||
@ -505,26 +506,29 @@ TODO: correct this bug!"
|
||||
(yas-with-snippet-dirs '((".emacs.d/snippets"
|
||||
("c-mode"
|
||||
(".yas-parents" . "cc-mode"))
|
||||
("cc-mode"
|
||||
(".yas-parents" . "yet-another-c-mode and-that-one"))
|
||||
("yet-another-c-mode"
|
||||
(".yas-parents" . "c-mode and-also-this-one lisp-interaction-mode"))))
|
||||
(yas-reload-all)
|
||||
(with-temp-buffer
|
||||
(let* ((_ (yas-activate-extra-mode 'c-mode))
|
||||
(expected `(,major-mode
|
||||
c-mode
|
||||
cc-mode
|
||||
yet-another-c-mode
|
||||
and-also-this-one
|
||||
and-that-one
|
||||
;; prog-mode doesn't exist in emacs 24.3
|
||||
,@(if (fboundp 'prog-mode)
|
||||
'(prog-mode))
|
||||
emacs-lisp-mode
|
||||
lisp-interaction-mode))
|
||||
(yas-activate-extra-mode 'c-mode)
|
||||
(yas-activate-extra-mode 'yet-another-c-mode)
|
||||
(yas-activate-extra-mode 'and-that-one)
|
||||
(let* ((expected-first `(and-that-one
|
||||
yet-another-c-mode
|
||||
c-mode
|
||||
,major-mode))
|
||||
(expected-rest `(cc-mode
|
||||
;; prog-mode doesn't exist in emacs 24.3
|
||||
,@(if (fboundp 'prog-mode)
|
||||
'(prog-mode))
|
||||
emacs-lisp-mode
|
||||
and-also-this-one
|
||||
lisp-interaction-mode))
|
||||
(observed (yas--modes-to-activate)))
|
||||
(should (equal (sort expected #'string<) (sort observed #'string<))))))))
|
||||
(should (equal expected-first
|
||||
(cl-subseq observed 0 (length expected-first))))
|
||||
(should (equal (sort expected-rest #'string<)
|
||||
(sort (cl-subseq observed (length expected-first)) #'string<))))))))
|
||||
|
||||
(ert-deftest issue-492-and-494 ()
|
||||
(defalias 'yas--phony-c-mode 'c-mode)
|
||||
|
31
yasnippet.el
31
yasnippet.el
@ -728,22 +728,21 @@ defined direct keybindings to the command
|
||||
(defun yas--modes-to-activate (&optional mode)
|
||||
"Compute list of mode symbols that are active for `yas-expand'
|
||||
and friends."
|
||||
(let (dfs explored)
|
||||
(setq dfs (lambda (mode)
|
||||
(unless (memq mode explored)
|
||||
(push mode explored)
|
||||
(loop for neighbour
|
||||
in (cl-list* (get mode 'derived-mode-parent)
|
||||
(ignore-errors (symbol-function mode))
|
||||
(gethash mode yas--parents))
|
||||
when (and neighbour
|
||||
(not (memq neighbour explored))
|
||||
(symbolp neighbour))
|
||||
do (funcall dfs neighbour)))))
|
||||
(if mode
|
||||
(funcall dfs mode)
|
||||
(mapcar dfs (cons major-mode yas--extra-modes)))
|
||||
explored))
|
||||
(let* ((explored (if mode (list mode) ; Building up list in reverse.
|
||||
(cons major-mode (reverse yas--extra-modes))))
|
||||
(dfs
|
||||
(lambda (mode)
|
||||
(cl-loop for neighbour
|
||||
in (cl-list* (get mode 'derived-mode-parent)
|
||||
(ignore-errors (symbol-function mode))
|
||||
(gethash mode yas--parents))
|
||||
when (and neighbour
|
||||
(not (memq neighbour explored))
|
||||
(symbolp neighbour))
|
||||
do (push neighbour explored)
|
||||
(funcall dfs neighbour)))))
|
||||
(mapcar dfs explored)
|
||||
(nreverse explored)))
|
||||
|
||||
(defvar yas-minor-mode-hook nil
|
||||
"Hook run when `yas-minor-mode' is turned on.")
|
||||
|
Loading…
x
Reference in New Issue
Block a user