Function: ruler-mode-ruler

ruler-mode-ruler is a byte-compiled function defined in ruler-mode.el.gz.

Signature

(ruler-mode-ruler)

Documentation

Compute and return a header line ruler.

Source Code

;; Defined in /usr/src/emacs/lisp/ruler-mode.el.gz
(defun ruler-mode-ruler ()
  "Compute and return a header line ruler."
  (let* ((w (ruler-mode-text-scaled-window-width))
         (m (window-margins))
         (f (window-fringes))
         (i (if display-line-numbers
                ;; FIXME: ruler-mode relies on I being an integer, so
                ;; the column numbers might be slightly off if the
                ;; line-number face is customized.
                (round (line-number-display-width 'columns))
              0))
         (j (ruler-mode-text-scaled-window-hscroll))
         ;; Setup the scrollbar, fringes, and margins areas.
         (lf (ruler-mode-space
              'left-fringe
              'face 'ruler-mode-fringes
              'help-echo (format ruler-mode-fringe-help-echo
                                 "Left" (or (car f) 0))))
         (rf (ruler-mode-space
              'right-fringe
              'face 'ruler-mode-fringes
              'help-echo (format ruler-mode-fringe-help-echo
                                 "Right" (or (cadr f) 0))))
         (lm (ruler-mode-space
              'left-margin
              'face 'ruler-mode-margins
              'help-echo (format ruler-mode-margin-help-echo
                                 "Left" (or (car m) 0))))
         (rm (ruler-mode-space
              'right-margin
              'face 'ruler-mode-margins
              'help-echo (format ruler-mode-margin-help-echo
                                 "Right" (or (cdr m) 0))))
         (sb (ruler-mode-space
              'scroll-bar
              'face 'ruler-mode-pad))
         ;; Remember the scrollbar vertical type.
         (sbvt (car (window-current-scroll-bars)))
         ;; Create a "clean" ruler.
         (ruler
          ;; Make the part of header-line corresponding to the
          ;; line-number display be blank, not filled with
          ;; ruler-mode-basic-graduation-char.
          (if (> i 0)
              (vconcat (make-vector i ?\s)
                       (make-vector (- w i)
                                    ruler-mode-basic-graduation-char))
             (make-vector w ruler-mode-basic-graduation-char)))
         (ruler-wide-props
          `( face ruler-mode-default
             ;; This is redundant with the minor mode map.
             ;;local-map ruler-mode-map
             help-echo ,(cond (ruler-mode-show-tab-stops
                               ruler-mode-ruler-help-echo-when-tab-stops)
                              (goal-column
                               ruler-mode-ruler-help-echo-when-goal-column)
                              (ruler-mode-ruler-help-echo))))
         (props nil)
         k c)
    ;; Setup the active area.
    (while (< i w)
      ;; Graduations.
      (cond
       ;; Show a number graduation.
       ((= (mod j 10) 0)
        (setq c (number-to-string (/ j 10))
              m (length c)
              k i)
        (push `(,i ,(1+ i) face ruler-mode-column-number) props)
        (while (and (> m 0) (>= k 0))
          (aset ruler k (aref c (setq m (1- m))))
          (setq k (1- k))))
       ;; Show an intermediate graduation.
       ((= (mod j 5) 0)
        (aset ruler i ruler-mode-inter-graduation-char)))
      ;; Special columns.
      (cond
       ;; Show the `current-column' marker.
       ((= j (current-column))
        (aset ruler i ruler-mode-current-column-char)
        (push `(,i ,(1+ i) face ruler-mode-current-column) props))
       ;; Show the `goal-column' marker.
       ((and goal-column (= j goal-column))
        (aset ruler i ruler-mode-goal-column-char)
        (push `(,i ,(1+ i)
                   help-echo ,ruler-mode-goal-column-help-echo
                   face ruler-mode-goal-column
                   mouse-face mode-line-highlight)
              props))
       ;; Show the `comment-column' marker.
       ((= j comment-column)
        (aset ruler i ruler-mode-comment-column-char)
        (push `(,i ,(1+ i)
                   help-echo ,ruler-mode-comment-column-help-echo
                   face ruler-mode-comment-column
                   mouse-face mode-line-highlight)
              props))
       ;; Show the `fill-column' marker.
       ((= j fill-column)
        (aset ruler i ruler-mode-fill-column-char)
        (push `(,i ,(1+ i)
                   help-echo ,ruler-mode-fill-column-help-echo
                   face ruler-mode-fill-column
                   mouse-face mode-line-highlight)
              props))
       ;; Show the `tab-stop-list' markers.
       ((and ruler-mode-show-tab-stops (= j (indent-next-tab-stop (1- j))))
        (aset ruler i ruler-mode-tab-stop-char)
        (push `(,i ,(1+ i) face ruler-mode-tab-stop) props)))
      (setq i (1+ i)
            j (1+ j)))

    (let ((ruler-str (concat ruler))
          (len (length ruler)))
      (add-text-properties 0 len ruler-wide-props ruler-str)
      (dolist (p (nreverse props))
        (add-text-properties (nth 0 p) (nth 1 p) (nthcdr 2 p) ruler-str))

      ;; Return the ruler propertized string.  Using list here,
      ;; instead of concat visually separate the different areas.
      (if (nth 2 (window-fringes))
          ;; fringes outside margins.
          (list "" (and (eq 'left sbvt) sb) lf lm
                ruler-str rm rf (and (eq 'right sbvt) sb))
        ;; fringes inside margins.
        (list "" (and (eq 'left sbvt) sb) lm lf
              ruler-str rf rm (and (eq 'right sbvt) sb))))))