use mapc instead of mapcar where appropriate
[visible-mark] / visible-mark.el
index 1b6c552f2e6b35b719cf3ee24053dbed243a5414..8bc719a85fa22ed4e9a72778843c66ef5eee2b74 100644 (file)
 
 (defface visible-mark-face
   `((((type tty) (class color))
-     (:background "gray" :foreground "white"))
+     (:background "gray" :foreground "black"))
     (((type tty) (class mono))
      (:inverse-video t))
     (((class color) (background dark))
-     (:background "gray"))
+     (:background "gray" :foreground "black"))
     (((class color) (background light))
      (:background "grey80"))
     (t (:background "gray")))
@@ -46,8 +46,6 @@
   "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
   "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)
+  (mapc 'delete-overlay visible-mark-overlays)
   (let (overlays)
     (dotimes (i visible-mark-max)
       (let ((overlay (make-overlay (point-min) (point-min))))
+        (overlay-put overlay 'category 'visible-mark)
         (push overlay overlays)))
     (setq visible-mark-overlays (nreverse overlays))))
 
+(defun visible-mark-find-overlay-at (pos)
+  (let ((overlays (overlays-at pos))
+        found)
+    (while (and overlays (not found))
+      (let ((overlay (car overlays)))
+        (if (eq 'visible-mark (overlay-get overlay 'category))
+            (setq found overlay)))
+      (setq overlays (cdr overlays)))
+    found))
+
 (defun visible-mark-move-overlays ()
   "Move the overlay in `visible-mark-overlay' to a new position."
+  (mapc (lambda (x) (move-overlay x 0 0))
+        visible-mark-overlays)
   (let ((marks (cons (mark-marker) mark-ring))
         (overlays visible-mark-overlays))
     (dotimes (i visible-mark-max)
              (overlay (car overlays))
              (pos (and mark (marker-position mark))))
         (when pos
-          (overlay-put overlay 'face
-                       (if (and visible-mark-inhibit-trailing-overlay
-                                (save-excursion
-                                  (goto-char pos)
-                                  (eolp)))
-                           (nth i visible-mark-non-trailing-faces)
-                         (or (nth i visible-mark-faces) 'visible-mark-face)))
-          (move-overlay overlay pos (1+ pos)))
+          (cond
+            ((and visible-mark-inhibit-trailing-overlay
+                  (save-excursion (goto-char pos) (eolp)))
+             (overlay-put overlay 'face nil)
+             (if (visible-mark-find-overlay-at pos)
+                 (progn (overlay-put overlay 'before-string nil)
+                        (move-overlay overlay 0 0))
+                 (overlay-put overlay 'before-string
+                              (propertize
+                               " "
+                               'face (or (nth i visible-mark-faces) 'visible-mark-face)
+                               'cursor 0))
+                 (move-overlay overlay pos (1+ pos))))
+            (t
+             (overlay-put overlay 'before-string nil)
+             (overlay-put overlay 'face
+                          (or (nth i visible-mark-faces) 'visible-mark-face))
+             (move-overlay overlay pos (1+ pos)))))
         (setq marks (cdr marks)))
-        (setq overlays (cdr overlays)))))
+      (setq overlays (cdr overlays)))))
 
 (require 'easy-mmode)
 
                             (fun (cdr arg))))))
             (fun global-visible-mark-mode-exclude-alist)) nil)
          (t t))
-    (visible-mark-mode)))
+    (visible-mark-mode t)))
 
 (define-minor-mode visible-mark-mode
   "A mode to make the mark visible."
   :group 'visible-mark
   (if visible-mark-mode
       (progn
-        (visible-mark-initialize-faces)
         (visible-mark-initialize-overlays)
         (add-hook 'post-command-hook 'visible-mark-move-overlays nil t))
-    (mapcar 'delete-overlay visible-mark-overlays)
+    (mapc 'delete-overlay visible-mark-overlays)
     (setq visible-mark-overlays nil)
     (remove-hook 'post-command-hook 'visible-mark-move-overlays t)))