From cb3a1380602b81aebf2217a2800ae1c326cb263b Mon Sep 17 00:00:00 2001 From: Stefan Monnier Date: Thu, 12 Dec 2013 14:47:11 -0500 Subject: [PATCH] * lisp/emacs-lisp/nadvice.el: Add `depth' property to manage ordering. (advice--make): Pay attention to `depth'. (advice--make-1): Don't autoload commands eagerly. * lisp/emacs-lisp/elp.el (elp-instrument-function): * lisp/emacs-lisp/trace.el (trace-function-internal): * lisp/emacs-lisp/debug.el (debug-on-entry): Keep them "first". * lisp/iswitchb.el (iswitchb-mode): Don't belittle ido. --- lisp/ChangeLog | 33 ++++++++++++++++++++++----------- lisp/emacs-lisp/debug.el | 3 ++- lisp/emacs-lisp/elp.el | 2 +- lisp/emacs-lisp/nadvice.el | 32 +++++++++++++++++++++----------- lisp/emacs-lisp/trace.el | 2 +- lisp/iswitchb.el | 3 ++- 6 files changed, 49 insertions(+), 26 deletions(-) diff --git a/lisp/ChangeLog b/lisp/ChangeLog index c761bce7518..59fe5fff0b8 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,14 @@ +2013-12-12 Stefan Monnier + + * emacs-lisp/nadvice.el: Add `depth' property to manage ordering. + (advice--make): Pay attention to `depth'. + (advice--make-1): Don't autoload commands eagerly. + * emacs-lisp/elp.el (elp-instrument-function): + * emacs-lisp/trace.el (trace-function-internal): + * emacs-lisp/debug.el (debug-on-entry): Keep them "first". + + * iswitchb.el (iswitchb-mode): Don't belittle ido. + 2013-12-12 Eli Zaretskii * term/w32-win.el (w32-handle-dropped-file): @@ -15,8 +26,8 @@ 2013-12-12 Nathan Trapuzzano (tiny change) - * progmodes/python.el (python-indent-calculate-indentation): When - determining indentation, don't treat "return", "pass", etc., as + * progmodes/python.el (python-indent-calculate-indentation): + When determining indentation, don't treat "return", "pass", etc., as operators when they are just string constituents. (Bug#15812) 2013-12-12 Juri Linkov @@ -56,7 +67,7 @@ 2013-12-11 Stefan Monnier * emacs-lisp/smie.el (smie-indent--hanging-p): Don't bother matching - comment-start-skip, since it fails when that uses submatch 1 (bug#16041). + comment-start-skip, which fails when that uses submatch 1 (bug#16041). * emulation/cua-base.el (cua-paste): Add `delete-selection' property instead of deleting the selection "by hand" (bug#16098). @@ -137,8 +148,8 @@ 2013-12-10 Teodor Zlatanov - * emacs-lisp/package.el (package-keyword-button-action): Remove - finder.el require dependency. + * emacs-lisp/package.el (package-keyword-button-action): + Remove finder.el require dependency. 2013-12-09 Teodor Zlatanov @@ -165,13 +176,13 @@ 2013-12-09 Cameron Desautels (tiny change) - * progmodes/ruby-mode.el (ruby-forward-string): Document. Handle - caret-delimited strings (Bug#16079). + * progmodes/ruby-mode.el (ruby-forward-string): Document. + Handle caret-delimited strings (Bug#16079). 2013-12-09 Dmitry Gutov - * progmodes/ruby-mode.el (ruby-accurate-end-of-block): When - `ruby-use-smie' is t, use `smie-forward-sexp' instead of + * progmodes/ruby-mode.el (ruby-accurate-end-of-block): + When `ruby-use-smie' is t, use `smie-forward-sexp' instead of `ruby-parse-partial' (Bug#16078). 2013-12-09 Leo Liu @@ -186,8 +197,8 @@ "default" is actually a key in an object literal. (js--same-line): New function. (js--multi-line-declaration-indentation): Use it. - (js--indent-in-array-comp, js--array-comp-indentation): New - functions. + (js--indent-in-array-comp, js--array-comp-indentation): + New functions. (js--proper-indentation): Use them, to handle array comprehension continuations. diff --git a/lisp/emacs-lisp/debug.el b/lisp/emacs-lisp/debug.el index dbd0f092446..77abbc96d2d 100644 --- a/lisp/emacs-lisp/debug.el +++ b/lisp/emacs-lisp/debug.el @@ -798,7 +798,8 @@ Redefining FUNCTION also cancels it." (not (special-form-p symbol)))) t nil nil (symbol-name fn))) (list (if (equal val "") fn (intern val))))) - (advice-add function :before #'debug--implement-debug-on-entry) + (advice-add function :before #'debug--implement-debug-on-entry + '((depth . -100))) function) (defun debug--function-list () diff --git a/lisp/emacs-lisp/elp.el b/lisp/emacs-lisp/elp.el index f1321eb4e6d..1187169b034 100644 --- a/lisp/emacs-lisp/elp.el +++ b/lisp/emacs-lisp/elp.el @@ -251,7 +251,7 @@ FUNSYM must be a symbol of a defined function." ;; Set the symbol's new profiling function definition to run ;; ELP wrapper. (advice-add funsym :around (elp--make-wrapper funsym) - `((name . ,elp--advice-name))))) + `((name . ,elp--advice-name) (depth . -99))))) (defun elp--instrumented-p (sym) (advice-member-p elp--advice-name sym)) diff --git a/lisp/emacs-lisp/nadvice.el b/lisp/emacs-lisp/nadvice.el index 0352164caf5..9f539338b59 100644 --- a/lisp/emacs-lisp/nadvice.el +++ b/lisp/emacs-lisp/nadvice.el @@ -129,8 +129,6 @@ Each element has the form (WHERE BYTECODE STACK) where: ;; TODO: make it so that interactive spec can be a constant which ;; dynamically checks the advice--car/cdr to do its job. ;; For that, advice-eval-interactive-spec needs to be more faithful. - ;; FIXME: The calls to interactive-form below load autoloaded functions - ;; too eagerly. (let ((fspec (cadr (interactive-form function)))) (when (eq 'function (car-safe fspec)) ;; Macroexpanded lambda? (setq fspec (nth 1 fspec))) @@ -147,19 +145,29 @@ Each element has the form (WHERE BYTECODE STACK) where: (apply #'make-byte-code 128 byte-code (vector #'apply function main props) stack-depth advice--docstring - (when (or (commandp function) (commandp main)) - (list (advice--make-interactive-form - function main)))))) + (and (or (commandp function) (commandp main)) + (not (and (symbolp main) ;; Don't autoload too eagerly! + (autoloadp (symbol-function main)))) + (list (advice--make-interactive-form + function main)))))) (when adv-sig (puthash advice adv-sig advertised-signature-table)) advice)) (defun advice--make (where function main props) "Build a function value that adds FUNCTION to MAIN at WHERE. WHERE is a symbol to select an entry in `advice--where-alist'." - (let ((desc (assq where advice--where-alist))) - (unless desc (error "Unknown add-function location `%S'" where)) - (advice--make-1 (nth 1 desc) (nth 2 desc) - function main props))) + (let ((fd (or (cdr (assq 'depth props)) 0)) + (md (if (advice--p main) + (or (cdr (assq 'depth (advice--props main))) 0)))) + (if (and md (> fd md)) + ;; `function' should go deeper. + (let ((rest (advice--make where function (advice--cdr main) props))) + (advice--make-1 (aref main 1) (aref main 3) + (advice--car main) rest (advice--props main))) + (let ((desc (assq where advice--where-alist))) + (unless desc (error "Unknown add-function location `%S'" where)) + (advice--make-1 (nth 1 desc) (nth 2 desc) + function main props))))) (defun advice--member-p (function name definition) (let ((found nil)) @@ -216,8 +224,6 @@ different, but `function-equal' will hopefully ignore those differences.") ;;;###autoload (defmacro add-function (where place function &optional props) ;; TODO: - ;; - provide some kind of control over ordering. E.g. debug-on-entry, ELP - ;; and tracing want to stay first. ;; - maybe let `where' specify some kind of predicate and use it ;; to implement things like mode-local or eieio-defmethod. ;; Of course, that only makes sense if the predicates of all advices can @@ -245,6 +251,10 @@ If FUNCTION was already added, do nothing. PROPS is an alist of additional properties, among which the following have a special meaning: - `name': a string or symbol. It can be used to refer to this piece of advice. +- `depth': a number indicating a preference w.r.t ordering. + The default depth is 0. By convention, a depth of 100 means that + the advice should be innermost (i.e. at the end of the list), + whereas a depth of -100 means that the advice should be outermost. If PLACE is a simple variable, only its global value will be affected. Use (local 'VAR) if you want to apply FUNCTION to VAR buffer-locally. diff --git a/lisp/emacs-lisp/trace.el b/lisp/emacs-lisp/trace.el index 3a2c44a8da6..cbbfd268445 100644 --- a/lisp/emacs-lisp/trace.el +++ b/lisp/emacs-lisp/trace.el @@ -256,7 +256,7 @@ be printed along with the arguments in the trace." function :around (trace-make-advice function (or buffer trace-buffer) background (or context (lambda () ""))) - `((name . ,trace-advice-name)))) + `((name . ,trace-advice-name) (depth . -100)))) (defun trace-is-traced (function) (advice-member-p trace-advice-name function)) diff --git a/lisp/iswitchb.el b/lisp/iswitchb.el index 796420a2ede..b802e7418d7 100644 --- a/lisp/iswitchb.el +++ b/lisp/iswitchb.el @@ -1427,7 +1427,8 @@ between buffers using substrings. See `iswitchb' for details." (add-hook 'minibuffer-setup-hook 'iswitchb-minibuffer-setup) (remove-hook 'minibuffer-setup-hook 'iswitchb-minibuffer-setup))) -(make-obsolete 'iswitchb-mode 'icomplete-mode "24.4") +(make-obsolete 'iswitchb-mode + "use icomplete-mode or ido-mode instead" "24.4") (provide 'iswitchb) -- 2.11.4.GIT