|
|
1.1 ! root 1: ;; chistory -- List command history ! 2: ;; Copyright (C) 1985 Richard M. Stallman and K. Shane Hartman ! 3: ! 4: ;; This file is part of GNU Emacs. ! 5: ! 6: ;; GNU Emacs is distributed in the hope that it will be useful, ! 7: ;; but WITHOUT ANY WARRANTY. No author or distributor ! 8: ;; accepts responsibility to anyone for the consequences of using it ! 9: ;; or for whether it serves any particular purpose or works at all, ! 10: ;; unless he says so in writing. Refer to the GNU Emacs General Public ! 11: ;; License for full details. ! 12: ! 13: ;; Everyone is granted permission to copy, modify and redistribute ! 14: ;; GNU Emacs, but only under the conditions described in the ! 15: ;; GNU Emacs General Public License. A copy of this license is ! 16: ;; supposed to have been given to you along with GNU Emacs so you ! 17: ;; can know your rights and responsibilities. It should be in a ! 18: ;; file named COPYING. Among other things, the copyright notice ! 19: ;; and this notice must be preserved on all copies. ! 20: ! 21: ! 22: (provide 'chistory) ! 23: ! 24: ;; This really has nothing to do with list-command-history per se, but ! 25: ;; its a nice alternative to C-x ESC (repeat-complex-command) and ! 26: ;; functions as a lister if given no pattern. It's not important ! 27: ;; enough to warrant a file of its own. ! 28: ! 29: (defun repeat-matching-complex-command (&optional pattern) ! 30: "Edit and re-evaluate complex command with name matching PATTERN. ! 31: Matching occurrences are displayed, most recent first, until you ! 32: select a form for evaluation. If PATTERN is empty (or nil), every form ! 33: in the command history is offered. The form is placed in the minibuffer ! 34: for editing and the result is evaluated." ! 35: (interactive "sRedo Command (regexp): ") ! 36: (if pattern ! 37: (if (equal (setq pattern ! 38: (substring pattern ! 39: (or (string-match "[ \t]*[^ \t]" pattern) ! 40: (length pattern)))) ! 41: "") ! 42: (setq pattern nil))) ! 43: (let ((history command-history) ! 44: (temp) ! 45: (what)) ! 46: (while (and history (not what)) ! 47: (setq temp (car history)) ! 48: (if (and (or (not pattern) (string-match pattern (symbol-name (car temp)))) ! 49: (y-or-n-p (format "Redo %s? " (setq temp (prin1-to-string temp))))) ! 50: (setq what (car history)) ! 51: (setq history (cdr history)))) ! 52: (if (not what) ! 53: (error "Command history exhausted.") ! 54: (edit-and-eval-command "Redo: " what)))) ! 55: ! 56: (defvar default-command-history-filter-garbage ! 57: '(command-history-mode ! 58: list-command-history ! 59: electric-command-history) ! 60: "*A list of symbols. If default-list-command-history-filter is ! 61: given a list whose car is an element of this list, then it will return ! 62: non-nil (indicating the list should be discarded from the history). ! 63: Initially, all commands related to the command history are discarded.") ! 64: ! 65: (defvar list-command-history-filter 'default-command-history-filter ! 66: "If non-nil, should be the name of a function of one argument. ! 67: It is passed each element of the command history when ! 68: \\[list-command-history] is called. If the filter returns non-nil for ! 69: some element, that element is excluded from the history listing. The ! 70: default filter removes commands associated with the command-history.") ! 71: ! 72: (defun default-command-history-filter (frob) ! 73: "Filter commands matching default-command-history-filter-garbage list ! 74: from the command history." ! 75: (or (not (consp frob)) ! 76: (memq (car frob) default-command-history-filter-garbage))) ! 77: ! 78: (defvar list-command-history-max 32 ! 79: "*If non-nil, should be a positive number which specifies the maximum ! 80: length of the Command History listing produced by list-command-history.") ! 81: ! 82: (defun list-command-history () ! 83: "List history of commands typed to minibuffer. ! 84: The number of commands listed is controlled by list-command-history-max. ! 85: Calls value of list-command-history-filter (if non-nil) on each history ! 86: element to judge if that element should be excluded from the list. ! 87: ! 88: The buffer is left in Command History mode." ! 89: (interactive) ! 90: (with-output-to-temp-buffer ! 91: "*Command History*" ! 92: (let ((history command-history) ! 93: (buffer-read-only nil) ! 94: (count (or list-command-history-max -1))) ! 95: (while (and (/= count 0) history) ! 96: (if (and (boundp 'list-command-history-filter) ! 97: list-command-history-filter ! 98: (funcall list-command-history-filter (car history))) ! 99: nil ! 100: (setq count (1- count)) ! 101: (prin1 (car history)) ! 102: (terpri)) ! 103: (setq history (cdr history)))) ! 104: (goto-char (point-min)) ! 105: (if (eobp) ! 106: (error "No command history.") ! 107: (Command-history-setup)))) ! 108: ! 109: (defun Command-history-setup (&optional majormode modename keymap) ! 110: (set-buffer "*Command History*") ! 111: (use-local-map (or keymap command-history-map)) ! 112: (lisp-mode-variables) ! 113: (set-syntax-table lisp-mode-syntax-table) ! 114: (setq buffer-read-only t) ! 115: (use-local-map (or keymap command-history-map)) ! 116: (setq major-mode (or majormode 'command-history-mode)) ! 117: (setq mode-name (or modename "Command History"))) ! 118: ! 119: (defvar command-history-hook nil ! 120: "If non-nil, its value is called on entry to command-history-mode.") ! 121: ! 122: (defvar command-history-map nil) ! 123: (if command-history-map ! 124: nil ! 125: (setq command-history-map (make-keymap)) ! 126: (lisp-mode-commands command-history-map) ! 127: (suppress-keymap command-history-map) ! 128: (define-key command-history-map "\n" 'next-line) ! 129: (define-key command-history-map "\r" 'next-line) ! 130: (define-key command-history-map "\177" 'previous-line)) ! 131: ! 132: (defun command-history-mode () ! 133: "Major mode for examining commands from command-history. ! 134: The number of commands listed is controlled by list-command-history-max. ! 135: The command history is filtered by list-command-history-filter if non-nil. ! 136: ! 137: Like Emacs-Lisp Mode except that characters do not insert themselves and ! 138: Digits provide prefix arguments. Tab does not indent. ! 139: \\{command-history-map} ! 140: Calls the value of command-history-hook if that is non-nil ! 141: The Command History listing is recomputed each time this mode is ! 142: invoked." ! 143: (interactive) ! 144: (list-command-history) ! 145: (pop-to-buffer "*Command History*") ! 146: (run-hooks 'command-history-hook)) ! 147: ! 148: ! 149:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.