Skip to content

Instantly share code, notes, and snippets.

@emallson
Created November 1, 2016 16:38
Show Gist options
  • Save emallson/0f42ac32ecf524d6f47410b8a718d8c7 to your computer and use it in GitHub Desktop.
Save emallson/0f42ac32ecf524d6f47410b8a718d8c7 to your computer and use it in GitHub Desktop.
(require 'ov)
(defcustom symbol-overlay-alist nil
"Alist used to overlay symbols in `symbol-overlay-mode'. Each
key should be a regexp, and each value should be the string to
be displayed in the overlay."
:type 'alist
:group 'symbol-overlay)
(defun symbol-overlay-modification-hook (overlay afterp _beg _end &optional len)
(let ((inhibit-modification-hooks t))
(if afterp
(unless (= len 0)
(delete-overlay overlay)))))
(defun symbol-overlay-within-line (pair)
(let* ((regexp (car pair))
(replacement (cdr pair))
(overlay (ov-regexp regexp (line-beginning-position) (line-end-position))))
(ov-set overlay
'category 'symbol-overlay
'display (if (characterp replacement)
(char-to-string replacement)
replacement)
'modification-hooks '(symbol-overlay-modification-hook))))
(defun symbol-overlay-current-line (_beg _end _len)
(save-excursion
(ov-clear 'category 'symbol-overlay (line-beginning-position) (line-end-position))
(-flatten (mapcar #'symbol-overlay-within-line symbol-overlay-alist))))
(defun symbol-overlay-buffer (&optional no-clearp)
"Overlay the entire buffer. If `no-clearp' is nil, clear
overlays with category `symbol-overlay' first."
(interactive)
(save-excursion
(unless no-clearp
(ov-clear 'category 'symbol-overlay))
(while (not (eobp))
(symbol-overlay-current-line nil nil nil)
(forward-line))))
(define-minor-mode symbol-overlay-mode
"Display symbols in overlays replacing regexps.
Please don't shoot yourself in the foot. Use fast regexps. All
regexps are (currently) limited to matching within a line."
:lighter " SyOv"
(if (not (null symbol-overlay-mode))
(progn
(symbol-overlay-buffer t)
(add-hook 'after-change-functions #'symbol-overlay-current-line t t))
(progn (ov-clear 'category 'symbol-overlay)
(remove-hook 'after-change-functions #'symbol-overlay-current-line t))))
(provide 'symbol-overlay)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment