evil: work on support for ]p, [p (adjust indent on paste)

Gordon Gustafson gordon3.14 at gmail.com
Mon Jun 30 04:04:18 CEST 2014

You may already know this, but you're going to want to define new
commands for [p and ]p using the macro evil-define-command. I haven't
though it all the way through yet, but you'll probably call
evil-paste-before or evil-paste-after at the beginning and then
reindent what was pasted. This should ensure that the commands are a
single undo step. I'm not sure about evil-paste-pop, but if you post
code for the commands I described I can see if you need to do anything
funky to get it working. :)


---Gordon Gustafson

On 6/28/14, Gordon Gustafson <gordon3.14 at gmail.com> wrote:
> I was just going to implement the same thing! I'll take a look at it
> tomorrow and see if I can offer any assistance. (I sent this
> preliminary email so you wouldn't think the mailing list was dead :)
> On 6/27/14, Johann Klähn <kljohann at gmail.com> wrote:
>> Hi there,
>> I would like to work on a patch to add support for ]p and [p to evil. I
>> have some working code (see below) to adjust the indent after a call to
>> evil-paste-after / evil-paste-before, but I would appreciate tips on how
>> to
>> integrate this with existing evil code (especially so that ]p will be a
>> single undo step, that evil-paste-pop still works, ...).
>> All the best,
>> Johann
>> (defun get-common-indent-in-region (start end)
>>   (setq end (copy-marker end))
>>   (unwind-protect
>>       (let (indentation)
>>         (save-excursion
>>           (goto-char start)
>>           (or (bolp) (forward-line 1))
>>           (while (< (point) end)
>>             (skip-chars-forward " \t")
>>             (setq indentation
>>                   (cons (current-column) indentation))
>>             (forward-line 1)))
>>         (apply #'min indentation))
>>     (move-marker end nil)))
>> (defun my-evil-adjust-indent-afer-paste ()
>>   (interactive)
>>   (unless (memq last-command
>>                 '(evil-paste-after
>>                   evil-paste-before))
>>     (error "Previous command was not a line-wise evil-paste: %s"
>> last-command))
>>   (let* ((start (evil-get-marker ?\[))
>>          (end (evil-get-marker ?\]))
>>          (common (get-common-indent-in-region start end))
>>          (this
>>           (save-excursion
>>             (cond
>>              ((eq last-command 'evil-paste-before)
>>               (goto-char end)
>>               (forward-line 1))
>>              (t
>>               (goto-char start)
>>               (forward-line -1)))
>>             (skip-chars-forward " \t")
>>             (current-column))))
>>     (indent-rigidly start end (- this common))))

More information about the implementations-list mailing list