]> code.delx.au - gnu-emacs/blobdiff - lisp/eshell/em-smart.el
(eshell/which): Handle the case where no description is found.
[gnu-emacs] / lisp / eshell / em-smart.el
index cc02f2fedc373448d2a9b65b8a1dfb0d393231fe..c8a902a739c8212e275e8e9a6ac7c8b61e600a3f 100644 (file)
@@ -1,15 +1,16 @@
-;;; em-smart --- smart display of output
+;;; em-smart.el --- smart display of output
 
-;; Copyright (C) 1999, 2000 Free Software Foundation
+;; Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
+;;   2008  Free Software Foundation, Inc.
 
 ;; Author: John Wiegley <johnw@gnu.org>
 
 ;; This file is part of GNU Emacs.
 
-;; GNU Emacs is free software; you can redistribute it and/or modify
+;; GNU Emacs is free software: you can redistribute it and/or modify
 ;; it under the terms of the GNU General Public License as published by
-;; the Free Software Foundation; either version 2, or (at your option)
-;; any later version.
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
 
 ;; GNU Emacs is distributed in the hope that it will be useful,
 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
 ;; GNU General Public License for more details.
 
 ;; You should have received a copy of the GNU General Public License
-;; along with GNU Emacs; see the file COPYING.  If not, write to the
-;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-;; Boston, MA 02111-1307, USA.
-
-(provide 'em-smart)
-
-(eval-when-compile (require 'esh-maint))
-
-(defgroup eshell-smart nil
-  "This module combines the facility of normal, modern shells with
-some of the edit/review concepts inherent in the design of Plan 9's
-9term.  See the docs for more details.
-
-Most likely you will have to turn this option on and play around with
-it to get a real sense of how it works."
-  :tag "Smart display of output"
-  :link '(info-link "(eshell)Smart display of output")
-  :group 'eshell-module)
+;; along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.
 
 ;;; Commentary:
 
@@ -77,6 +61,27 @@ it to get a real sense of how it works."
 ;;   scroll, etc.
 ;;
 ;; @ Like I said, it's not really comprehensible until you try it! ;)
+;;
+;; One disadvantage of this module is that it increases Eshell's
+;; memory consumption by a factor of two or more.  With small commands
+;; (such as pwd), where the screen is mostly full, consumption can
+;; increase by orders of magnitude.
+
+;;; Code:
+
+(eval-when-compile (require 'eshell))
+
+;;;###autoload
+(eshell-defgroup eshell-smart nil
+  "This module combines the facility of normal, modern shells with
+some of the edit/review concepts inherent in the design of Plan 9's
+9term.  See the docs for more details.
+
+Most likely you will have to turn this option on and play around with
+it to get a real sense of how it works."
+  :tag "Smart display of output"
+  ;; :link '(info-link "(eshell)Smart display of output")
+  :group 'eshell-module)
 
 ;;; User Variables:
 
@@ -104,8 +109,8 @@ If set to nil, quick commands won't be reviewed.  A quick command is a
 command that produces no output, and exits successfully.
 
 If set to `not-even-short-output', then the definition of \"quick
-command\" is extended to include commands that produce output, iff
-that output can be presented in its entirely in the Eshell window."
+command\" is extended to include commands that produce output, if and
+only if that output can be presented in its entirely in the Eshell window."
   :type '(choice (const :tag "No" nil)
                 (const :tag "Yes" t)
                 (const :tag "Not even short output"
@@ -154,6 +159,7 @@ The options are `begin', `after' or `end'."
 
 (defvar eshell-smart-displayed nil)
 (defvar eshell-smart-command-done nil)
+(defvar eshell-currently-handling-window nil)
 
 ;;; Functions:
 
@@ -166,28 +172,20 @@ The options are `begin', `after' or `end'."
     (set (make-local-variable 'eshell-scroll-to-bottom-on-input) nil)
     (set (make-local-variable 'eshell-scroll-show-maximum-output) t)
 
-    (make-local-hook 'window-scroll-functions)
     (add-hook 'window-scroll-functions 'eshell-smart-scroll-window nil t)
     (add-hook 'window-configuration-change-hook 'eshell-refresh-windows)
 
-    (make-local-hook 'eshell-output-filter-functions)
     (add-hook 'eshell-output-filter-functions 'eshell-refresh-windows t t)
 
-    (make-local-hook 'pre-command-hook)
-    (make-local-hook 'after-change-functions)
-    (add-hook 'after-change-functions
-             'eshell-disable-after-change nil t)
+    (add-hook 'after-change-functions 'eshell-disable-after-change nil t)
 
-    (make-local-hook 'eshell-input-filter-functions)
-    (add-hook 'eshell-input-filter-functions
-             'eshell-smart-display-setup nil t)
+    (add-hook 'eshell-input-filter-functions 'eshell-smart-display-setup nil t)
 
     (make-local-variable 'eshell-smart-command-done)
-    (make-local-hook 'eshell-post-command-hook)
-    (add-hook  'eshell-post-command-hook
-              (function
-               (lambda ()
-                 (setq eshell-smart-command-done t))) t t)
+    (add-hook 'eshell-post-command-hook
+             (function
+              (lambda ()
+                (setq eshell-smart-command-done t))) t t)
 
     (unless (eq eshell-review-quick-commands t)
       (add-hook 'eshell-post-command-hook
@@ -198,10 +196,9 @@ The options are `begin', `after' or `end'."
   (unless eshell-currently-handling-window
     (let ((inhibit-point-motion-hooks t)
          (eshell-currently-handling-window t))
-      (save-current-buffer
-       (save-selected-window
-         (select-window wind)
-         (eshell-smart-redisplay))))))
+      (save-selected-window
+       (select-window wind)
+       (eshell-smart-redisplay)))))
 
 (defun eshell-refresh-windows (&optional frame)
   "Refresh all visible Eshell buffers."
@@ -210,10 +207,10 @@ The options are `begin', `after' or `end'."
      (function
       (lambda (wind)
        (with-current-buffer (window-buffer wind)
-         (when eshell-mode
-           (let (window-scroll-functions)
-             (eshell-smart-scroll-window wind (window-start))
-             (setq affected t))))))
+         (if eshell-mode
+             (let (window-scroll-functions)
+               (eshell-smart-scroll-window wind (window-start))
+               (setq affected t))))))
      0 frame)
     (if affected
        (let (window-scroll-functions)
@@ -245,7 +242,7 @@ The options are `begin', `after' or `end'."
 
 (defun eshell-smart-maybe-jump-to-end ()
   "Jump to the end of the input buffer.
-This is done whenever a command exits sucessfully and both the command
+This is done whenever a command exits successfully and both the command
 and the end of the buffer are still visible."
   (when (and (= eshell-last-command-status 0)
             (if (eq eshell-review-quick-commands 'not-even-short-output)
@@ -259,7 +256,11 @@ and the end of the buffer are still visible."
 (defun eshell-smart-redisplay ()
   "Display as much output as possible, smartly."
   (if (eobp)
-      (recenter -1)
+      (save-excursion
+       (recenter -1)
+       ;; trigger the redisplay now, so that we catch any attempted
+       ;; point motion; this is to cover for a redisplay bug
+       (eshell-redisplay))
     (let ((top-point (point)))
       (and (memq 'eshell-smart-display-move pre-command-hook)
           (>= (point) eshell-last-input-start)
@@ -320,6 +321,11 @@ and the end of the buffer are still visible."
     (if clear
        (remove-hook 'pre-command-hook 'eshell-smart-display-move t))))
 
-;;; Code:
+(provide 'em-smart)
+
+;; Local Variables:
+;; generated-autoload-file: "esh-groups.el"
+;; End:
 
+;; arch-tag: 8c0112c7-379c-4d54-9a1c-204d68786a4b
 ;;; em-smart.el ends here