diff options
Diffstat (limited to 'lisp/+hungry-delete.el')
-rw-r--r-- | lisp/+hungry-delete.el | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/lisp/+hungry-delete.el b/lisp/+hungry-delete.el new file mode 100644 index 0000000..601aecf --- /dev/null +++ b/lisp/+hungry-delete.el | |||
@@ -0,0 +1,53 @@ | |||
1 | ;;; +hungry-delete.el -*- lexical-binding: t; -*- | ||
2 | |||
3 | ;; Copyright (C) 2022 Case Duckworth | ||
4 | |||
5 | ;;; Code: | ||
6 | |||
7 | (require 'hungry-delete) | ||
8 | |||
9 | (defmacro +hungry-delete-define-alternative (func hd-func &optional direction) | ||
10 | "Define a `hungry-delete' alternative for FUNC. | ||
11 | If the adjacent characters in DIRECTION are one of | ||
12 | `hungry-delete-chars-to-skip', call HD-FUNC. Otherwise, call | ||
13 | FUNC. | ||
14 | |||
15 | If DIRECTION is a positive integer or `forward', look forward. | ||
16 | If it's negative or `backward', look backward. If it's absent, | ||
17 | this macro will try to guess based on the names of FUNC and | ||
18 | HD-FUNC. | ||
19 | |||
20 | This macro creates a function taking a prefix argument that's | ||
21 | passed to both of FUNC and HD-FUNC." | ||
22 | (let ((name (intern (format "%s|%s" func hd-func))) | ||
23 | (lookfn (cond | ||
24 | ((or (and (string-match-p "forward" (symbol-name func)) | ||
25 | (string-match-p "forward" (symbol-name hd-func)) | ||
26 | (not direction)) | ||
27 | (and (integerp direction) | ||
28 | (< 0 direction)) | ||
29 | (eq direction 'forward)) | ||
30 | 'looking-at) | ||
31 | ((or (and (string-match-p "backward" (symbol-name func)) | ||
32 | (string-match-p "backward" (symbol-name hd-func)) | ||
33 | (not direction)) | ||
34 | (and (integerp direction) | ||
35 | (> 0 direction)) | ||
36 | (eq direction 'backward)) | ||
37 | 'looking-back) | ||
38 | (:else (error "Bad direction: %S" direction)))) | ||
39 | (arg (gensym))) | ||
40 | `(defun ,name (,arg) | ||
41 | ,(concat (format "Do `%s' or `%s', depending on whitespace.\n" | ||
42 | func hd-func) | ||
43 | (format "Pass prefix argument %s to the underlying functions.\n" | ||
44 | (upcase (symbol-name arg))) | ||
45 | "This function was defined by `define-hungry-delete-alternative'.") | ||
46 | (interactive "*p") ; This is brittle | ||
47 | (if (,lookfn (format "[%s]" hungry-delete-chars-to-skip)) | ||
48 | (,hd-func (or ,arg 1)) | ||
49 | (,func ,arg))))) | ||
50 | |||
51 | (provide '+hungry-delete) | ||
52 | ;;; +hungry-delete.el ends here | ||
53 | |||