expez / evil-smartparens

Evil integration for Smartparens
GNU General Public License v3.0
134 stars 17 forks source link

x doesn't work like in evil #21

Closed blaenk closed 9 years ago

blaenk commented 9 years ago

Having this on seems to break the xp operation, i.e. transposing two characters. It's like what I delete with x doesn't get copied, and so when I paste with p it keeps pasting the previous clipboard content.

blaenk commented 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.

expez commented 9 years ago

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.

blaenk commented 9 years ago

No worries, it's not that big of a deal and can easily be worked around.

expez commented 9 years ago

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.

blaenk commented 9 years ago

I'll check it out!

blaenk commented 9 years ago

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)
expez commented 9 years ago

Yeah, this is expected when deleting the paren would result in an unbalanced buffer. I should probably change the error to user-error, though.

expez commented 9 years ago

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.

blaenk commented 9 years ago

That's fine, was just letting you know in case it wasn't expected. Nice work!

expez commented 9 years ago

Thanks for giving this a spin!