Closed blaenk closed 9 years ago
Hmmm, I see it seems to be because it gets bound to sp-delete-char
here https://github.com/expez/evil-smartparens/blob/master/evil-smartparens.el#L128 That function should probably take a parameter to specify whether to kill/copy the text or not, like delete-char
does, but I guess that's not an issue of this project. It could probably be worked-around though by copying the text before calling that function.
Making x
and X
work like they do in evil-mode is going to be more work that its worth for me right now. These functions also allow you to select a region to delete, and registers, but that's also not supported atm.
I suppose I'm not a very advanced vim user (coming to it from emacs). I only ever hit x
when I want to delete a single char :/ It actually never occurred to me that I could use the combination xp
to transpose a char--that's awesome!
If you want to take a dive into extending evil, then a pull request would be most welcome.
No worries, it's not that big of a deal and can easily be worked around.
Let me know if this does the trick or not! I'd love it if you gave this a try before I tagged a release for melpa-stable.
I'll check it out!
It seems to work! not sure if this is normal, but when I try to press 'x' on a closing paren I get this:
Debugger entered--Lisp error: (error "Can't find a safe region to act on!")
signal(error ("Can't find a safe region to act on!"))
error("Can't find a safe region to act on!")
evil-sp--fail()
(progn (evil-sp--fail))
(if (= beg end) (progn (evil-sp--fail)))
(let ((region (string-trim (buffer-substring-no-properties beg end)))) (if (string-blank-p region) nil (cond ((sp-point-in-empty-sexp) (setq end (save-excursion (sp-backward-up-sexp) (point)))) (t (while (not (or (sp-region-ok-p beg end) (= beg end))) (setq beg (1+ beg)))))) (if (= beg end) (progn (evil-sp--fail))))
(if (not shrink) (min beg (if (sp-point-in-empty-sexp) (evil-sp--point-after (quote sp-backward-up-sexp)) (point-max))) (let ((region (string-trim (buffer-substring-no-properties beg end)))) (if (string-blank-p region) nil (cond ((sp-point-in-empty-sexp) (setq end (save-excursion (sp-backward-up-sexp) (point)))) (t (while (not (or ... ...)) (setq beg (1+ beg)))))) (if (= beg end) (progn (evil-sp--fail)))) beg)
evil-sp--new-beginning(17767 17768 :shrink)
(let* ((beg (evil-sp--new-beginning beg end :shrink)) (end (evil-sp--new-ending beg end))) (evil-delete beg end type register yank-handler))
(condition-case nil (let ((new-beg (evil-sp--new-beginning beg end)) (new-end (evil-sp--new-ending beg end))) (if (and (= new-end end) (= new-beg beg)) (evil-delete beg end type register yank-handler) (evil-delete new-beg new-end (quote inclusive) register yank-handler))) (error (let* ((beg (evil-sp--new-beginning beg end :shrink)) (end (evil-sp--new-ending beg end))) (evil-delete beg end type register yank-handler))))
(if (or (evil-sp--override) (= beg end) (and (eq type (quote block)) (evil-sp--block-is-balanced beg end))) (evil-delete beg end type register yank-handler) (condition-case nil (let ((new-beg (evil-sp--new-beginning beg end)) (new-end (evil-sp--new-ending beg end))) (if (and (= new-end end) (= new-beg beg)) (evil-delete beg end type register yank-handler) (evil-delete new-beg new-end (quote inclusive) register yank-handler))) (error (let* ((beg (evil-sp--new-beginning beg end :shrink)) (end (evil-sp--new-ending beg end))) (evil-delete beg end type register yank-handler)))))
(if (and evil-inhibit-operator (called-interactively-p (quote any))) nil (if (or (evil-sp--override) (= beg end) (and (eq type (quote block)) (evil-sp--block-is-balanced beg end))) (evil-delete beg end type register yank-handler) (condition-case nil (let ((new-beg (evil-sp--new-beginning beg end)) (new-end (evil-sp--new-ending beg end))) (if (and (= new-end end) (= new-beg beg)) (evil-delete beg end type register yank-handler) (evil-delete new-beg new-end (quote inclusive) register yank-handler))) (error (let* ((beg (evil-sp--new-beginning beg end :shrink)) (end (evil-sp--new-ending beg end))) (evil-delete beg end type register yank-handler))))) (indent-according-to-mode))
(let ((evil-inhibit-operator evil-inhibit-operator-value)) (if (and evil-inhibit-operator (called-interactively-p (quote any))) nil (if (or (evil-sp--override) (= beg end) (and (eq type (quote block)) (evil-sp--block-is-balanced beg end))) (evil-delete beg end type register yank-handler) (condition-case nil (let ((new-beg (evil-sp--new-beginning beg end)) (new-end (evil-sp--new-ending beg end))) (if (and (= new-end end) (= new-beg beg)) (evil-delete beg end type register yank-handler) (evil-delete new-beg new-end (quote inclusive) register yank-handler))) (error (let* ((beg ...) (end ...)) (evil-delete beg end type register yank-handler))))) (indent-according-to-mode)))
(unwind-protect (let ((evil-inhibit-operator evil-inhibit-operator-value)) (if (and evil-inhibit-operator (called-interactively-p (quote any))) nil (if (or (evil-sp--override) (= beg end) (and (eq type (quote block)) (evil-sp--block-is-balanced beg end))) (evil-delete beg end type register yank-handler) (condition-case nil (let ((new-beg ...) (new-end ...)) (if (and ... ...) (evil-delete beg end type register yank-handler) (evil-delete new-beg new-end ... register yank-handler))) (error (let* (... ...) (evil-delete beg end type register yank-handler))))) (indent-according-to-mode))) (setq evil-inhibit-operator-value nil))
evil-sp-delete(17767 17768 exclusive nil)
(if (save-excursion (forward-char) (sp-point-in-empty-sexp)) (save-excursion (forward-char) (sp-delete-char)) (evil-sp-delete beg end type register))
(if (and evil-inhibit-operator (called-interactively-p (quote any))) nil (if (save-excursion (forward-char) (sp-point-in-empty-sexp)) (save-excursion (forward-char) (sp-delete-char)) (evil-sp-delete beg end type register)))
(let ((evil-inhibit-operator evil-inhibit-operator-value)) (if (and evil-inhibit-operator (called-interactively-p (quote any))) nil (if (save-excursion (forward-char) (sp-point-in-empty-sexp)) (save-excursion (forward-char) (sp-delete-char)) (evil-sp-delete beg end type register))))
(unwind-protect (let ((evil-inhibit-operator evil-inhibit-operator-value)) (if (and evil-inhibit-operator (called-interactively-p (quote any))) nil (if (save-excursion (forward-char) (sp-point-in-empty-sexp)) (save-excursion (forward-char) (sp-delete-char)) (evil-sp-delete beg end type register)))) (setq evil-inhibit-operator-value nil))
evil-sp-delete-char(17767 17768 exclusive nil)
call-interactively(evil-sp-delete-char nil nil)
command-execute(evil-sp-delete-char)
Yeah, this is expected when deleting the paren would result in an unbalanced buffer. I should probably change the error
to user-error
, though.
erroring out like that is consistent with how evil-sp works when you try to do something objectionable using the other operators (e.g. visually selecting an unbalanced region and hitting d
). The message is a little inappropriate in this case, though, because you're unlikely to be action on a region.
That's fine, was just letting you know in case it wasn't expected. Nice work!
Thanks for giving this a spin!
Having this on seems to break the
xp
operation, i.e. transposing two characters. It's like what I delete withx
doesn't get copied, and so when I paste withp
it keeps pasting the previous clipboard content.