123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151 |
- ;; chistory -- List command history
- ;; Copyright (C) 1985 Free Software Foundation, Inc.
- ;; Principal author K. Shane Hartman
- ;; This file is part of GNU Emacs.
- ;; GNU Emacs is distributed in the hope that it will be useful,
- ;; but WITHOUT ANY WARRANTY. No author or distributor
- ;; accepts responsibility to anyone for the consequences of using it
- ;; or for whether it serves any particular purpose or works at all,
- ;; unless he says so in writing. Refer to the GNU Emacs General Public
- ;; License for full details.
- ;; Everyone is granted permission to copy, modify and redistribute
- ;; GNU Emacs, but only under the conditions described in the
- ;; GNU Emacs General Public License. A copy of this license is
- ;; supposed to have been given to you along with GNU Emacs so you
- ;; can know your rights and responsibilities. It should be in a
- ;; file named COPYING. Among other things, the copyright notice
- ;; and this notice must be preserved on all copies.
- (provide 'chistory)
- ;; 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
- ;; functions as a lister if given no pattern. It's not important
- ;; enough to warrant a file of its own.
- (defun repeat-matching-complex-command (&optional pattern)
- "Edit and re-evaluate complex command with name matching PATTERN.
- Matching occurrences are displayed, most recent first, until you
- select a form for evaluation. If PATTERN is empty (or nil), every form
- in the 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)))
- (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)))))
- (setq what (car history))
- (setq history (cdr history))))
- (if (not what)
- (error "Command history exhausted.")
- (edit-and-eval-command "Redo: " what))))
- (defvar 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.")
- (defvar list-command-history-filter 'default-command-history-filter
- "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
- default filter removes commands associated with the command-history.")
- (defun default-command-history-filter (frob)
- "Filter commands matching default-command-history-filter-garbage list
- 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.")
- (defun list-command-history ()
- "List history of commands typed to minibuffer.
- The number of commands listed is controlled by list-command-history-max.
- Calls value of list-command-history-filter (if non-nil) on each history
- element to judge if that element should be excluded from the list.
- The buffer is left in Command History mode."
- (interactive)
- (with-output-to-temp-buffer
- "*Command History*"
- (let ((history command-history)
- (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
- (funcall list-command-history-filter (car history)))
- nil
- (setq count (1- count))
- (prin1 (car history))
- (terpri))
- (setq history (cdr history))))
- (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)
- (set-syntax-table 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 (make-keymap))
- (lisp-mode-commands command-history-map)
- (suppress-keymap command-history-map)
- (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 examining commands from command-history.
- 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.
- Like Emacs-Lisp Mode except that characters do not insert themselves 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."
- (interactive)
- (list-command-history)
- (pop-to-buffer "*Command History*")
- (run-hooks 'command-history-hook))
-
|