Mercurial > hg > xemacs-beta
diff lisp/dired/gmhist-app.el @ 0:376386a54a3c r19-14
Import from CVS: tag r19-14
author | cvs |
---|---|
date | Mon, 13 Aug 2007 08:45:50 +0200 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lisp/dired/gmhist-app.el Mon Aug 13 08:45:50 2007 +0200 @@ -0,0 +1,237 @@ +;;;; gmhist-app.el - applications of gmhist for some standard commands +;;;; Id: gmhist-app.el,v 4.16 1992/02/26 14:32:27 sk RelBeta + +;;;; The following commands are redefined to get history: +;;;; keep-lines +;;;; flush-lines +;;;; how-many +;;;; occur +;;;; => regexp-history +;;;; grep => grep-history +;;;; shell-command +;;;; shell-command-on-region +;;;; => shell-history +;;;; eval-expression => eval-expression-history +;;;; compile => compile-history + +;;;; You probably want to establish this key binding in your ~/.emacs, +;;;; it will make `M-x M-p' equivalent to `C-x ESC': + +;;;; (define-key esc-map "x" 'gmhist-execute-extended-command) +;;;; (define-key esc-map "X" 'execute-extended-command) ; save old M-x command + +;;;; The second line is to save the old M-x command under M-X, just in +;;;; case anything goes wrong. + +(require 'gmhist) + +;;; gmhist modifications for replace.el (preloaded). + +(mapcar '(lambda (x) + (gmhist-make-magic x 'regexp-history)) + (if gmhist-emacs-19-p + '(keep-lines flush-lines how-many) + '(keep-lines flush-lines how-many occur))) + + +(if gmhist-emacs-19-p + (progn + (gmhist-replace-spec + 'occur + '(gmhist-interactive "sList lines matching regexp: \nP" + 'regexp-history)) + (gmhist-replace-spec + 'grep + '(list (read-with-history-in + 'grep-history ; or 'regexp-history? + (concat "Run " + (substring grep-command 0 + (string-match "[\t ]+" grep-command)) + " (with args): ") + )))) + ;; else + (gmhist-make-magic 'grep 'grep-history)) + +;;; gmhist modification for simple.el (is preloaded) + +(if gmhist-emacs-19-p + (progn + (gmhist-replace-spec + 'shell-command + '(gmhist-interactive "sShell command: \nP" 'shell-history)) + (gmhist-replace-spec + 'shell-command-on-region + '(gmhist-interactive "r\nsShell command on region: \nP\np" + 'shell-history)) + ) + (gmhist-make-magic 'shell-command 'shell-history) + (gmhist-make-magic 'shell-command-on-region 'shell-history) + ) +(gmhist-make-magic 'eval-expression) + +;;; gmhist modification for compile.el (autoloaded) + +;; Often people make the variable compile-command buffer-local. +;; +;; Instead of compile-command, you now have compile-history, which is +;; initialized to +;; +;; (list compile-command) +;; +;; but afterwards gmhist ignores compile-command. So your old file +;; local variable sections or mode hooks will cease to work. +;; +;; Here is a solution: Make compile-history instead of compile-command +;; buffer-local (in a local var section of a file or in a hook, using +;; function make-local-variable). If you only sometimes have gmhist +;; loaded, make both variables buffer-local. + +;; (gmhist-make-magic 'compile 'compile-history) won't work because +;; the interactive spec is not a string. Instead, hand-craft it: + +(gmhist-replace-spec + 'compile + '(list + (read-with-history-in 'compile-history "Compile command: "))) +;; instead of... +;;(put 'compile-history 'default compile-command) +;; ... do the following +(put 'compile-history 'backup t) ; requires at least gmhist 3.22 +(put 'compile-history 'no-default t) +(put 'compile-history 'initial-hist (list compile-command)) +(put 'compile-history 'cursor-end t) + +;;; gmhist modifications for tags.el (is autoloaded) +;;; The distributed version of tags.el does not support a load hook. +;;; Add the statement +;;; (run-hooks 'tags-load-hook) +;;; at the very end of tags.el. + +(defvar tags-history nil + "History of tags.") + +(setq tags-load-hook + ;; redefine find-tag-tag upon loading of tags.el + '(lambda () + (fset 'find-tag-tag 'gmhist-find-tag-tag))) + +(defun gmhist-find-tag-tag (string) + ;; compare these two lines to the original definition... + (let ((defalt (find-tag-default))) + (if (and defalt + (string-match "[:']$" defalt)) + (setq defalt (substring defalt 0 -1))) + (put 'tags-history 'default defalt) + ;; so that M-p lets you edit the default + (setq tags-history (cons defalt tags-history)) + (list (read-with-history-in 'tags-history string)))) + +;; Gmhist version of M-x + +;; Make M-x have history (it actually has one already, but only through +;; C-x ESC (repeat-complex-command), not via M-p within the M-x +;; prompt.) + +;; execute-extended-command must be rewritten if minibuffer history is +;; implemented in C. Probably call-interactively too. + +(defvar gmhist-execute-extended-command-map (copy-keymap gmhist-completion-map) + "Keymap used inside `gmhist-execute-extended-command'.") + +;; We have to define custom version of RET and SPC (actually TAB as +;; well) since they behave completely different immediately after M-x +;; (reading a command) or after the history postion has been changed +;; to a non-zero value (editing an s-expr, an old command with its +;; arguments). + +(define-key gmhist-execute-extended-command-map + "\r" 'gmhist-execute-extended-command-exit) + +(define-key gmhist-execute-extended-command-map + " " 'gmhist-execute-extended-command-space) + +(defun gmhist-execute-extended-command-exit () + "Maybe complete the minibuffer contents, and exit. +Completes commands before exiting, but leaves command history items alone." + ;; Completion (over the set of commands) only occurs if + ;; minibufer-history-position is 0, meaning we are editing a command + ;; name. Non-zero history positions mean we are editing an sexp + ;; resulting from an earlier command and its argument, and + ;; completion is not meaningful. + (interactive) + (if (equal 0 minibuffer-history-position) + ;; Rather than calling minibuffer-complete-and-exit directly, + ;; account for the possibility that e.g. a partial completion + ;; has been loaded and changed the bindings + (funcall (lookup-key minibuffer-local-must-match-map "\C-m")) + (exit-minibuffer))) + +(defun gmhist-execute-extended-command-space () + (interactive) + (if (equal 0 minibuffer-history-position) + (funcall (lookup-key minibuffer-local-must-match-map " ")) + (insert " "))) + +(defun gmhist-execute-extended-command () ; M-x + "Read function name, then read its arguments and call it. +You can use all gmhist commands (see variable gmhist-completion-map), +especially \\<gmhist-completion-map>\\[gmhist-previous] to backup in command-history." + (interactive) + ;; We don't want '(gmhist-execute-extended-command (quote COMMAND)) + ;; on the command history, since this is ugly, and COMMAND itself is + ;; always right next to it. This is so because + ;; gmhist-execute-extended-command is not a builtin like + ;; execute-extended-command and thus is itself entered on the + ;; command-history. + (if (assq 'gmhist-execute-extended-command command-history) + (let ((list command-history) + elt) + (while list + (setq elt (car list)) + (if (eq (car-safe elt) 'gmhist-execute-extended-command) + ;; destructively remove this elt from command-history + (progn + (setcar list nil) + ;; and exit the loop since if we're doing this each time + ;; there shouldn't be more than one such elt - the one + ;; from the last time + (setq list nil)) + (setq list (cdr list)))) + (setq command-history (delq nil command-history)))) + (let (cmd) + (let ((minibuffer-completion-confirm nil) + ;; We only need read-with-history-in here to make M-p available, + ;; the new command will be recorded below + (minibuffer-history-read-only t)) + (put 'command-history 'cursor-end t) + ;; command-history is maintained automatically: + (put 'command-history 'hist-ignore ".*") + (put 'command-history 'no-default t) + (put 'command-history 'completion-table obarray) + (put 'command-history 'hist-map gmhist-execute-extended-command-map) + (put 'command-history 'completion-predicate 'commandp) + (put 'command-history 'backup nil) + (setq cmd + (read-with-history-in + 'command-history + (if current-prefix-arg + (format "%s M-x " + current-prefix-arg + ;; this is not exactly like the original M-x + ;; but the following doesn't seem to work right +; (cond ((eq '(4) current-prefix-arg) +; "C-u") +; (t +; (prefix-numeric-value current-prefix-arg))) + ) + "M-x ") + nil t))) + (if (commandp cmd) + (let ((prefix-arg current-prefix-arg)) + (setq this-command cmd) + (command-execute cmd t)) + ;; else it is a lisp form from the history of old commands + (prog1 + (eval cmd) + (setq command-history (cons cmd command-history)))))) +