Find file
Fetching contributors…
Cannot retrieve contributors at this time
146 lines (124 sloc) 4.75 KB
;;; visible-mark.el --- Make marks visible.
;;; Commentary:
;; This was hacked together by Jorgen Schäfer
;; And hacked again by Yann Hodique
;; Donated to the public domain. Use at your own risk.
;;; History:
;; 2008-02-21 MATSUYAMA Tomohiro <>
;; * visible-mark.el: Added function to inhibit trailing overlay.
;; 2008-01-31 MATSUYAMA Tomohiro <>
;; * visible-mark.el: Create formal emacs lisp file from
;; Yann Hodique and Jorgen Schäfer are original authors.
;; Added function to make multiple marks visible.
;;; Code:
(require 'cl))
(defgroup visible-mark nil
"Show the position of your mark."
:group 'convenience
:prefix "visible-mark-")
(defface visible-mark-face
`((((type tty) (class color))
(:background "gray" :foreground "white"))
(((type tty) (class mono))
(:inverse-video t))
(((class color) (background dark))
(:background "gray"))
(((class color) (background light))
(:background "grey80"))
(t (:background "gray")))
"Face for the mark."
:group 'visible-mark)
(defvar visible-mark-overlays nil
"The overlays used in this buffer.")
(make-variable-buffer-local 'visible-mark-overlays)
(defvar visible-mark-non-trailing-faces nil)
(defcustom visible-mark-inhibit-trailing-overlay t
"If non-nil, inhibit trailing overlay with underline face."
:group 'visible-mark
:type 'boolean)
(defcustom visible-mark-max 1
"A number of mark to be visible."
:group 'visible-mark
:type 'integer)
(defcustom visible-mark-faces nil
"A list of mark faces."
:group 'visible-mark
:type '(repeat face))
(defcustom global-visible-mark-mode-exclude-alist nil
"A list of buffer names to be excluded"
:group 'visible-mark
:type '(repeat regexp))
(defun visible-mark-initialize-faces ()
(if (and visible-mark-inhibit-trailing-overlay
(null visible-mark-non-trailing-faces))
(let (faces)
(dotimes (i visible-mark-max)
(let ((face (or (nth i visible-mark-faces) 'visible-mark-face))
(symbol (intern (format "visible-mark-non-trailing-face%s" i))))
(copy-face face symbol)
(set-face-attribute symbol nil
:foreground (or (face-attribute face :background) t)
:background 'unspecified
:underline t)
(push symbol faces)))
(setq visible-mark-non-trailing-faces (nreverse faces)))))
(defun visible-mark-initialize-overlays ()
(mapcar 'delete-overlay visible-mark-overlays)
(let (overlays)
(dotimes (i visible-mark-max)
(let ((overlay (make-overlay (point-min) (point-min))))
(push overlay overlays)))
(setq visible-mark-overlays (nreverse overlays))))
(defun visible-mark-move-overlays ()
"Move the overlay in `visible-mark-overlay' to a new position."
(let ((marks (cons (mark-marker) mark-ring))
(overlays visible-mark-overlays))
(dotimes (i visible-mark-max)
(let* ((mark (car-safe marks))
(overlay (car overlays))
(pos (and mark (marker-position mark))))
(when pos
(overlay-put overlay 'face
(if (and visible-mark-inhibit-trailing-overlay
(goto-char pos)
(nth i visible-mark-non-trailing-faces)
(or (nth i visible-mark-faces) 'visible-mark-face)))
(move-overlay overlay pos (1+ pos)))
(setq marks (cdr marks)))
(setq overlays (cdr overlays)))))
(require 'easy-mmode)
(defun visible-mark-mode-maybe ()
(when (cond
((minibufferp (current-buffer)) nil)
((flet ((fun (arg)
(if (null arg) nil
(or (string-match (car arg) (buffer-name))
(fun (cdr arg))))))
(fun global-visible-mark-mode-exclude-alist)) nil)
(t t))
(define-minor-mode visible-mark-mode
"A mode to make the mark visible."
nil nil nil
:group 'visible-mark
(if visible-mark-mode
(add-hook 'post-command-hook 'visible-mark-move-overlays nil t))
(mapcar 'delete-overlay visible-mark-overlays)
(setq visible-mark-overlays nil)
(remove-hook 'post-command-hook 'visible-mark-move-overlays t)))
global-visible-mark-mode visible-mark-mode visible-mark-mode-maybe
:group 'visible-mark)
(provide 'visible-mark)
;;; visible-mark.el ends here