On Aug 17, 2011, at 4:29 AM, Frank Fischer wrote:
Am Mittwoch, 17. August 2011 schrieb Antono Vasiljev:
Hello all!
First of all, thank you for great Evil!
Is it hard to implement increment/decrement number at point? C-a C-x in vim
I'm emacs beginner but probably can implement it myself with some mentoring from gurus :)
Well, this is not really an evil issue. Just look at EmacsWiki for "increment number" and you will find examples, e.g.,
(defun increment-number-at-point () (interactive) (skip-chars-backward "0123456789") (or (looking-at "[0123456789]+") (error "No number at point")) (replace-match (number-to-string (1+ (string-to-number (match-string 0))))))
Just bind it globally or, if you prefer, in evil-normal-state-map
(define-key evil-normal-state-map (kbd "C-a") 'increment-number-at-point)
If you prefer some evil-fun, you can define an operator which does the same except in visual-state, where it only increments the selected number:
(evil-define-operator increment-number-at-point (beg end type) :motion evil-inner-word (let ((txt (buffer-substring-no-properties beg end))) (unless (string-match "^[0-9]+$" txt) (error "No number selected.")) (delete-region beg end) (goto-char beg) (insert (number-to-string (1+ (string-to-number txt)))) (backward-char)))
I'm sure you can figure out decrementing or even count-arguments.
Frank
This version doesn't handle negative numbers. I should post my improved version on the wiki… but here's a paste (feel free to share) http://paste.lisp.org/display/124090 There's obviously a HUGE keybinding collision with binding "c-x" to decrement number without some kind of prefix, so I decided that C-c + / C-c - would be a fine substitute. Tim