Skip to content

Instantly share code, notes, and snippets.

@emdeesee
Last active November 30, 2017 22:09
Show Gist options
  • Save emdeesee/497aa8eb883e92752fb634bb3c709db9 to your computer and use it in GitHub Desktop.
Save emdeesee/497aa8eb883e92752fb634bb3c709db9 to your computer and use it in GitHub Desktop.
Mutate integer at point
(require 'thingatpt)
(defun beginning-of-integer-at-point ()
(let ((inhibit-changing-match-data t))
(skip-chars-backward "[[:digit:]]")
(unless (looking-at "[[:digit:]]")
(error "No integer here"))
(when (looking-back "[+-]")
(backward-char 1))))
(put 'integer 'beginning-op 'beginning-of-integer-at-point)
(defun end-of-integer-at-point ()
(let ((inhibit-changing-match-data t))
(when (looking-at "[+-]")
(forward-char 1))
(skip-chars-forward "[[:digit:]]")
(unless (looking-back "[[:digit:]]")
(error "No integer here"))))
(put 'integer 'end-op 'end-of-integer-at-point)
(defun bounds-of-integer-at-point ()
(save-excursion
(let (beg end)
(beginning-of-integer-at-point)
(setq beg (point))
(end-of-integer-at-point)
(setq end (point))
(cons beg end))))
(put 'integer 'bounds-of-thing-at-point 'bounds-of-integer-at-point)
(defun get-integer-at-point ()
(let ((bounds (bounds-of-integer-at-point)))
(string-to-number (buffer-substring (car bounds) (cdr bounds)))))
(put 'integer 'thing-at-point 'get-integer-at-point)
(defun increment-integer-at-point (&optional inc)
(interactive "p")
(let* ((bounds (bounds-of-integer-at-point))
(n (+ (get-integer-at-point) (or inc 1)))
(leading-+ (when (and (> n 0)
(save-excursion
(goto-char (car bounds))
(looking-at "\+"))) "+")))
(delete-region (car bounds) (cdr bounds))
(insert (concat leading-+ (int-to-string n)))))
(defun decrement-integer-at-point (&optional dec)
(interactive "p")
(increment-integer-at-point (- (or dec 1))))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment