about summary refs log tree commit diff stats
path: root/emacs-prelude/personal/lisp/paredit-functions.el
diff options
context:
space:
mode:
authorDavid Morgan <djm_uk@protonmail.com>2021-05-26 10:06:56 +0000
committerDavid Morgan <djm_uk@protonmail.com>2021-05-26 10:06:56 +0000
commitb5e8c2052c43e9865aad35380ff0b36cabae19d2 (patch)
tree64df1a2604066e1f5d3c0c2fc6a01ce85090d17b /emacs-prelude/personal/lisp/paredit-functions.el
parentccfeb564b6507fdf9b202527f90e6d11d50350eb (diff)
downloaddotfiles-b5e8c2052c43e9865aad35380ff0b36cabae19d2.tar.gz
Add emacs prelude config
Diffstat (limited to 'emacs-prelude/personal/lisp/paredit-functions.el')
-rw-r--r--emacs-prelude/personal/lisp/paredit-functions.el102
1 files changed, 102 insertions, 0 deletions
diff --git a/emacs-prelude/personal/lisp/paredit-functions.el b/emacs-prelude/personal/lisp/paredit-functions.el
new file mode 100644
index 0000000..12fd4e0
--- /dev/null
+++ b/emacs-prelude/personal/lisp/paredit-functions.el
@@ -0,0 +1,102 @@
+(with-eval-after-load 'paredit
+;; From emacswiki
+(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))))
+
+(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)"))))
+
+(paredit-define-keys)
+(paredit-annotate-mode-with-examples)
+(paredit-annotate-functions-with-examples)
+
+;; From bodil
+;; Inverse M-(
+(defun paredit-wrap-round-from-behind ()
+  (interactive)
+  (forward-sexp -1)
+  (paredit-wrap-round)
+  (insert " ")
+  (forward-char -1))
+(eval-after-load "paredit"
+  '(define-key paredit-mode-map (kbd "M-)")
+     'paredit-wrap-round-from-behind))
+
+;; From bodil
+;; 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)))
+(eval-after-load "paredit"
+  '(define-key paredit-mode-map (kbd "C-c C-d")
+     'paredit-duplicate-after-point))
+
+(provide 'paredit-functions)
+