emacs-elpa-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[nongnu] elpa/smartparens 219da7202c 2/2: feat(barf): move the point wit


From: ELPA Syncer
Subject: [nongnu] elpa/smartparens 219da7202c 2/2: feat(barf): move the point with the barfed delimiter
Date: Wed, 18 Jan 2023 06:59:54 -0500 (EST)

branch: elpa/smartparens
commit 219da7202c6c184ac06033489899bfc391ddd64e
Author: Matus Goljer <matus.goljer@gmail.com>
Commit: Matus Goljer <matus.goljer@gmail.com>

    feat(barf): move the point with the barfed delimiter
    
    Fix #918
---
 smartparens-ruby.el               |  1 +
 smartparens.el                    | 38 ++++++++++++++++++++++----
 test/smartparens-barf-test.el     | 57 +++++++++++++++++++++++++++++++++++++++
 test/smartparens-commands-test.el |  7 -----
 4 files changed, 91 insertions(+), 12 deletions(-)

diff --git a/smartparens-ruby.el b/smartparens-ruby.el
index 3ba86716be..7439623658 100644
--- a/smartparens-ruby.el
+++ b/smartparens-ruby.el
@@ -118,6 +118,7 @@ ID, ACTION, CONTEXT."
 ID, ACTION, CONTEXT."
   (-let (((&plist :arg arg :enc enc) sp-handler-context))
     (when (equal action 'barf-backward)
+      (goto-char (sp-get enc :beg))
       (sp-ruby-delete-indentation 1)
       (indent-according-to-mode)
       (save-excursion
diff --git a/smartparens.el b/smartparens.el
index 03bf875e91..b5ae340bf4 100644
--- a/smartparens.el
+++ b/smartparens.el
@@ -1179,6 +1179,14 @@ position (before or after the region).
   :group 'smartparens)
 
 ;; navigation & manip custom
+(defcustom sp-barf-move-point-with-delimiter t
+  "If non-nil, move point when it would end outside the sexp after barf.
+
+This way, a barf operation can be immediately followed by an
+opposite slurp to undo it."
+  :type 'boolean
+  :group 'smartparens)
+
 (defcustom sp-navigate-consider-sgml-tags '(
                                             html-mode
                                             )
@@ -7386,6 +7394,11 @@ closing delimiter of the list.
 
 If the current list is empty, do nothing.
 
+If the setting `sp-barf-move-point-with-delimiter' is non-nil,
+move the point together with the closing delimiter if the point
+would end up outside of the enclosing sexp.  This way the barf
+can be always followed by a slurp to undo the change.
+
 Examples: (prefix arg in comment)
 
   (foo bar| baz)   -> (foo bar|) baz   ;; nil (defaults to 1)
@@ -7398,7 +7411,8 @@ Examples: (prefix arg in comment)
   (interactive "P")
   (let* ((raw (sp--raw-argument-p arg))
          (old-arg arg)
-         (arg (prefix-numeric-value arg)))
+         (arg (prefix-numeric-value arg))
+         (new-cl-position nil))
     (if (> arg 0)
         (if (sp-point-in-blank-sexp)
             (sp-message :blank-sexp)
@@ -7425,8 +7439,12 @@ Examples: (prefix arg in comment)
                 (sp-do-move-cl (point))
                 (sp--keep-indentation
                   (sp--indent-region :beg :end))
+                (setq new-cl-position (- (point) :cl-l))
                 (sp--run-hook-with-args :op :post-handlers 'barf-forward
-                  (list :arg arg :enc enc))))))
+                  (list :arg arg :enc enc)))))
+          (when (and sp-barf-move-point-with-delimiter
+                     (< new-cl-position (point)))
+            (goto-char new-cl-position)))
       (sp-backward-barf-sexp (sp--negate-argument old-arg)))))
 
 (defun sp-backward-barf-sexp (&optional arg)
@@ -7445,7 +7463,8 @@ Examples:
   (interactive "P")
   (let* ((raw (sp--raw-argument-p arg))
          (old-arg arg)
-         (arg (prefix-numeric-value arg)))
+         (arg (prefix-numeric-value arg))
+         (new-cl-position nil))
     (if (> arg 0)
         (if (sp-point-in-blank-sexp)
             (sp-message :blank-sexp)
@@ -7469,10 +7488,19 @@ Examples:
                 (sp--run-hook-with-args :op :pre-handlers 'barf-backward
                   (list :arg arg :enc enc)))
               (sp-get (sp-get-enclosing-sexp)
-                (sp-do-move-op (point))
+                ;; make sure that we end up on the same place, since
+                ;; sp-do-move-op might move the point to the start of
+                ;; the previous sexp (the one barfed out)
+                (save-excursion (sp-do-move-op (point)))
+                ;; skip the opening to end up inside the sexp
+                (forward-char (+ :op-l :prefix-l))
                 (sp--indent-region :beg :end)
+                (setq new-cl-position (point))
                 (sp--run-hook-with-args :op :post-handlers 'barf-backward
-                  (list :arg arg :enc enc))))))
+                  (list :arg arg :enc enc)))))
+          (when (and sp-barf-move-point-with-delimiter
+                     (> new-cl-position (point)))
+            (goto-char new-cl-position)))
       (sp-forward-barf-sexp (sp--negate-argument old-arg)))))
 
 ;; TODO: get rid of the macro anyway, it's stupid!
diff --git a/test/smartparens-barf-test.el b/test/smartparens-barf-test.el
new file mode 100644
index 0000000000..95a32e6520
--- /dev/null
+++ b/test/smartparens-barf-test.el
@@ -0,0 +1,57 @@
+(require 'smartparens)
+
+(ert-deftest sp-test-sp-forward-barf-sexp-634 ()
+  (let ((sp-barf-move-point-with-delimiter nil))
+    (sp-test-with-temp-elisp-buffer "(let ((a 4)\n      ;; (fail)\n      |(+ 
1)\n      ))\n"
+      (call-interactively 'sp-forward-barf-sexp)
+      (sp-buffer-equals "(let ((a 4))\n  ;; (fail)\n  (+ 1)\n  )\n")
+      (call-interactively 'sp-forward-barf-sexp)
+      (sp-buffer-equals "(let ((a 4)))\n;; (fail)\n|(+ 1)\n\n"))))
+
+(ert-deftest sp-test-sp-forward-barf-918-move-point-with-closing-enabled ()
+  (let ((sp-barf-move-point-with-delimiter t))
+    (sp-test-with-temp-elisp-buffer "(hello world\n\n     |  what\n       is 
this)"
+      (call-interactively 'sp-forward-barf-sexp)
+      (sp-buffer-equals "(hello world\n\n     |  what\n       is) this")
+      (call-interactively 'sp-forward-barf-sexp)
+      (sp-buffer-equals "(hello world\n\n     |  what)\nis this")
+      (call-interactively 'sp-forward-barf-sexp)
+      (sp-buffer-equals "(hello world|)\n\nwhat\nis this"))))
+
+(ert-deftest sp-test-sp-forward-barf-918-move-point-with-closing-disabled ()
+  (let ((sp-barf-move-point-with-delimiter nil))
+    (sp-test-with-temp-elisp-buffer "(hello world\n\n     |  what\n       is 
this)"
+      (call-interactively 'sp-forward-barf-sexp)
+      (sp-buffer-equals "(hello world\n\n     |  what\n       is) this")
+      (call-interactively 'sp-forward-barf-sexp)
+      (sp-buffer-equals "(hello world\n\n     |  what)\nis this")
+      (call-interactively 'sp-forward-barf-sexp)
+      (sp-buffer-equals "(hello world)\n\n|what\nis this"))))
+
+(ert-deftest sp-test-sp-backward-barf-918-move-point-with-opening-enabled ()
+  (let ((sp-barf-move-point-with-delimiter t))
+    (sp-test-with-temp-elisp-buffer "(hello world\n\n     |  what\n       is 
this)"
+      (call-interactively 'sp-backward-barf-sexp)
+      (sp-buffer-equals "hello (world\n\n     |  what\n       is this)")
+      (call-interactively 'sp-backward-barf-sexp)
+      (sp-buffer-equals "hello world\n\n(|what\n is this)")
+      (call-interactively 'sp-backward-barf-sexp)
+      (sp-buffer-equals "hello world\n\nwhat\n(|is this)"))))
+
+(ert-deftest 
sp-test-sp-backward-barf-918-move-point-with-opening-enabled-with-prefix ()
+  (let ((sp-barf-move-point-with-delimiter t))
+    (sp-test-with-temp-elisp-buffer ",@(hello world\n\n       |  what\n        
 is this)"
+      (call-interactively 'sp-backward-barf-sexp)
+      (sp-buffer-equals "hello ,@(world\n\n       |  what\n         is this)")
+      (call-interactively 'sp-backward-barf-sexp)
+      (sp-buffer-equals "hello world\n\n,@(|what\n   is this)")
+      (call-interactively 'sp-backward-barf-sexp)
+      (sp-buffer-equals "hello world\n\nwhat\n,@(|is this)"))))
+
+(ert-deftest sp-test-sp-backward-barf-918-move-point-with-opening-disabled ()
+  (let ((sp-barf-move-point-with-delimiter nil))
+    (sp-test-with-temp-elisp-buffer "(hello world\n\n     |  what\n       is 
this)"
+      (call-interactively 'sp-backward-barf-sexp)
+      (sp-buffer-equals "hello (world\n\n     |  what\n       is this)")
+      (call-interactively 'sp-backward-barf-sexp)
+      (sp-buffer-equals "hello world\n\n|(what\n is this)"))))
diff --git a/test/smartparens-commands-test.el 
b/test/smartparens-commands-test.el
index 3de50f7e35..04c8dedc6e 100644
--- a/test/smartparens-commands-test.el
+++ b/test/smartparens-commands-test.el
@@ -1023,10 +1023,3 @@ This is the behavior of `paredit-convolute-sexp'."
       (sp-buffer-equals "(foo)
 (progn
   |(bar))"))))
-
-(ert-deftest sp-test-sp-forward-barf-sexp-634 ()
-  (sp-test-with-temp-elisp-buffer "(let ((a 4)\n      ;; (fail)\n      |(+ 
1)\n      ))\n"
-    (call-interactively 'sp-forward-barf-sexp)
-    (sp-buffer-equals "(let ((a 4))\n  ;; (fail)\n  (+ 1)\n  )\n")
-    (call-interactively 'sp-forward-barf-sexp)
-    (sp-buffer-equals "(let ((a 4)))\n;; (fail)\n|(+ 1)\n\n")))



reply via email to

[Prev in Thread] Current Thread [Next in Thread]