Fix smartparens after nested snippet expansions
Current implementation, #1644, doesn't handle the nested snippet expansion properly, so you end up with smarparens disabled. Very annoying. I improved the implementation to remember the current state of smartaperns before a top-level snippet expansion and preserve on any nested snippet expansions. Also, some housekeeping of the related code: * Move hook handlers to the `funcs.el`. * Add comments about yasnippet hooks subtleties relevant to the issue. Fixes #1512
This commit is contained in:
parent
8f9914903d
commit
309e6eb4bb
|
@ -220,3 +220,39 @@
|
||||||
(interactive)
|
(interactive)
|
||||||
(call-interactively 'aya-expand)
|
(call-interactively 'aya-expand)
|
||||||
(unless holy-mode (evil-insert-state)))
|
(unless holy-mode (evil-insert-state)))
|
||||||
|
|
||||||
|
|
||||||
|
;; Yasnippet and Smartparens
|
||||||
|
|
||||||
|
;; If enabled, smartparens will mess snippets expanded by `hippie-expand`.
|
||||||
|
;; We want to temporarily disable Smartparens during the snippet expansion and
|
||||||
|
;; switch it back to the initial state when done.
|
||||||
|
;;
|
||||||
|
;; However, there is an asymmetry in Yasnippet's hooks:
|
||||||
|
;; * `yas-before-expand-snippet-hook' is called for all snippet expansions,
|
||||||
|
;; including the nested ones.
|
||||||
|
;; * `yas-after-exit-snippet-hook' is called only for the top level snippet,
|
||||||
|
;; but NOT for the nested ones.
|
||||||
|
;;
|
||||||
|
;; That's why we introduce `spacemacs--yasnippet-expanding' below.
|
||||||
|
|
||||||
|
(defvar spacemacs--smartparens-enabled-initially t
|
||||||
|
"Stored whether smartparens is originally enabled or not.")
|
||||||
|
(defvar spacemacs--yasnippet-expanding nil
|
||||||
|
"Whether the snippet expansion is in progress.")
|
||||||
|
|
||||||
|
(defun spacemacs//smartparens-disable-before-expand-snippet ()
|
||||||
|
"Handler for `yas-before-expand-snippet-hook'.
|
||||||
|
Disable smartparens and remember its initial state."
|
||||||
|
;; Remember the initial smartparens state only once, when expanding a top-level snippet.
|
||||||
|
(unless spacemacs--yasnippet-expanding
|
||||||
|
(setq spacemacs--yasnippet-expanding t
|
||||||
|
spacemacs--smartparens-enabled-initially smartparens-mode))
|
||||||
|
(smartparens-mode -1))
|
||||||
|
|
||||||
|
(defun spacemacs//smartparens-restore-after-exit-snippet ()
|
||||||
|
"Handler for `yas-after-exit-snippet-hook'.
|
||||||
|
Restore the initial state of smartparens."
|
||||||
|
(setq spacemacs--yasnippet-expanding nil)
|
||||||
|
(when spacemacs--smartparens-enabled-initially
|
||||||
|
(smartparens-mode 1)))
|
||||||
|
|
|
@ -246,16 +246,7 @@
|
||||||
|
|
||||||
(defun auto-completion/post-init-smartparens ()
|
(defun auto-completion/post-init-smartparens ()
|
||||||
(with-eval-after-load 'smartparens
|
(with-eval-after-load 'smartparens
|
||||||
;; We need to know whether the smartparens was enabled, see
|
|
||||||
;; `yas-before-expand-snippet-hook' below.
|
|
||||||
(defvar smartparens-enabled-initially t
|
|
||||||
"Stored whether smartparens is originally enabled or not.")
|
|
||||||
(add-hook 'yas-before-expand-snippet-hook
|
(add-hook 'yas-before-expand-snippet-hook
|
||||||
(lambda ()
|
#'spacemacs//smartparens-disable-before-expand-snippet)
|
||||||
;; If enabled, smartparens will mess snippets expanded by `hippie-expand`
|
|
||||||
(setq smartparens-enabled-initially smartparens-mode)
|
|
||||||
(smartparens-mode -1)))
|
|
||||||
(add-hook 'yas-after-exit-snippet-hook
|
(add-hook 'yas-after-exit-snippet-hook
|
||||||
(lambda ()
|
#'spacemacs//smartparens-restore-after-exit-snippet)))
|
||||||
(when smartparens-enabled-initially
|
|
||||||
(smartparens-mode 1))))))
|
|
||||||
|
|
Loading…
Reference in a new issue