求助:Electric pair 实现 sp-forward-slurp-sexp

最近想使用 electric pair 替换了 smartparens,发现没有 slurp 这个功能,看了下实现比较复杂,想问下道友有没有之前实现过的,先谢过了。

那为什么不:

  • 使用electric pair
  • require smartparens但关闭所有按键绑定
  • (define-key ...-map (kbd "...") 'smartparens-slurp-sexp)

up-list + forward-sexp 就可以是实现:

;; (|foo (bar)) quux
;;      |
;;      | up-list
;;      |
;;      v
;; (foo (bar))| quux
;;      |
;;      | forward-sexp
;;      |
;;      v
;; (foo (bar)) quux|

up-list + forward-sexp + save-excursion 简单实现了一个:

(defun slurp-sexp (n)
  (interactive "P")
  (save-excursion
    (up-list)
    (let ((ch (char-before)))
      (save-excursion
        (forward-sexp n)
        (insert ch)))
    (delete-backward-char 1)))

(with-temp-buffer
  (insert "(foo (bar)) qux quux")
  (goto-char 2)
  (slurp-sexp 2) ;; <--
  (buffer-string))
;; => "(foo (bar) qux quux)"

(with-temp-buffer
  (insert "[foo [bar]] qux quux")
  (goto-char 2)
  (slurp-sexp 1) ;; <--
  (buffer-string))
;; => "[foo [bar] qux] quux"

学习了,实践用了几天,发现还替代不了,暂时换回 smartparens 了。