X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/e516799970be4553edae8ca46d5f64852befec77..fca8b94cf0138be6a92b24b039c10e3680227d5d:/lisp/chistory.el diff --git a/lisp/chistory.el b/lisp/chistory.el index e6871f53e4..c05fd849db 100644 --- a/lisp/chistory.el +++ b/lisp/chistory.el @@ -1,10 +1,10 @@ ;;; chistory.el --- list command history +;; Copyright (C) 1985, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. + ;; Author: K. Shane Hartman ;; Maintainer: FSF -;; Last-Modified: 16 Mar 1992 - -;; Copyright (C) 1985 Free Software Foundation, Inc. +;; Keywords: convenience ;; This file is part of GNU Emacs. @@ -19,18 +19,23 @@ ;; 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, 675 Mass Ave, Cambridge, MA 02139, USA. +;; along with GNU Emacs; see the file COPYING. If not, write to the +;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, +;; Boston, MA 02110-1301, USA. ;;; Commentary: ;; This really has nothing to do with list-command-history per se, but -;; its a nice alternative to C-x ESC (repeat-complex-command) and +;; its a nice alternative to C-x ESC ESC (repeat-complex-command) and ;; functions as a lister if given no pattern. It's not important ;; enough to warrant a file of its own. ;;; Code: +(defgroup chistory nil + "List command history." + :group 'keyboard) + ;;;###autoload (defun repeat-matching-complex-command (&optional pattern) "Edit and re-evaluate complex command with name matching PATTERN. @@ -40,19 +45,16 @@ command history is offered. The form is placed in the minibuffer for editing and the result is evaluated." (interactive "sRedo Command (regexp): ") (if pattern - (if (equal (setq pattern - (substring pattern - (or (string-match "[ \t]*[^ \t]" pattern) - (length pattern)))) - "") - (setq pattern nil))) + (if (string-match "[^ \t]" pattern) + (setq pattern (substring pattern (match-beginning 0))) + (setq pattern nil))) (let ((history command-history) (temp) (what)) (while (and history (not what)) (setq temp (car history)) (if (and (or (not pattern) (string-match pattern (symbol-name (car temp)))) - (y-or-n-p (format "Redo %s? " (setq temp (prin1-to-string temp))))) + (y-or-n-p (format "Redo %S? " temp))) (setq what (car history)) (setq history (cdr history)))) (if (not what) @@ -62,17 +64,21 @@ editing and the result is evaluated." (setq command-history (cdr command-history))) (edit-and-eval-command "Redo: " what)))) -(defvar default-command-history-filter-garbage +(defcustom default-command-history-filter-garbage '(command-history-mode list-command-history electric-command-history) - "*A list of symbols. If `default-list-command-history-filter' is -given a list whose car is an element of this list, then it will return -non-nil (indicating the list should be discarded from the history). -Initially, all commands related to the command history are discarded.") + "*A list of symbols to be ignored by `default-command-history-filter'. +If that function is given a list whose car is an element of this list, +then it will return non-nil (indicating the list should be discarded from +the history). +Initially, all commands related to the command history are discarded." + :type '(repeat symbol) + :group 'chistory) (defvar list-command-history-filter 'default-command-history-filter - "If non-nil, should be the name of a function of one argument. + "Predicate to test which commands should be excluded from the history listing. +If non-nil, should be the name of a function of one argument. It is passed each element of the command history when \\[list-command-history] is called. If the filter returns non-nil for some element, that element is excluded from the history listing. The @@ -84,9 +90,10 @@ from the command history." (or (not (consp frob)) (memq (car frob) default-command-history-filter-garbage))) -(defvar list-command-history-max 32 - "*If non-nil, should be a positive number which specifies the maximum -length of the Command History listing produced by `list-command-history'.") +(defcustom list-command-history-max 32 + "*If non-nil, maximum length of the listing produced by `list-command-history'." + :type '(choice integer (const nil)) + :group 'chistory) ;;;###autoload (defun list-command-history () @@ -116,32 +123,42 @@ The buffer is left in Command History mode." (goto-char (point-min)) (if (eobp) (error "No command history") - (Command-history-setup))))) - -(defun Command-history-setup (&optional majormode modename keymap) - (set-buffer "*Command History*") - (use-local-map (or keymap command-history-map)) - (lisp-mode-variables nil) - (set-syntax-table emacs-lisp-mode-syntax-table) - (setq buffer-read-only t) - (use-local-map (or keymap command-history-map)) - (setq major-mode (or majormode 'command-history-mode)) - (setq mode-name (or modename "Command History"))) - -(defvar command-history-hook nil - "If non-nil, its value is called on entry to `command-history-mode'.") + (command-history-mode))))) (defvar command-history-map nil) -(if command-history-map - nil - (setq command-history-map - (nconc (make-sparse-keymap) shared-lisp-mode-map)) +(unless command-history-map + (setq command-history-map (make-sparse-keymap)) + (set-keymap-parent command-history-map lisp-mode-shared-map) (suppress-keymap command-history-map) (define-key command-history-map "x" 'command-history-repeat) (define-key command-history-map "\n" 'next-line) (define-key command-history-map "\r" 'next-line) (define-key command-history-map "\177" 'previous-line)) +(defun command-history-mode () + "Major mode for listing and repeating recent commands. + +Keybindings: +\\{command-history-map}" + (interactive) + (Command-history-setup) + (setq major-mode 'command-history-mode) + (setq mode-name "Command History") + (use-local-map command-history-map) + (run-mode-hooks 'command-history-mode-hook)) + +(defun Command-history-setup () + (kill-all-local-variables) + (use-local-map command-history-map) + (lisp-mode-variables nil) + (set-syntax-table emacs-lisp-mode-syntax-table) + (setq buffer-read-only t)) + +(defcustom command-history-hook nil + "If non-nil, its value is called on entry to `command-history-mode'." + :type 'hook + :group 'chistory) + (defun command-history-repeat () "Repeat the command shown on the current line. The buffer for that command is the previous current buffer." @@ -152,11 +169,11 @@ The buffer for that command is the previous current buffer." (beginning-of-line) (read (current-buffer))) (set-buffer - (cdr (buffer-list))))))) + (car (cdr (buffer-list)))))))) ;;;###autoload -(defun command-history-mode () - "Major mode for examining commands from `command-history'. +(defun command-history () + "Examine commands from `command-history' in a buffer. The number of commands listed is controlled by `list-command-history-max'. The command history is filtered by `list-command-history-filter' if non-nil. Use \\\\[command-history-repeat] to repeat the command on the current line. @@ -164,8 +181,9 @@ Use \\\\[command-history-repeat] to repeat the command on t Otherwise much like Emacs-Lisp Mode except that there is no self-insertion and digits provide prefix arguments. Tab does not indent. \\{command-history-map} -Calls the value of `command-history-hook' if that is non-nil. -The Command History listing is recomputed each time this mode is invoked." + +This command always recompiles the Command History listing +and runs the normal hook `command-history-hook'." (interactive) (list-command-history) (pop-to-buffer "*Command History*") @@ -173,4 +191,5 @@ The Command History listing is recomputed each time this mode is invoked." (provide 'chistory) +;;; arch-tag: c201a0cd-89f2-4d39-a532-4cb309391dbd ;;; chistory.el ends here