emacs-elpa-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[nongnu] elpa/evil-numbers 30b13905a7 013/145: Move search and replace o


From: ELPA Syncer
Subject: [nongnu] elpa/evil-numbers 30b13905a7 013/145: Move search and replace out of increment.
Date: Thu, 6 Jan 2022 03:00:14 -0500 (EST)

branch: elpa/evil-numbers
commit 30b13905a7df2b5ed98d7117cdfbd94c59153dc7
Author: Michael Markert <markert.michael@googlemail.com>
Commit: Michael Markert <markert.michael@googlemail.com>

    Move search and replace out of increment.
    
    Signed-off-by: Michael Markert <markert.michael@googlemail.com>
---
 evil-numbers.el | 44 +++++++++++++++++++++++---------------------
 1 file changed, 23 insertions(+), 21 deletions(-)

diff --git a/evil-numbers.el b/evil-numbers.el
index 8d19ab47bf..804cde1247 100644
--- a/evil-numbers.el
+++ b/evil-numbers.el
@@ -49,31 +49,15 @@
         (error "No number at point or until end of line")
       (or
        ;; find binary literals
-       (when (looking-back "0[bB][01]*")
-         (skip-chars-backward "01")
-         (search-forward-regexp "[01]*")
-         (replace-match
-          (evil-numbers/format-binary (+ amount (string-to-number 
(match-string 0) 2))
-                                      (- (match-end 0) (match-beginning 0))))
-         t)
+       (evil-numbers/search-and-replace "0[bB][01]*" "01" "\\([01]+\\)" amount 
2)
 
        ;; find octal literals
-       (when (looking-back "0[oO][0-7]*")
-         (skip-chars-backward "01234567")
-         (search-forward-regexp "[0-7]+")
-         (replace-match
-          (format (format "%%0%do" (- (match-end 0) (match-beginning 0)))
-                  (+ amount (string-to-number (match-string 0) 8))))
-         t)
+       (evil-numbers/search-and-replace "0[oO][0-7]*" "01234567" 
"\\([0-7]+\\)" amount 8)
 
        ;; find hex literals
-       (when (looking-back "0[xX][0-9a-fA-F]*")
-         (skip-chars-backward "0123456789abcdefABCDEF")
-         (search-forward-regexp "[0-9a-fA-F]+")
-         (replace-match
-          (format (format "%%0%dX" (- (match-end 0) (match-beginning 0)))
-                  (+ amount (string-to-number (match-string 0) 16))))
-         t)
+       (evil-numbers/search-and-replace "0[xX][0-9a-fA-F]*"
+                                        "0123456789abcdefABCDEF"
+                                        "\\([0-9a-fA-F]+\\)" amount 16)
 
        ;; find decimal literals
        (progn
@@ -118,6 +102,24 @@ decimal: [0-9]+, e.g. 42 or 23"
      ;; skip format specifiers and interpret as bool
      (<= 0 (skip-chars-forward "bBoOxX")))))
 
+(defun evil-numbers/search-and-replace (look-back skip-back search-forward inc 
base)
+  "When looking back at `LOOK-BACK' skip chars `SKIP-BACK'backwards and 
replace number incremented by `INC' in `BASE' and return non-nil."
+  (when (looking-back look-back)
+    (skip-chars-backward skip-back)
+    (search-forward-regexp search-forward)
+    (replace-match (evil-numbers/format (+ inc (string-to-number (match-string 
1) base))
+                                        (length (match-string 1))
+                                        base))
+    t))
+
+(defun evil-numbers/format (num width base)
+  "Format `NUM' with at least `WIDTH' space in `BASE'"
+  (cond
+   ((= base 2) (evil-numbers/format-binary num width))
+   ((= base 8) (format (format "%%0%do" width) num))
+   ((= base 16) (format (format "%%0%dX" width) num))
+   (t "")))
+
 (defun evil-numbers/format-binary (number &optional width fillchar)
   "Format `NUMBER' as binary.
 Fill up to `WIDTH' with `FILLCHAR' (defaults to ?0) if binary



reply via email to

[Prev in Thread] Current Thread [Next in Thread]