最近想使用 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 了。