summaryrefslogtreecommitdiff
path: root/iota.el
diff options
context:
space:
mode:
authorThomas Voss <mail@thomasvoss.com> 2023-08-19 02:01:51 +0200
committerThomas Voss <mail@thomasvoss.com> 2023-08-19 02:01:51 +0200
commitb468962a0d8e4e49b8ba2aee7a6b40c764643f08 (patch)
tree65e439f535b85b7a67f34582105234d8e5999eaf /iota.el
Genesis commit
Diffstat (limited to 'iota.el')
-rw-r--r--iota.el67
1 files changed, 67 insertions, 0 deletions
diff --git a/iota.el b/iota.el
new file mode 100644
index 0000000..0d1c8cc
--- /dev/null
+++ b/iota.el
@@ -0,0 +1,67 @@
+;;; iota.el --- Replace marker with increasing integers
+
+;; Copyright © 2023 Thomas Voss
+
+;; Author: Thomas Voss <mail@thomasvoss.com>
+;; Keywords: accumulator increment
+;; URL: https://git.sr.ht/~mango/iota
+;; Version: 1.0.0
+
+;; Permission to use, copy, modify, and/or distribute this software for any
+;; purpose with or without fee is hereby granted.
+;;
+;; THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
+;; REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+;; AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
+;; INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
+;; LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
+;; OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+;; PERFORMANCE OF THIS SOFTWARE.
+
+;;; Commentary:
+
+;; Iota is a very simple package that provides an easy way to replace strings in
+;; a region with an incrementing count. This can be useful in a variety of
+;; settings for doing things such as creating numbered lists, creating
+;; enumerations, and more. The substrings to match are defined by the variable
+;; ‘iota-regexp’ while the functions ‘iota’ and ‘iota-complex’ offer simple- and
+;; advanced methods of enumeration. You probably do not want to use these
+;; functions in your emacs-lisp code; they are intended for interactive use.
+
+;;; Code:
+
+(defcustom iota-regexp "\\<N\\>"
+ "Regular expression to match substrings that should be replaced with the
+accumulator."
+ :type '(regexp))
+
+(defun iota (start end &optional initial)
+ "Replace all substrings in the region of START and END that match the regular
+expression defined by ‘iota-regexp’ with incrementing integers beginning with
+INITIAL or 1 if INITIAL is nil. When called interactively, the universal
+argument can be used to specify INITIAL."
+ (interactive "*r\np")
+ (iota--internal start end initial #'1+))
+
+(defun iota-complex (start end &optional initial function)
+ "Replace all substrings in the region of START and END that match the regular
+expression defined by ‘iota-regexp’ with the result of calling FUNCTION with the
+argument N which starts at INITIAL and increments by 1 every replacement."
+ (interactive "*r\nnInitial value: \nxFunction: ")
+ (iota--internal start end initial function))
+
+(defun iota--internal (start end initial function)
+ (let ((m1 (make-marker))
+ (m2 (make-marker))
+ (initial (or initial 1)))
+ (set-marker m1 start)
+ (set-marker m2 end)
+ (save-mark-and-excursion
+ (save-match-data
+ (goto-char m1)
+ (while (re-search-forward iota-regexp m2 'noerror)
+ (replace-match (int-to-string initial))
+ (setq initial (apply function initial nil)))))))
+
+(provide 'iota)
+;;; iota.el ends here