[Top][All Lists]

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: mode-line size and position indicator

From: John Yates
Subject: Re: mode-line size and position indicator
Date: Thu, 24 Aug 2017 15:26:54 -0400

On Thu, Aug 24, 2017 at 12:55 PM, Eli Zaretskii <address@hidden> wrote:
> Looks good, although there's a fundamental problem with putting on the
> mode line an indicator that must use a significant part of the screen
> estate to be useful: the mode line is pretty crowded these days, even
> in the default configuration.

After a futile effort at IBM to obtain an FSF copyright assignment I have
given up and been too lazy to restart the effort with my new employer.
Hence my .emacs (https://github.com/jsyjr/MyConfiguration.git ) is in
the public domain.

A couple months back I posted a mode-line widget that I have been
using for some number of years.  The relevant code is appended at
the end of this message.  Notable behavior:

* Overlays proportional view of window in buffer onto line/column widget
* Supports the same mouse menu behavior as the original widget
* Highlights left edge square bracket if BOB is visible
* Highlights right edge square bracket if EOB is visible
* Hysteresis to minimize mode-line jitter

This solution does not use any more mode-line real estate than the
current line/column widget.

. . .
> I wonder whether it would have made sense to reuse the code we have
> for computing the scroll-bar thumb.

I am an inexperienced elisp hacker so I doubt that there is anything
particularly useful or novel in my code.  As the comments mention I
was much inspired by past email discussions.  The hardest part I found
was the logic corresponding to Eli's scroll-bar thumb logic.

I would love it if emacs offered essentially this functionality OOTB.


;;{{{  mode-line position-widget

;; Use a fancy widget to display buffer position on the mode line.
;; -------------------------------------------------------------------
;; Initial inspiration from an email thread between David Engster's and
;; Drew Adams:
;;   http://lists.gnu.org/archive/html/emacs-devel/2010-03/msg00523.html
;;   http://permalink.gmane.org/gmane.emacs.devel/122038
;; Further learnings from Lennart Borgman's sml-modeline.el
;;   https://www.emacswiki.org/emacs/sml-modeline.el
;; TODO: Change color if cursor exceeds limit column

(defvar buffer-max-column-visited 1
  "Accumulate max column visited to prevent mode-line jitter.")
(make-variable-buffer-local 'buffer-max-column-visited)

(defun my/position-widget ()
      ((c-n-m column-number-mode)
       (l-n-m line-number-mode)
       (wbeg (window-start))
       (wend (window-end)))


          ((eob-line  (line-number-at-pos (point-max)))
           (wbeg-line (line-number-at-pos wbeg))
           (wend-line (line-number-at-pos wend))

             ;; Leading [
             (if (= wbeg-line 1)
                 #("[" 0 1 (face mode-line-highlight-bold))
             ;; Body
             (if (not (or l-n-m c-n-m))
                 (replace-regexp-in-string "%" "%%" (format-mode-line
'(-3 "%P")))
                   ((wlines (1+ (- wend-line wbeg-line)))
                        ((not l-n-m) "")
                        ((> 10      eob-line) "%1l")
                        ((> 100     eob-line) "%2l")
                        ((> 1000    eob-line) "%3l")
                        ((> 10000   eob-line) "%4l")
                        ((> 100000  eob-line) "%5l")
                        ((> 1000000 eob-line) "%6l")
                        (t                    "%7l"))
                       (if (and l-n-m c-n-m) #("," 0 1  (face bold)) "")
                        ((not c-n-m) "")
                        (t (let*
                               ((max-col (max (current-column)
                                (field   (cond
                                          ((> 10   max-col) 3)
                                          ((> 100  max-col) 4)
                                          ((> 1000 max-col) 5)
                                          (t                6)))
                                (cur-col (current-column))
                                (digits  (cond
                                          ((> 10   cur-col) 1)
                                          ((> 100  cur-col) 2)
                                          ((> 1000 cur-col) 3)
                                          (t                4))))
                             (setq buffer-max-column-visited max-col)
                             (substring "%c     " 0 (- field digits))))))))

                    (len (length expanded))
                    (hilen (max 1           ; at least one column
                                (min len    ; no more than full string
                                     (round (/ (* wlines len)
                                               (float eob-line))))))
                    (lpad (round (/ (* wbeg-line (- len hilen))
                                    (float (- eob-line wlines -2)))))
                    (rpad (+ lpad hilen)))

                 (put-text-property lpad rpad 'face
'mode-line-highlight expanded)
             ;; Trailing ]
             (if (= wend-line eob-line)
                 #("]" 0 1 (face mode-line-highlight-bold))

         'help-echo "Buffer position widget\nmouse-1: Line and Column Mode Menu"
         'mouse-face 'mode-line-highlight
         'local-map '(keymap
                         menu-item "Global Line Number Mode" line-number-mode
                         :help "Toggle line number display"
                         :button (:toggle . line-number-mode))
                         menu-item "Global Column Number Mode"
                         :help "Toggle column number display"
                         :button (:toggle . column-number-mode))
                        "Control Line and Column Display Globally"))))))))

 '(mode-line-position '(:eval (my/position-widget)) t)


reply via email to

[Prev in Thread] Current Thread [Next in Thread]