#+TITLE: Evil Numbers

* Features
  - Increment / Decrement binary, octal, decimal and hex literals.

  - Works like =C-a= / =C-x= in VIM, i.e. searches for number up to =eol= and then
    increments or decrements.

  - When a region is active, as in evil's visual mode, all the
    numbers within that region will be incremented/decremented (unlike in VIM).

  - Increment/decrement numbers incrementally like =g C-a= / =g C-x= in VIM.

  - Optionally keep zero padding (off by default).


** Detected Literals
   - Binary, e.g. =0b0101=, =0B0101=.
   - Octal, e.g. =0o755=, =0O700=.
   - Hexadecimal, e.g. =0xDEADBEEF=, =0XCAFE=.
   - Unicode superscript and subscript, e.g. =²= and =₁=.

* Usage
  Once this package is installed, all you need to do is bind keys to
  =evil-numbers/inc-at-pt= and =evil-numbers/dec-at-pt=.

  Position cursor over or before the literal and play with your numbers!

  You may also want to bind keys to the incremental versions of these functions.

** Customization

   - =evil-numbers-pad-default= ::
     Set  to =t= if you want numbers to be padded with zeros (numbers with a leading zero are always padded).
     If you want both behaviors, all commands take an optional argument =padded=.

   - =evil-numbers-separator-chars= ::
     This option to support separator characters, set to "_" or "," to support numeric literals such as:
     =16_777_216= or =4,294,967,296=.

     You may wish to set this as a buffer local variable to enable this only for languages that support separators.

   - =evil-numbers-case= ::
     The case to use for hexadecimal numbers.

     - =nil= Current case (default).
     - '=upcase= Always upper case.
     - '=downcase= Always lower case.

   - =evil-numbers-use-cursor-at-end-of-number= ::
     Support matching numbers directly before the cursor.

     This is off by default as it doesn't follow VIM's behavior.

** Key Bindings
   Example key bindings:

   #+BEGIN_SRC emacs-lisp
     (global-set-key (kbd "C-c +") 'evil-numbers/inc-at-pt)
     (global-set-key (kbd "C-c -") 'evil-numbers/dec-at-pt)
     (global-set-key (kbd "C-c C-+") 'evil-numbers/inc-at-pt-incremental)
     (global-set-key (kbd "C-c C--") 'evil-numbers/dec-at-pt-incremental)
   #+END_SRC

   or only in evil's =normal= & =visual= states:

   #+BEGIN_SRC emacs-lisp
     (evil-define-key '(normal visual) 'global (kbd "C-c +") 'evil-numbers/inc-at-pt)
     (evil-define-key '(normal visual) 'global (kbd "C-c -") 'evil-numbers/dec-at-pt)
     (evil-define-key '(normal visual) 'global (kbd "C-c C-+") 'evil-numbers/inc-at-pt-incremental)
     (evil-define-key '(normal visual) 'global (kbd "C-c C--") 'evil-numbers/dec-at-pt-incremental)
   #+END_SRC

   Keypad =+= and =-= present an alternative that can be directly bound without shadowing the regular =+= and =-=:

   #+BEGIN_SRC emacs-lisp
     (evil-define-key '(normal visual) 'global (kbd "<kp-add>") 'evil-numbers/inc-at-pt)
     (evil-define-key '(normal visual) 'global (kbd "<kp-subtract>") 'evil-numbers/dec-at-pt)
     (evil-define-key '(normal visual) 'global (kbd "C-<kp-add>") 'evil-numbers/inc-at-pt-incremental)
     (evil-define-key '(normal visual) 'global (kbd "C-<kp-subtract>") 'evil-numbers/dec-at-pt-incremental)
   #+END_SRC

* Install

** Basic Installation
   Put in =load-path=, =(require 'evil-numbers)= and set key bindings.

** Use Package
   Assuming you have the =melpa= repository enabled, =use-package= can be used as follows.

   #+BEGIN_SRC emacs-lisp
     (use-package evil-numbers)
   #+END_SRC

* Known Bugs
  See http://github.com/juliapath/evil-numbers/issues

* Similar Packages
  - [[https://melpa.org/#/mouse-slider-mode][Mouse Slider Package]]
  - [[https://melpa.org/#/number][Number Package]]
  - [[https://melpa.org/#/shift-number][Shift Number Package]]
  - [[https://www.emacswiki.org/emacs/IncrementNumber][Emacs Wiki (Increment Number)]]

* Contributors
  - Matthew Fidler <matthew.fidler@gmail.com>
  - Michael Markert <markert.michael@gmail.com>
  - Julia Path <julia@jpath.de>
  - Campbell Barton <ideasman42@gmail.com>
