(defgroup auto-show nil
"Perform automatic horizontal scrolling as point moves."
:group 'editing)
(defcustom auto-show-mode nil
"Non-nil means do automatic horizontal scrolling, when lines are truncated.
This variable is automatically local in each buffer where it is set.
Setting this variable directly does not take effect;
use either \\[customize] or the function `auto-show-mode'."
:set (lambda (symbol value)
(setq-default auto-show-mode t)
(auto-show-mode (if value 1 0)))
:require 'auto-show
:initialize 'custom-initialize-default
:link '(emacs-commentary-link "auto-show.el")
:version "20.4"
:type 'boolean
:group 'auto-show)
(make-variable-buffer-local 'auto-show-mode)
(defcustom auto-show-shift-amount 8
"*Extra columns to scroll. for automatic horizontal scrolling."
:type 'integer
:group 'auto-show)
(defcustom auto-show-show-left-margin-threshold 50
"*Threshold column for automatic horizontal scrolling to the right.
If point is before this column, we try to scroll to make the left margin
visible. Setting this to 0 disables this feature."
:type 'integer
:group 'auto-show)
(defun auto-show-truncationp ()
"True if line truncation is enabled for the selected window."
(or truncate-lines
(and truncate-partial-width-windows
(< (window-width) (frame-width)))))
(defun auto-show-mode (arg)
"Turn automatic horizontal scroll mode on or off.
With arg, turn auto scrolling on if arg is positive, off otherwise.
This mode is enabled or disabled for each buffer individually.
It takes effect only when `truncate-lines' is non-nil."
(interactive "P")
(setq auto-show-mode
(if (null arg)
(not auto-show-mode)
(> (prefix-numeric-value arg) 0)))
(when auto-show-mode
(add-hook 'post-command-hook 'auto-show-make-point-visible)
(add-hook 'comint-output-filter-functions
'auto-show-make-point-visible t)))
(defun auto-show-make-point-visible (&optional ignore-arg)
"Scroll horizontally to make point visible, if that is enabled.
This function only does something if `auto-show-mode' is non-nil
and longlines are being truncated in the selected window.
See also the command `auto-show-mode'."
(interactive)
(if (and auto-show-mode (auto-show-truncationp)
(equal (window-buffer) (current-buffer)))
(let* ((col (current-column)) (scroll (window-hscroll)) (w-width (- (window-width)
(if (> scroll 0)
2 1))) (right-col (+ scroll w-width)))
(if (and (< col auto-show-show-left-margin-threshold)
(< col (window-width))
(> scroll 0))
(scroll-right scroll)
(if (< col scroll) (scroll-right (+ (- scroll col) auto-show-shift-amount))
(if (or (> col right-col) (and (= col right-col)
(not (eolp))))
(scroll-left (+ auto-show-shift-amount
(- col (+ scroll w-width))))))))))
(provide 'auto-show)