about summary refs log tree commit diff stats
path: root/.emacs.d/lisp/init-paredit.el
diff options
context:
space:
mode:
Diffstat (limited to '.emacs.d/lisp/init-paredit.el')
-rw-r--r--.emacs.d/lisp/init-paredit.el121
1 files changed, 114 insertions, 7 deletions
diff --git a/.emacs.d/lisp/init-paredit.el b/.emacs.d/lisp/init-paredit.el
index 20dc2da..9d25b19 100644
--- a/.emacs.d/lisp/init-paredit.el
+++ b/.emacs.d/lisp/init-paredit.el
@@ -16,18 +16,125 @@
 
 (use-package paredit
   :diminish
-  ;; sp does a few things better
-  :bind (([remap mark-sexp] . sp-mark-sexp)
-         ("M-[" . sp-wrap-square)
-         ("C-c M-{" . sp-wrap-curly)
-         ([remap paredit-wrap-round] . sp-wrap-round)
-         ([remap paredit-meta-doublequote] . sp-wrap-double-quotation-marks)
-         ("M-W" . paredit-copy-as-kill))
+  :bind
+  (:map paredit-mode-map
+        ([remap mark-sexp] . sp-mark-sexp)
+        ("M-[" . sp-wrap-square)
+        ("C-c M-{" . sp-wrap-curly)
+        ([remap paredit-wrap-round] . sp-wrap-round)
+        ([remap paredit-meta-doublequote] . sp-wrap-double-quotation-marks)
+        ("M-W" . paredit-copy-as-kill))
   :config
   (defun sp-wrap-double-quotation-marks ()
     (interactive)
     (sp-wrap-with-pair "\""))
+
   :init
+  ;; From emacswiki - extreme barfage & slurpage
+  (defun paredit-barf-all-the-way-backward ()
+    (interactive)
+    (paredit-split-sexp)
+    (paredit-backward-down)
+    (paredit-splice-sexp))
+  (defun paredit-barf-all-the-way-forward ()
+    (interactive)
+    (paredit-split-sexp)
+    (paredit-forward-down)
+    (paredit-splice-sexp)
+    (if (eolp) (delete-horizontal-space)))
+  (defun paredit-slurp-all-the-way-backward ()
+    (interactive)
+    (catch 'done
+      (while (not (bobp))
+        (save-excursion
+          (paredit-backward-up)
+          (if (eq (char-before) ?\()
+              (throw 'done t)))
+        (paredit-backward-slurp-sexp))))
+  (defun paredit-slurp-all-the-way-forward ()
+    (interactive)
+    (catch 'done
+      (while (not (eobp))
+        (save-excursion
+          (paredit-forward-up)
+          (if (eq (char-after) ?\))
+              (throw 'done t)))
+        (paredit-forward-slurp-sexp))))
+
+  ;; From https://github.com/bodil/emacs.d/blob/master/bodil/bodil-paredit.el
+  ;; Inverse M-(
+  (defun paredit-wrap-round-from-behind ()
+    (interactive)
+    (forward-sexp -1)
+    (paredit-wrap-round)
+    (insert " ")
+    (forward-char -1))
+  ;; From https://github.com/bodil/emacs.d/blob/master/bodil/bodil-paredit.el
+  ;; Duplicate sexp
+  (defun paredit-duplicate-after-point ()
+    "Duplicates the content of the line that is after the point."
+    (interactive)
+    ;; 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 sexprs we encountered
+    (paredit-newline)
+    (set-mark-command nil)
+    (yank)
+    (exchange-point-and-mark))
+
+  (defun replace-paredit-binding (commands original-keys new-keys)
+    (when commands
+      (if (and (consp (car commands))
+               (equal (caar commands) original-keys))
+          (setcar (car commands) new-keys)
+        (replace-paredit-binding (cdr commands) original-keys new-keys))))
+  (defun paredit-commands-advice ()
+    ;; Default paredit-convolute-sexp binding clashes with xref-find-references
+    (replace-paredit-binding paredit-commands "M-?" "C-M-?")
+
+    (nconc paredit-commands
+           '("Extreme Barfage & Slurpage"
+             (("C-M-)")
+              paredit-slurp-all-the-way-forward
+              ("(foo (bar |baz) quux zot)"
+               "(foo (bar |baz quux zot))")
+              ("(a b ((c| d)) e f)"
+               "(a b ((c| d)) e f)"))
+             (("C-M-}" "M-F")
+              paredit-barf-all-the-way-forward
+              ("(foo (bar |baz quux) zot)"
+               "(foo (bar|) baz quux zot)"))
+             (("C-M-(")
+              paredit-slurp-all-the-way-backward
+              ("(foo bar (baz| quux) zot)"
+               "((foo bar baz| quux) zot)")
+              ("(a b ((c| d)) e f)"
+               "(a b ((c| d)) e f)"))
+             (("C-M-{" "M-B")
+              paredit-barf-all-the-way-backward
+              ("(foo (bar baz |quux) zot)"
+               "(foo bar baz (|quux) zot)")))
+           '("Extra"
+             (("C-c M-)")
+              paredit-wrap-round-from-behind
+              ("(foo| bar baz" "((| foo) bar baz"))
+             (("C-c C-d")
+              paredit-duplicate-after-point
+              ("|(foo)" "(foo)\n|(foo)"))))
+
+    ;; Only need to do this once
+    (advice-remove 'paredit-define-keys 'paredit-commands-advice))
+
+  (advice-add 'paredit-define-keys :before 'paredit-commands-advice)
   (add-lisp-hook #'turn-off-smartparens-mode)
   (add-lisp-hook #'enable-paredit-mode))