-
Notifications
You must be signed in to change notification settings - Fork 2
/
reorg-actions.el
58 lines (44 loc) · 1.65 KB
/
reorg-actions.el
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
;; -*- lexical-binding: t;-*-
(defface reorg-actions-face '((t ( :foreground "black"
:background "orange")))
"reorg mark overlay face")
(defvar reorg-actions--overlay-stack nil
"overlay stack")
(defun reorg-actions-clear-overlays ()
"clear all overlays"
(interactive)
(cl-loop for overlay in reorg-actions--overlay-stack
do (delete-overlay overlay)
finally do (setq reorg-actions--overlay-stack nil)))
(defun reorg-actions--map-marks (func)
"run FUN at each mark, then clear the marks."
(prog1 (cl-loop for overlay in reorg-actions--overlay-stack
do (goto-char (overlay-start overlay))
and collect (funcall func))
(reorg-actions-clear-overlays)))
(defun reorg-actions-mark-entry ()
"mark the current entry"
(interactive)
(if (reorg--at-leaf-p)
(let ((overlay (reorg-actions--draw-overlay)))
(push overlay reorg-actions--overlay-stack)
(forward-line)
(run-hooks 'reorg--navigation-hook))
(message "You can't mark a branch.")))
(defun reorg-actions--draw-overlay ()
"draw a mark overlay"
(let ((overlay (make-overlay (point-at-bol) (point-at-eol))))
(overlay-put overlay 'font-lock-face 'reorg-actions-face)
(overlay-put overlay 'reorg t)
overlay))
(defun reorg-actions--marks-p ()
"are entries in the buffer marked?"
reorg-actions--overlay-stack)
(defun reorg-actions--multi-action-maybe (func)
"if there are marks active, run command for each one"
(if (reorg-actions--marks-p)
(reorg-actions--map-marks func)
(funcall func)))
(define-key reorg-mode-map (kbd "m") #'reorg-actions-mark-entry)
(define-key reorg-mode-map (kbd "M") #'reorg-actions-clear-overlays)
(provide 'reorg-actions)