summaryrefslogtreecommitdiff
path: root/.config/emacs/site-lisp/marker.el
blob: f39cad4ba6a03b7524968f544ac5aa72c2a00d2d (plain) (blame)
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
(require 'hi-lock)
(require 'seq)

(defun marker-mark ()
  (interactive)
  (marker-mark-region (if (use-region-p)
                          (region-bounds)
                        `((,(pos-bol) . ,(pos-eol)))))
  (when (region-active-p)
    (deactivate-mark)))

(defun marker-mark-region (bounds)
  (dolist (x bounds) (marker--mark-region (car x) (cdr x))))

(defun marker--mark-region (beg end)
  (let ((ov (make-overlay beg end nil :front-advance)))
    (overlay-put ov 'priority 1)
    (overlay-put ov 'face 'hi-yellow)
    (overlay-put ov 'evaporate t)
    (overlay-put ov 'marker--mark-p t)))

(defun marker-unmark ()
  (interactive)
  (if (use-region-p)
      (marker-unmark-region (region-bounds))
    (marker-clear))
  (when (region-active-p)
    (deactivate-mark)))

(defun marker-unmark-region (bounds)
  (dolist (x bounds) (marker--unmark-region (car x) (cdr x))))

(defun marker--unmark-region (beg end)
  (dolist (ov (seq-filter (lambda (ov) (overlay-get ov 'marker--mark-p))
                          (overlays-in beg end)))
    (cond ((< (overlay-start ov) beg)
           (move-overlay ov (overlay-start ov) beg))
          ((> (overlay-end ov) end)
           (move-overlay ov end (overlay-end ov)))
          (:else
           (delete-overlay ov)))))

(defun marker-clear ()
  (interactive)
  (remove-overlays nil nil 'marker--mark-p t))

(provide 'marker)