Re: scrollbar alternative

From:

David Engster

Subject:

Re: scrollbar alternative

Date:

Mon, 15 Mar 2010 18:28:00 +0100

User-agent:

Gnus/5.110011 (No Gnus v0.11) Emacs/23.1.92 (darwin)

<address@hidden> writes:
> David Engster wrote a neat package called minimap.el. It renders the
> current buffer with tiny fonts, in a mini window besides the current
> buffer. The mini-window has an overlay showing the position in the main
> window.
>
> It could be modified to replace a scrollbar.
>
> I sometimes use minimap.el, but I never use scrollbars.
Maybe that's a bit much. I think the minimap is useful for certain
things, like getting a quick glance of the overall structure of some
code.
Like many others, I never used the scrollbars for scrolling, but for
getting a quick and rough impression on a) the size of the buffer, and
b) the part of the buffer which is currently displayed.
To me, the GTK scrollbars always behaved a bit strange in this regard,
anyway. For example, I think scrollbars should be hidden when there is
nothing to scroll, this way giving you an immediate optical hint that
you're currently seeing everything there is. But in Emacs, you can
always scroll the window until (window-start) reaches (point-max).
Therefore, I also disabled the scrollbar and now use some code to get a
scrollbar-like display in the mode-line. I know there's
size-indication-mode, but I find an information like "13% of 2.8k" not
very helpful.
Regards,
David
This is the code I currently use:
(defvar size-mode-line-max-length 30)
(defvar size-mode-line-beginstr "--[")
(defvar size-mode-line-endstr "]--")
(defun size-mode-line-create ()
(let* ((start (window-start))
(end (window-end))
(mlength (if (evenp size-mode-line-length)
(1- size-mode-line-length) size-mode-line-length))
(beginning (floor (* (/ (float start) (float (point-max))) mlength)))
(percentage (/ (float end) (float (point-max))))
(end (ceiling (* percentage mlength)))
string)
(if (or (< end mlength)
(> start (point-min)))
(progn
(setq string
(concat size-mode-line-beginstr
(make-string (- (/ mlength 2) 2) 32)
(format "%3d" (round (* percentage 100))) "%%"
(make-string (- (/ mlength 2) 2) 32)
size-mode-line-endstr))
(setq beginning (+ beginning (length size-mode-line-beginstr)))
(when (= beginning
(setq end (+ end (length size-mode-line-beginstr))))
(setq end (1+ end)))
(when (and (= (elt string beginning) 37)
(= (elt string end) 37))
(setq end (1+ end)))
(put-text-property
beginning end
'face `(:background ,(face-foreground 'mode-line) :foreground
,(face-background 'mode-line))
string)
string)
"")))
(add-to-list 'global-mode-string '(:eval (size-mode-line-create)) t)