From d783d30393eb554f9a0d780570a7946a165885fb Mon Sep 17 00:00:00 2001 From: Glenn Morris Date: Fri, 4 Mar 2011 20:11:05 -0800 Subject: [PATCH] Default all eshell hooks to nil (bug#5375) * eshell/esh-mode.el (eshell-kill-buffer-function): New function. (eshell-mode): Use eshell-kill-buffer-function. Run the -initialize functions independently of the -load-hooks. * eshell/esh-proc.el (eshell-kill-process-function): New function. (eshell-gather-process-output, eshell-sentinel) (eshell-interrupt-process, eshell-kill-process, eshell-quit-process): Use eshell-kill-process-function. * eshell/em-alias.el (eshell-alias-load-hook): * eshell/em-banner.el (eshell-banner-load-hook): * eshell/em-cmpl.el (eshell-cmpl-load-hook): * eshell/em-dirs.el (eshell-dirs-load-hook): * eshell/em-glob.el (eshell-glob-load-hook): * eshell/em-hist.el (eshell-hist-load-hook): * eshell/em-pred.el (eshell-pred-load-hook): * eshell/em-prompt.el (eshell-prompt-load-hook): * eshell/em-rebind.el (eshell-rebind-load-hook): * eshell/em-script.el (eshell-script-load-hook): * eshell/em-smart.el (eshell-smart-load-hook): * eshell/em-term.el (eshell-term-load-hook): * eshell/em-unix.el (eshell-unix-load-hook): * eshell/esh-arg.el (eshell-arg-load-hook): * eshell/esh-cmd.el (eshell-cmd-load-hook): * eshell/esh-ext.el (eshell-ext-load-hook): * eshell/esh-io.el (eshell-io-load-hook): * eshell/esh-mode.el (eshell-exit-hook): * eshell/esh-proc.el (eshell-proc-load-hook, eshell-kill-hook): * eshell/esh-var.el (eshell-var-load-hook): Set default hook values to nil. (Bug#5375) --- lisp/ChangeLog | 29 +++++++++++++++++++++++++++++ lisp/eshell/em-alias.el | 3 ++- lisp/eshell/em-banner.el | 3 ++- lisp/eshell/em-cmpl.el | 3 ++- lisp/eshell/em-dirs.el | 3 ++- lisp/eshell/em-glob.el | 3 ++- lisp/eshell/em-hist.el | 3 ++- lisp/eshell/em-pred.el | 3 ++- lisp/eshell/em-prompt.el | 3 ++- lisp/eshell/em-rebind.el | 3 ++- lisp/eshell/em-script.el | 3 ++- lisp/eshell/em-smart.el | 3 ++- lisp/eshell/em-term.el | 3 ++- lisp/eshell/em-unix.el | 3 ++- lisp/eshell/esh-arg.el | 3 ++- lisp/eshell/esh-cmd.el | 3 ++- lisp/eshell/esh-ext.el | 3 ++- lisp/eshell/esh-io.el | 3 ++- lisp/eshell/esh-mode.el | 39 +++++++++++++++++++++++---------------- lisp/eshell/esh-proc.el | 30 +++++++++++++++++++----------- lisp/eshell/esh-var.el | 3 ++- 21 files changed, 107 insertions(+), 45 deletions(-) diff --git a/lisp/ChangeLog b/lisp/ChangeLog index b0f1a280ae..aeb7c8edff 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,5 +1,34 @@ 2011-03-05 Glenn Morris + * eshell/esh-mode.el (eshell-kill-buffer-function): New function. + (eshell-mode): Use eshell-kill-buffer-function. + Run the -initialize functions independently of the -load-hooks. + * eshell/esh-proc.el (eshell-kill-process-function): New function. + (eshell-gather-process-output, eshell-sentinel) + (eshell-interrupt-process, eshell-kill-process, eshell-quit-process): + Use eshell-kill-process-function. + * eshell/em-alias.el (eshell-alias-load-hook): + * eshell/em-banner.el (eshell-banner-load-hook): + * eshell/em-cmpl.el (eshell-cmpl-load-hook): + * eshell/em-dirs.el (eshell-dirs-load-hook): + * eshell/em-glob.el (eshell-glob-load-hook): + * eshell/em-hist.el (eshell-hist-load-hook): + * eshell/em-pred.el (eshell-pred-load-hook): + * eshell/em-prompt.el (eshell-prompt-load-hook): + * eshell/em-rebind.el (eshell-rebind-load-hook): + * eshell/em-script.el (eshell-script-load-hook): + * eshell/em-smart.el (eshell-smart-load-hook): + * eshell/em-term.el (eshell-term-load-hook): + * eshell/em-unix.el (eshell-unix-load-hook): + * eshell/esh-arg.el (eshell-arg-load-hook): + * eshell/esh-cmd.el (eshell-cmd-load-hook): + * eshell/esh-ext.el (eshell-ext-load-hook): + * eshell/esh-io.el (eshell-io-load-hook): + * eshell/esh-mode.el (eshell-exit-hook): + * eshell/esh-proc.el (eshell-proc-load-hook, eshell-kill-hook): + * eshell/esh-var.el (eshell-var-load-hook): + Set default hook values to nil. (Bug#5375) + * eshell/esh-module.el (eshell-module-unload-hook) (eshell-modules-list): Remove leading * from defcustom docs. diff --git a/lisp/eshell/em-alias.el b/lisp/eshell/em-alias.el index 9efa95fc9a..4e1dbd4104 100644 --- a/lisp/eshell/em-alias.el +++ b/lisp/eshell/em-alias.el @@ -117,8 +117,9 @@ gained by using this module." ;; :link '(custom-manual "(eshell)Auto-correction of bad commands") :group 'eshell-alias) -(defcustom eshell-alias-load-hook '(eshell-alias-initialize) +(defcustom eshell-alias-load-hook nil "A hook that gets run when `eshell-alias' is loaded." + :version "24.1" ; removed eshell-alias-initialize :type 'hook :group 'eshell-alias) diff --git a/lisp/eshell/em-banner.el b/lisp/eshell/em-banner.el index b2ebde98ce..c3e5a8b3d5 100644 --- a/lisp/eshell/em-banner.el +++ b/lisp/eshell/em-banner.el @@ -64,8 +64,9 @@ This can be any sexp, and should end with at least two newlines." (put 'eshell-banner-message 'risky-local-variable t) -(defcustom eshell-banner-load-hook '(eshell-banner-initialize) +(defcustom eshell-banner-load-hook nil "A list of functions to run when `eshell-banner' is loaded." + :version "24.1" ; removed eshell-banner-initialize :type 'hook :group 'eshell-banner) diff --git a/lisp/eshell/em-cmpl.el b/lisp/eshell/em-cmpl.el index f3f104c1ed..c551684210 100644 --- a/lisp/eshell/em-cmpl.el +++ b/lisp/eshell/em-cmpl.el @@ -84,8 +84,9 @@ variable names, arguments, etc." ;;; User Variables: -(defcustom eshell-cmpl-load-hook '(eshell-cmpl-initialize) +(defcustom eshell-cmpl-load-hook nil "A list of functions to run when `eshell-cmpl' is loaded." + :version "24.1" ; removed eshell-cmpl-initialize :type 'hook :group 'eshell-cmpl) diff --git a/lisp/eshell/em-dirs.el b/lisp/eshell/em-dirs.el index 9165f69d0b..1aa2c34c39 100644 --- a/lisp/eshell/em-dirs.el +++ b/lisp/eshell/em-dirs.el @@ -58,8 +58,9 @@ they lack somewhat in feel from the typical shell equivalents." ;;; User Variables: -(defcustom eshell-dirs-load-hook '(eshell-dirs-initialize) +(defcustom eshell-dirs-load-hook nil "A hook that gets run when `eshell-dirs' is loaded." + :version "24.1" ; removed eshell-dirs-initialize :type 'hook :group 'eshell-dirs) diff --git a/lisp/eshell/em-glob.el b/lisp/eshell/em-glob.el index 2a565c5c82..732c6c05bf 100644 --- a/lisp/eshell/em-glob.el +++ b/lisp/eshell/em-glob.el @@ -61,8 +61,9 @@ by zsh for filename generation." ;;; User Variables: -(defcustom eshell-glob-load-hook '(eshell-glob-initialize) +(defcustom eshell-glob-load-hook nil "A list of functions to run when `eshell-glob' is loaded." + :version "24.1" ; removed eshell-glob-initialize :type 'hook :group 'eshell-glob) diff --git a/lisp/eshell/em-hist.el b/lisp/eshell/em-hist.el index f9ddf3b679..993e9d63a9 100644 --- a/lisp/eshell/em-hist.el +++ b/lisp/eshell/em-hist.el @@ -70,8 +70,9 @@ ;;; User Variables: -(defcustom eshell-hist-load-hook '(eshell-hist-initialize) +(defcustom eshell-hist-load-hook nil "A list of functions to call when loading `eshell-hist'." + :version "24.1" ; removed eshell-hist-initialize :type 'hook :group 'eshell-hist) diff --git a/lisp/eshell/em-pred.el b/lisp/eshell/em-pred.el index 33085c067f..f3027ea9b5 100644 --- a/lisp/eshell/em-pred.el +++ b/lisp/eshell/em-pred.el @@ -59,8 +59,9 @@ ordinary strings." ;;; User Variables: -(defcustom eshell-pred-load-hook '(eshell-pred-initialize) +(defcustom eshell-pred-load-hook nil "A list of functions to run when `eshell-pred' is loaded." + :version "24.1" ; removed eshell-pred-initialize :type 'hook :group 'eshell-pred) diff --git a/lisp/eshell/em-prompt.el b/lisp/eshell/em-prompt.el index 448d2cdf30..3e87acc6d1 100644 --- a/lisp/eshell/em-prompt.el +++ b/lisp/eshell/em-prompt.el @@ -37,8 +37,9 @@ as is common with most shells." ;;; User Variables: -(defcustom eshell-prompt-load-hook '(eshell-prompt-initialize) +(defcustom eshell-prompt-load-hook nil "A list of functions to call when loading `eshell-prompt'." + :version "24.1" ; removed eshell-prompt-initialize :type 'hook :group 'eshell-prompt) diff --git a/lisp/eshell/em-rebind.el b/lisp/eshell/em-rebind.el index 6def23e1b7..2c346dfcd3 100644 --- a/lisp/eshell/em-rebind.el +++ b/lisp/eshell/em-rebind.el @@ -41,8 +41,9 @@ the behavior of normal shells while the user editing new input text." ;;; User Variables: -(defcustom eshell-rebind-load-hook '(eshell-rebind-initialize) +(defcustom eshell-rebind-load-hook nil "A list of functions to call when loading `eshell-rebind'." + :version "24.1" ; removed eshell-rebind-initialize :type 'hook :group 'eshell-rebind) diff --git a/lisp/eshell/em-script.el b/lisp/eshell/em-script.el index ed4ad1c071..d76e19cdd0 100644 --- a/lisp/eshell/em-script.el +++ b/lisp/eshell/em-script.el @@ -34,8 +34,9 @@ commands, as a script file." ;;; User Variables: -(defcustom eshell-script-load-hook '(eshell-script-initialize) +(defcustom eshell-script-load-hook nil "A list of functions to call when loading `eshell-script'." + :version "24.1" ; removed eshell-script-initialize :type 'hook :group 'eshell-script) diff --git a/lisp/eshell/em-smart.el b/lisp/eshell/em-smart.el index 2c54930e43..f08fec8f8f 100644 --- a/lisp/eshell/em-smart.el +++ b/lisp/eshell/em-smart.el @@ -84,8 +84,9 @@ it to get a real sense of how it works." ;;; User Variables: -(defcustom eshell-smart-load-hook '(eshell-smart-initialize) +(defcustom eshell-smart-load-hook nil "A list of functions to call when loading `eshell-smart'." + :version "24.1" ; removed eshell-smart-initialize :type 'hook :group 'eshell-smart) diff --git a/lisp/eshell/em-term.el b/lisp/eshell/em-term.el index be394ba5b2..7d5fbbeabe 100644 --- a/lisp/eshell/em-term.el +++ b/lisp/eshell/em-term.el @@ -46,8 +46,9 @@ which commands are considered visual in nature." ;;; User Variables: -(defcustom eshell-term-load-hook '(eshell-term-initialize) +(defcustom eshell-term-load-hook nil "A list of functions to call when loading `eshell-term'." + :version "24.1" ; removed eshell-term-initialize :type 'hook :group 'eshell-term) diff --git a/lisp/eshell/em-unix.el b/lisp/eshell/em-unix.el index 3bb623c4c4..707f2ebc2c 100644 --- a/lisp/eshell/em-unix.el +++ b/lisp/eshell/em-unix.el @@ -53,8 +53,9 @@ by name)." :tag "UNIX commands in Lisp" :group 'eshell-module) -(defcustom eshell-unix-load-hook '(eshell-unix-initialize) +(defcustom eshell-unix-load-hook nil "A list of functions to run when `eshell-unix' is loaded." + :version "24.1" ; removed eshell-unix-initialize :type 'hook :group 'eshell-unix) diff --git a/lisp/eshell/esh-arg.el b/lisp/eshell/esh-arg.el index f42440ae4e..1fb8b7f4c3 100644 --- a/lisp/eshell/esh-arg.el +++ b/lisp/eshell/esh-arg.el @@ -117,8 +117,9 @@ treated as a literal character." ;;; User Variables: -(defcustom eshell-arg-load-hook '(eshell-arg-initialize) +(defcustom eshell-arg-load-hook nil "A hook that gets run when `eshell-arg' is loaded." + :version "24.1" ; removed eshell-arg-initialize :type 'hook :group 'eshell-arg) diff --git a/lisp/eshell/esh-cmd.el b/lisp/eshell/esh-cmd.el index 0a00300d19..62c14f3802 100644 --- a/lisp/eshell/esh-cmd.el +++ b/lisp/eshell/esh-cmd.el @@ -229,8 +229,9 @@ return non-nil if the command is complex." ;;; User Variables: -(defcustom eshell-cmd-load-hook '(eshell-cmd-initialize) +(defcustom eshell-cmd-load-hook nil "A hook that gets run when `eshell-cmd' is loaded." + :version "24.1" ; removed eshell-cmd-initialize :type 'hook :group 'eshell-cmd) diff --git a/lisp/eshell/esh-ext.el b/lisp/eshell/esh-ext.el index ebd20b90dd..3acbeac0b8 100644 --- a/lisp/eshell/esh-ext.el +++ b/lisp/eshell/esh-ext.el @@ -46,8 +46,9 @@ loaded into memory, thus beginning a new process." ;;; User Variables: -(defcustom eshell-ext-load-hook '(eshell-ext-initialize) +(defcustom eshell-ext-load-hook nil "A hook that gets run when `eshell-ext' is loaded." + :version "24.1" ; removed eshell-ext-initialize :type 'hook :group 'eshell-ext) diff --git a/lisp/eshell/esh-io.el b/lisp/eshell/esh-io.el index ef8966f1d7..71fae34b36 100644 --- a/lisp/eshell/esh-io.el +++ b/lisp/eshell/esh-io.el @@ -71,8 +71,9 @@ though they were files." ;;; User Variables: -(defcustom eshell-io-load-hook '(eshell-io-initialize) +(defcustom eshell-io-load-hook nil "A hook that gets run when `eshell-io' is loaded." + :version "24.1" ; removed eshell-io-initialize :type 'hook :group 'eshell-io) diff --git a/lisp/eshell/esh-mode.el b/lisp/eshell/esh-mode.el index 3b566ead0e..f7c727aa36 100644 --- a/lisp/eshell/esh-mode.el +++ b/lisp/eshell/esh-mode.el @@ -89,9 +89,10 @@ That is to say, the first time during an Emacs session." :type 'hook :group 'eshell-mode) -(defcustom eshell-exit-hook '(eshell-query-kill-processes) +(defcustom eshell-exit-hook nil "A hook that is run whenever `eshell' is exited. This hook is only run if exiting actually kills the buffer." + :version "24.1" ; removed eshell-query-kill-processes :type 'hook :group 'eshell-mode) @@ -287,6 +288,17 @@ This is used by `eshell-watch-for-password-prompt'." ;;; User Functions: +(defun eshell-kill-buffer-function () + "Function added to `kill-buffer-hook' in Eshell buffers. +This runs the function `eshell-kill-processes-on-exit', +and the hook `eshell-exit-hook'." + ;; It's fine to run this unconditionally since it can be customized + ;; via the `eshell-kill-processes-on-exit' variable. + (and (fboundp 'eshell-query-kill-processes) + (not (memq 'eshell-query-kill-processes eshell-exit-hook)) + (eshell-query-kill-processes)) + (run-hooks 'eshell-exit-hook)) + ;;;###autoload (defun eshell-mode () "Emacs shell interactive mode. @@ -403,17 +415,15 @@ This is used by `eshell-watch-for-password-prompt'." (unless (file-exists-p eshell-directory-name) (eshell-make-private-directory eshell-directory-name t)) - ;; load core Eshell modules for this session - (dolist (module (eshell-subgroups 'eshell)) - (run-hooks (intern-soft (concat (symbol-name module) - "-load-hook")))) - - ;; load extension modules for this session - (dolist (module eshell-modules-list) - (let ((load-hook (intern-soft (concat (symbol-name module) - "-load-hook")))) - (if (and load-hook (boundp load-hook)) - (run-hooks load-hook)))) + ;; Load core Eshell modules, then extension modules, for this session. + (dolist (module (append (eshell-subgroups 'eshell) eshell-modules-list)) + (let ((load-hook (intern-soft (format "%s-load-hook" module))) + (initfunc (intern-soft (format "%s-initialize" module)))) + (when (and load-hook (boundp load-hook)) + (if (memq initfunc (symbol-value load-hook)) (setq initfunc nil)) + (run-hooks load-hook)) + ;; So we don't need the -initialize functions on the hooks (b#5375). + (and initfunc (fboundp initfunc) (funcall initfunc)))) (if eshell-send-direct-to-subprocesses (add-hook 'pre-command-hook 'eshell-intercept-commands t t)) @@ -428,10 +438,7 @@ This is used by `eshell-watch-for-password-prompt'." (add-hook 'eshell-pre-command-hook 'eshell-command-started nil t) (add-hook 'eshell-post-command-hook 'eshell-command-finished nil t)) - (add-hook 'kill-buffer-hook - (function - (lambda () - (run-hooks 'eshell-exit-hook))) t t) + (add-hook 'kill-buffer-hook 'eshell-kill-buffer-function t t) (if eshell-first-time-p (run-hooks 'eshell-first-time-mode-hook)) diff --git a/lisp/eshell/esh-proc.el b/lisp/eshell/esh-proc.el index 8757f5d56a..f3fcc52aac 100644 --- a/lisp/eshell/esh-proc.el +++ b/lisp/eshell/esh-proc.el @@ -38,8 +38,9 @@ finish." ;;; User Variables: -(defcustom eshell-proc-load-hook '(eshell-proc-initialize) +(defcustom eshell-proc-load-hook nil "A hook that gets run when `eshell-proc' is loaded." + :version "24.1" ; removed eshell-proc-initialize :type 'hook :group 'eshell-proc) @@ -94,13 +95,14 @@ is created." :type 'hook :group 'eshell-proc) -(defcustom eshell-kill-hook '(eshell-reset-after-proc) +(defcustom eshell-kill-hook nil "Called when a process run by `eshell-gather-process-output' has ended. It is passed two arguments: the process that was just ended, and the termination status (as a string). Note that the first argument may be nil, in which case the user attempted to send a signal, but there was no relevant process. This can be used for displaying help information, for example." + :version "24.1" ; removed eshell-reset-after-proc :type 'hook :group 'eshell-proc) @@ -113,6 +115,14 @@ information, for example." ;;; Functions: +(defun eshell-kill-process-function (proc status) + "Function run when killing a process. +Runs `eshell-reset-after-proc' and `eshell-kill-hook', passing arguments +PROC and STATUS to both." + (or (memq 'eshell-reset-after-proc eshell-kill-hook) + (eshell-reset-after-proc proc status)) + (run-hook-with-args eshell-kill-hook proc status)) + (defun eshell-proc-initialize () "Initialize the process handling code." (make-local-variable 'eshell-process-list) @@ -346,7 +356,7 @@ See `eshell-needs-pipe'." (eshell-update-markers eshell-last-output-end) ;; Simulate the effect of eshell-sentinel. (eshell-close-handles (if (numberp exit-status) exit-status -1)) - (run-hook-with-args 'eshell-kill-hook command exit-status) + (eshell-kill-process-function command exit-status) (or eshell-in-pipeline-p (setq eshell-last-sync-output-start nil)) (if (not (numberp exit-status)) @@ -391,7 +401,7 @@ PROC is the process that's exiting. STRING is the exit message." (eshell-close-handles (process-exit-status proc) 'nil (cadr entry)))) (eshell-remove-process-entry entry)))) - (run-hook-with-args 'eshell-kill-hook proc string))))) + (eshell-kill-process-function proc string))))) (defun eshell-process-interact (func &optional all query) "Interact with a process, using PROMPT if more than one, via FUNC. @@ -485,31 +495,29 @@ See the variable `eshell-kill-processes-on-exit'." (kill-buffer buf))) (message nil)))) -(custom-add-option 'eshell-exit-hook 'eshell-query-kill-processes) - (defun eshell-interrupt-process () "Interrupt a process." (interactive) (unless (eshell-process-interact 'interrupt-process) - (run-hook-with-args 'eshell-kill-hook nil "interrupt"))) + (eshell-kill-process-function nil "interrupt"))) (defun eshell-kill-process () "Kill a process." (interactive) (unless (eshell-process-interact 'kill-process) - (run-hook-with-args 'eshell-kill-hook nil "killed"))) + (eshell-kill-process-function nil "killed"))) (defun eshell-quit-process () "Send quit signal to process." (interactive) (unless (eshell-process-interact 'quit-process) - (run-hook-with-args 'eshell-kill-hook nil "quit"))) + (eshell-kill-process-function nil "quit"))) ;(defun eshell-stop-process () ; "Send STOP signal to process." ; (interactive) ; (unless (eshell-process-interact 'stop-process) -; (run-hook-with-args 'eshell-kill-hook nil "stopped"))) +; (eshell-kill-process-function nil "stopped"))) ;(defun eshell-continue-process () ; "Send CONTINUE signal to process." @@ -518,7 +526,7 @@ See the variable `eshell-kill-processes-on-exit'." ; ;; jww (1999-09-17): this signal is not dealt with yet. For ; ;; example, `eshell-reset' will be called, and so will ; ;; `eshell-resume-eval'. -; (run-hook-with-args 'eshell-kill-hook nil "continue"))) +; (eshell-kill-process-function nil "continue"))) (defun eshell-send-eof-to-process () "Send EOF to process." diff --git a/lisp/eshell/esh-var.el b/lisp/eshell/esh-var.el index 8fb0896319..ae87215a76 100644 --- a/lisp/eshell/esh-var.el +++ b/lisp/eshell/esh-var.el @@ -126,8 +126,9 @@ variable value, a subcommand, or even the result of a Lisp form." ;;; User Variables: -(defcustom eshell-var-load-hook '(eshell-var-initialize) +(defcustom eshell-var-load-hook nil "A list of functions to call when loading `eshell-var'." + :version "24.1" ; removed eshell-var-initialize :type 'hook :group 'eshell-var) -- 2.20.1