diff options
author | Thomas Voss <mail@thomasvoss.com> | 2024-10-16 22:04:33 +0200 |
---|---|---|
committer | Thomas Voss <mail@thomasvoss.com> | 2024-10-16 22:04:33 +0200 |
commit | 0ee7fa9c382ae30295f0b8d88457f7856c7ff800 (patch) | |
tree | 6b5a0cf01fa0bfa4d01b0134b268f5d993055c0b /.config/emacs/increment.el | |
parent | d452ae1347b3711bc0a7ac80cfa2c37d9d63836e (diff) |
emacs: Overhaul configuration completely
Diffstat (limited to '.config/emacs/increment.el')
-rw-r--r-- | .config/emacs/increment.el | 132 |
1 files changed, 0 insertions, 132 deletions
diff --git a/.config/emacs/increment.el b/.config/emacs/increment.el deleted file mode 100644 index 801ae4e..0000000 --- a/.config/emacs/increment.el +++ /dev/null @@ -1,132 +0,0 @@ -;;; increment.el -- Increment numbers at point -*- lexical-binding: t; -*- - -(require 'cl-macs) -(require 'rx) - -(defvar increment--binary-number-regexp - (rx (group (or ?- word-start)) - "0b" - (group (* ?0)) - (group (+ (any "01"))) - word-end)) - -(defvar increment--octal-number-regexp - (rx (group (or ?- word-start)) - "0o" - (group (* ?0)) - (group (+ (any "0-7"))) - word-end)) - -(defvar increment--decimal-number-regexp - (rx (group (? ?-)) - (group (* ?0)) - (group (+ (any digit))))) - -(defvar increment--hexadecimal-number-regexp - (rx (group (or ?- word-start)) - "0x" - (group (* ?0)) - (group (+ (any hex-digit))) - word-end)) - -(defvar increment--hexadecimal-lower-number-regexp - (rx (group (or ?- word-start)) - "0o" - (group (* ?0)) - (group (+ (any "0-9a-f"))) - word-end)) - -(defvar increment--number-regexp - (rx (or (seq (or ?- word-start) - (or (seq "0b" (+ (any "01"))) - (seq "0o" (+ (any "0-7"))) - (seq "0x" (+ (any hex-digit)))) - word-end) - (seq (? ?-) (+ (any digit)))))) - -(defun increment--number-to-binary-string (number) - (nreverse - (cl-loop for x = number then (lsh x -1) - while (not (= x 0)) - concat (if (= 0 (logand x 1)) "0" "1")))) - -(defun increment--format-number-with-base - (number base leading-zeros buffer-substr hex-style) - (let* ((neg (> 0 number)) - (number (abs number)) - (number-string - (pcase base - (2 (increment--number-to-binary-string number)) - (8 (format "%o" number)) - (10 (number-to-string number)) - (16 (format (if (eq hex-style 'lower) "%x" "%X") number)))) - (length-diff (- (length buffer-substr) - (length number-string))) - (leading-zeros (if (> leading-zeros 0) - (+ leading-zeros length-diff) - 0))) - (concat - (when neg - "-") - (pcase base - (2 "0b") - (8 "0o") - (16 "0x")) - (when (> leading-zeros 0) - (make-string leading-zeros ?0)) - number-string))) - -(defun increment--match-number-at-point () - (cond ((thing-at-point-looking-at - increment--binary-number-regexp) - (cons 2 nil)) - ((thing-at-point-looking-at - increment--octal-number-regexp) - (cons 8 nil)) - ((thing-at-point-looking-at - increment--hexadecimal-number-regexp) - (cons 16 nil)) - ((thing-at-point-looking-at - increment--hexadecimal-lower-number-regexp) - (cons 16 'lower)) - ((thing-at-point-looking-at - increment--decimal-number-regexp) - (cons 10 nil)))) - -;;;###autoload -(cl-defun increment-number-at-point (&optional arg) - "Increment the number at point by ARG or 1 if ARG is nil. If called -interactively, the universal argument can be used to specify ARG. If -the number at point has leading zeros then the width of the number is -preserved." - (interactive "*p") - (save-match-data - (let (case-fold-search - (match-pair (increment--match-number-at-point))) - (unless match-pair - (let ((save-point (point))) - (unless (re-search-forward - increment--number-regexp - (line-end-position) :noerror) - (goto-char save-point) - (cl-return-from increment-number-at-point)) - (setq match-pair (increment--match-number-at-point)))) - (let* ((base (car match-pair)) - (hex-style (cdr match-pair)) - (substr (buffer-substring-no-properties - (match-beginning 3) (match-end 3))) - (sign (if (= (match-beginning 1) (match-end 1)) +1 -1)) - (result (+ (* (string-to-number substr base) sign) - (or arg 1)))) - (replace-match - (increment--format-number-with-base - result base (- (match-end 2) (match-beginning 2)) - substr hex-style)))))) - -;;;###autoload -(defun decrement-number-at-point (&optional arg) - "The same as `increment-number-at-point', but ARG is negated." - (interactive "*p") - (increment-number-at-point (- (or arg 1)))) - -(provide 'increment) |