From 93c94a6f829f6682bdcde4d9ff04f9a1728dc0bf Mon Sep 17 00:00:00 2001 From: Bozhidar Batsov Date: Thu, 25 Jul 2013 15:51:01 +0300 Subject: [PATCH] Add commands to increment and decrement an integer at point --- README.md | 2 ++ core/prelude-core.el | 61 ++++++++++++++++++++++++++++++++++++++++++++ core/prelude-mode.el | 6 ++++- 3 files changed, 68 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 06a8831..50f78d9 100644 --- a/README.md +++ b/README.md @@ -232,6 +232,8 @@ Keybinding | Description C-c t | Open a terminal emulator (`ansi-term`). C-c k | Kill all open buffers except the one you're currently in. C-c h | Open Helm (a useful means of navigating your buffers and project files). +C-c + | Increment integer at point. +C-c - | Decrement integer at point. Super-r | Recent files Super-x | Expand region Super-j | Join lines diff --git a/core/prelude-core.el b/core/prelude-core.el index 3f2d033..1962e20 100644 --- a/core/prelude-core.el +++ b/core/prelude-core.el @@ -453,5 +453,66 @@ Doesn't mess with special buffers." (prelude-recompile-init) (message "Update finished. Restart Emacs to complete the process."))) +(defun thing-at-point-goto-end-of-integer () + "Go to end of integer at point." + (let ((inhibit-changing-match-data t)) + ;; Skip over optional sign + (when (looking-at "[+-]") + (forward-char 1)) + ;; Skip over digits + (skip-chars-forward "[[:digit:]]") + ;; Check for at least one digit + (unless (looking-back "[[:digit:]]") + (error "No integer here")))) +(put 'integer 'beginning-op 'thing-at-point-goto-end-of-integer) + +(defun thing-at-point-goto-beginning-of-integer () + "Go to end of integer at point." + (let ((inhibit-changing-match-data t)) + ;; Skip backward over digits + (skip-chars-backward "[[:digit:]]") + ;; Check for digits and optional sign + (unless (looking-at "[+-]?[[:digit:]]") + (error "No integer here")) + ;; Skip backward over optional sign + (when (looking-back "[+-]") + (backward-char 1)))) +(put 'integer 'beginning-op 'thing-at-point-goto-beginning-of-integer) + +(defun thing-at-point-bounds-of-integer-at-point () + "Get boundaries of integer at point." + (save-excursion + (let (beg end) + (thing-at-point-goto-beginning-of-integer) + (setq beg (point)) + (thing-at-point-goto-end-of-integer) + (setq end (point)) + (cons beg end)))) +(put 'integer 'bounds-of-thing-at-point 'thing-at-point-bounds-of-integer-at-point) + +(defun thing-at-point-integer-at-point () + "Get integer at point." + (let ((bounds (bounds-of-thing-at-point 'integer))) + (string-to-number (buffer-substring (car bounds) (cdr bounds))))) +(put 'integer 'thing-at-point 'thing-at-point-integer-at-point) + +(defun prelude-increment-integer-at-point (&optional inc) + "Increment integer at point by one. + +With numeric prefix arg INC, increment the integer by INC amount." + (interactive "p") + (let ((inc (or inc 1)) + (n (thing-at-point 'integer)) + (bounds (bounds-of-thing-at-point 'integer))) + (delete-region (car bounds) (cdr bounds)) + (insert (int-to-string (+ n inc))))) + +(defun prelude-decrement-integer-at-point (&optional dec) + "Decrement integer at point by one. + +With numeric prefix arg DEC, decrement the integer by DEC amount." + (interactive "p") + (prelude-increment-integer-at-point (- (or dec 1)))) + (provide 'prelude-core) ;;; prelude-core.el ends here diff --git a/core/prelude-mode.el b/core/prelude-mode.el index d1db0aa..cb3343d 100644 --- a/core/prelude-mode.el +++ b/core/prelude-mode.el @@ -60,6 +60,8 @@ (define-key map (kbd "C-c k") 'prelude-kill-other-buffers) (define-key map (kbd "C-c TAB") 'prelude-indent-rigidly-and-copy-to-clipboard) (define-key map (kbd "C-c h") 'helm-prelude) + (define-key map (kbd "C-c +") 'prelude-increment-integer-at-point) + (define-key map (kbd "C-c -") 'prelude-decrement-integer-at-point) ;; make some use of the Super key (define-key map [?\s-d] 'projectile-find-dir) (define-key map [?\s-p] 'projectile-switch-project) @@ -99,7 +101,9 @@ ["Duplicate line or region" prelude-duplicate-current-line-or-region] ["Indent rigidly and copy to clipboard" prelude-indent-rigidly-and-copy-to-clipboard] ["Insert date" prelude-insert-date] - ["Eval and replace" prelude-eval-and-replace]) + ["Eval and replace" prelude-eval-and-replace] + ["Increment integer at point" prelude-increment-integer-at-point] + ["Decrement integer at point" prelude-decrement-integer-at-point]) ("Navigation" ["Helm" helm-prelude])