X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/9750e079ddb0df24810a8a19a3210616d3f71db9..e73f184c427e7227e23654d167db770a9621e73c:/lisp/chistory.el diff --git a/lisp/chistory.el b/lisp/chistory.el index 403fb0b24e..3ce1d8dc3f 100644 --- a/lisp/chistory.el +++ b/lisp/chistory.el @@ -1,16 +1,18 @@ ;;; chistory.el --- list command history -;; Copyright (C) 1985 Free Software Foundation, Inc. +;; Copyright (C) 1985, 2001, 2002, 2003, 2004, 2005, +;; 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc. ;; Author: K. Shane Hartman ;; Maintainer: FSF +;; Keywords: convenience ;; 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 @@ -18,18 +20,21 @@ ;; 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. If not, see . ;;; 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. @@ -39,19 +44,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) @@ -61,17 +63,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 @@ -83,9 +89,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 () @@ -102,44 +109,53 @@ The buffer is left in Command History mode." (buffer-read-only nil) (count (or list-command-history-max -1))) (while (and (/= count 0) history) - (if (and (boundp 'list-command-history-filter) - list-command-history-filter + (if (and (bound-and-true-p list-command-history-filter) (funcall list-command-history-filter (car history))) nil (setq count (1- count)) (prin1 (car history)) (terpri)) (setq history (cdr history)))) - (save-excursion - (set-buffer "*Command History*") + (with-current-buffer "*Command History*" (goto-char (point-min)) (if (eobp) (error "No command history") - (Command-history-setup))))) + (command-history-mode))))) + +(defvar command-history-map + (let ((map (make-sparse-keymap))) + (set-keymap-parent map lisp-mode-shared-map) + (suppress-keymap map) + (define-key map "x" 'command-history-repeat) + (define-key map "\n" 'next-line) + (define-key map "\r" 'next-line) + (define-key map "\177" 'previous-line) + map) + "Keymap for `command-history-mode'.") + +(defun command-history-mode () + "Major mode for listing and repeating recent commands. -(defun Command-history-setup (&optional majormode modename keymap) - (set-buffer "*Command History*") - (use-local-map (or keymap command-history-map)) +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) - (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'.") - -(defvar command-history-map nil) -(if command-history-map - nil - (setq command-history-map - (nconc (make-sparse-keymap) shared-lisp-mode-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)) + (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. @@ -151,11 +167,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. @@ -163,8 +179,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*") @@ -172,4 +189,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