summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorexpez <expez@expez.com>2013-12-23 13:27:44 +0100
committerexpez <expez@expez.com>2013-12-23 13:39:43 +0100
commita323aa2269954ed4b1b51bf9fa94ec19e6ef66c3 (patch)
tree95e1af9523b1d7b3b522d467c4d62262a3a7ec3f
parentf663dd2aae0fbfb6574a2f1c4ee99faadce4b85d (diff)
Make evil-paredit-delete-line work like paredit-kill.
Previously when we had this situation: (progn (foo) |(bar (baz))) and hit D we would get an error. Now we get this: (progn (foo) |))
-rw-r--r--evil-paredit.el22
1 files changed, 19 insertions, 3 deletions
diff --git a/evil-paredit.el b/evil-paredit.el
index b1778f8..4115c2d 100644
--- a/evil-paredit.el
+++ b/evil-paredit.el
@@ -83,7 +83,15 @@ Save in REGISTER or in the kill-ring with YANK-HANDLER."
(interactive "<R><x>")
;; act linewise in Visual state
(let* ((beg (or beg (point)))
- (end (or end beg)))
+ (end (or end beg))
+ ;; NOTE the following count will be off when it encounters
+ ;; parens in strings.
+ (paren-count (count-matches "(" (line-beginning-position)
+ (line-end-position)))
+ (last-balanced-paren (evil-paredit-position-of
+ "\)"
+ (line-beginning-position)
+ (line-end-position))))
(when (evil-visual-state-p)
(unless (memq type '(line block))
(let ((range (evil-expand beg end 'line)))
@@ -103,10 +111,18 @@ Save in REGISTER or in the kill-ring with YANK-HANDLER."
((eq type 'line)
(evil-paredit-delete beg end type register yank-handler))
(t
- (evil-paredit-delete beg (line-end-position)
- type register yank-handler)))))
+ (evil-paredit-delete beg last-balanced-paren
+ type register yank-handler)))))
+(defun evil-paredit-position-of (regexp start stop &optional nth)
+ "Returns the buffer position of the `nth' occurrence of
+ `regexp' between buffer positions `start' and `stop'"
+ (save-excursion
+ (goto-char start)
+ (re-search-forward regexp stop (or nth 1))
+ (point)))
+
(evil-define-operator evil-paredit-change
(beg end type register yank-handler delete-func)
"Change text from BEG to END with TYPE respecting parenthesis.