Created
November 1, 2016 16:38
-
-
Save emallson/0f42ac32ecf524d6f47410b8a718d8c7 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(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