summaryrefslogtreecommitdiff
path: root/.config/emacs/site-lisp/marker.el
blob: 5bc1dd24827de121f4ba6a5a4908a45774d218b6 (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
48
49
50
(require 'hi-lock)
(require 'seq)

(defvar-local marker--overlays nil)

(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)
    (push ov marker--overlays)))

(defun marker-unmark ()
  (interactive)
  (marker-unmark-region (if (use-region-p)
                            (region-bounds)
                          `((,(pos-bol) . ,(pos-eol)))))
  (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) (memq ov marker--overlays))
                          (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)
  (mapc #'delete-overlay marker--overlays)
  (setq marker--overlays nil))

(provide 'marker)