about summary refs log tree commit diff stats
path: root/.emacs.d/lisp/init-smartparens.el
diff options
context:
space:
mode:
authorDavid Morgan <djm_uk@protonmail.com>2022-11-01 16:27:42 +0000
committerDavid Morgan <djm_uk@protonmail.com>2022-11-01 16:27:42 +0000
commitaba1ab31911602127f7e5ae54fa9f8e7b9582c2d (patch)
tree31b5971d5ebe429790faa59fbc12d40505be6da8 /.emacs.d/lisp/init-smartparens.el
parent45c2459c8e72c9a919176d7b7c3f244856a83d80 (diff)
downloaddotfiles-aba1ab31911602127f7e5ae54fa9f8e7b9582c2d.tar.gz
Mostly use smartparens
Diffstat (limited to '.emacs.d/lisp/init-smartparens.el')
-rw-r--r--.emacs.d/lisp/init-smartparens.el87
1 files changed, 52 insertions, 35 deletions
diff --git a/.emacs.d/lisp/init-smartparens.el b/.emacs.d/lisp/init-smartparens.el
index fa8c122..b80d184 100644
--- a/.emacs.d/lisp/init-smartparens.el
+++ b/.emacs.d/lisp/init-smartparens.el
@@ -2,53 +2,70 @@
 ;;; Commentary:
 ;;; Code:
 
+(use-package paredit
+  :commands (paredit-semicolon paredit-comment-dwim))
+
 (use-package smartparens
   :diminish
   :custom
   (sp-base-key-bindings 'paredit)
   (sp-autoskip-closing-pair 'always)
   (sp-hybrid-kill-entire-symbol t)
-  (sp-hybrid-kill-excessive-whitespace t)
+  (sp-hybrid-kill-excessive-whitespace nil)
+  :hook (after-init . (lambda ()
+                        (smartparens-global-strict-mode)
+                        (show-smartparens-global-mode)
+                        (setq sp-paredit-bindings (delete '("M-?" . sp-convolute-sexp) sp-paredit-bindings))
+                        (require 'smartparens-config)
+                        (sp-use-paredit-bindings)))
   :config
-  (defun sp-wrap-double-quotation-marks ()
+  (sp-pair "\"" "\"" :wrap "M-\"")
+  ;; From https://github.com/bodil/emacs.d/blob/master/bodil/bodil-paredit.el
+  (defun duplicate-sexp-after-point ()
+    "Duplicates the content of the line that is after the point."
     (interactive)
-    (sp-wrap-with-pair "\""))
-  ;; https://github.com/syl20bnr/spacemacs/blob/develop/layers/+spacemacs/spacemacs-editing/funcs.el (spacemacs/smart-closing-parenthesis)
-  ;; TODO can make things unbalanced
-  (defun sp-close-round ()
+    ;; skips to the next sexp
+    (while (looking-at " ")
+      (forward-char))
+    (set-mark-command nil)
+    ;; while we find sexps we move forward on the line
+    (while (and (<= (point) (car (bounds-of-thing-at-point 'sexp)))
+                (not (= (point) (line-end-position))))
+      (forward-sexp)
+      (while (looking-at " ")
+        (forward-char)))
+    (kill-ring-save (mark) (point))
+    ;; go to the next line and copy the sexps we encountered
+    (sp-newline)
+    (set-mark-command nil)
+    (yank)
+    (exchange-point-and-mark))
+  ;; From https://github.com/bodil/emacs.d/blob/master/bodil/bodil-paredit.el
+  ;; Inverse M-(
+  (defun wrap-round-from-behind ()
+    "Wrap the previous sexp before the point with ()."
     (interactive)
-    (let* ((sp-navigate-close-if-unbalanced t)
-           (current-pos (point))
-           (current-line (line-number-at-pos current-pos))
-           next-pos next-line)
-      (save-excursion
-        (let ((buffer-undo-list)
-              (modified (buffer-modified-p)))
-          (unwind-protect
-              (progn
-                (sp-up-sexp)
-                (setq next-pos (point)
-                      next-line (line-number-at-pos)))
-            (primitive-undo (length buffer-undo-list)
-                            buffer-undo-list)
-            (set-buffer-modified-p modified))))
-      (cond
-       ((and (= current-line next-line)
-             (not (= current-pos next-pos)))
-        (sp-up-sexp))
-       (t
-        (insert-char ?\))))))
-
-  (smartparens-global-strict-mode)
-  (show-smartparens-global-mode)
-  (require 'smartparens-config)
-  (sp-use-paredit-bindings)
+    (forward-sexp -1)
+    (sp-wrap-round)
+    (insert " ")
+    (forward-char -1))
   (unbind-key "M-?" 'smartparens-mode-map)
-  :commands sp-local-pair
+  (unbind-key "M-?" 'sp-keymap)
   :bind (:map smartparens-mode-map
               ("C-M-?" . sp-convolute-sexp)
-              ;; (")" . sp-close-round)
-              ("M-\"" . sp-wrap-double-quotation-marks)))
+              ([remap mark-sexp] . sp-mark-sexp)
+              ("M-[" . paredit-smart-wrap-square)
+              ("C-c M-{" . sp-wrap-curly)
+              ("M-W" . sp-copy-sexp)
+              (")" . paredit-close-round)
+              ("]" . paredit-close-square)
+              ("}" . paredit-close-curly)
+              (";" . paredit-semicolon)
+              ("M-;" . paredit-comment-dwim)
+              ("M-q" . sp-indent-defun)
+              ("C-j" . sp-newline)
+              ("C-c C-S-d" . duplicate-sexp-after-point)
+              ("C-c M-(" . wrap-round-from-behind)))
 
 (provide 'init-smartparens)
 ;;; init-smartparens.el ends here