Improve web-mode + smartparens compatibility

This addresses two edge cases:

1. if web-mode-auto-close-style == 3, <'s behavior may insert an extra
   >
2. Some web-mode engines have pairs that end with smartparens pairs,
   which will result in web-mode inserting its closing pairs _and_
   smartparens inserting its closing pairs; resulting in extra
   characters.

Reported by @ar1a
This commit is contained in:
Henrik Lissner 2018-08-04 13:39:39 +02:00
parent c4ec1413dc
commit 8248e80570
No known key found for this signature in database
GPG key ID: 5F6C0EA160557395

View file

@ -19,21 +19,26 @@
web-mode-auto-close-style 2)
(after! smartparens
(defun +web-is-auto-close-style-3 (_id action _context)
(and (eq action 'insert)
(eq web-mode-auto-close-style 3)))
(sp-local-pair 'web-mode "<" nil :unless '(:add +web-is-auto-close-style-3))
;; let smartparens handle these
(setq web-mode-enable-auto-quoting nil
web-mode-enable-auto-pairing t)
;; Remove web-mode auto pairs that end with >, because smartparens autopairs
;; them, causing duplicates. Also remove truncated autopairs, like <?p and
;; hp ?>.
;; 1. Remove web-mode auto pairs whose end pair starts with a latter
;; (truncated autopairs like <?p and hp ?>). Smartparens handles these
;; better.
;; 2. Strips out extra closing pairs to prevent redundant characters
;; inserted by smartparens.
(dolist (alist web-mode-engines-auto-pairs)
(setcdr alist (delq nil
(mapcar (lambda (pair)
(unless (string-match-p "^[a-z-]" (cdr pair))
(cons (car pair)
(if (equal (substring (cdr pair) -1) ">")
(substring (cdr pair) 0 -1)
(cdr pair)))))
(cdr alist)))))
(setcdr alist
(cl-loop for pair in (cdr alist)
unless (string-match-p "^[a-z-]" (cdr pair))
collect (cons (car pair)
(string-trim-right (cdr pair) "\\(?:>\\|]\\|}\\)+")))))
(setf (alist-get nil web-mode-engines-auto-pairs) nil))
(map! :map web-mode-map