diff options
Diffstat (limited to 'lisp')
-rw-r--r-- | lisp/ChangeLog | 10 | ||||
-rw-r--r-- | lisp/emacs-lisp/advice.el | 22 | ||||
-rw-r--r-- | lisp/progmodes/sql.el | 47 |
3 files changed, 46 insertions, 33 deletions
diff --git a/lisp/ChangeLog b/lisp/ChangeLog index b54a3e281af..f0af63ac094 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,5 +1,15 @@ 2012-11-09 Stefan Monnier <monnier@iro.umontreal.ca> + * emacs-lisp/advice.el: Use new dynamic docstrings. + (ad-make-advised-definition-docstring, ad-advised-definition-p): + Use dynamic-docstring-function instead of ad-advice-info. + (ad--make-advised-docstring): New function extracted from + ad-make-advised-docstring. + (ad-make-advised-docstring): Use it. + * progmodes/sql.el (sql--make-help-docstring): New function, extracted + from sql-help. + (sql-help): Use it with dynamic-docstring-function. + * env.el (env--substitute-vars-regexp): Don't use rx (for bootstrap). 2012-11-08 Stefan Monnier <monnier@iro.umontreal.ca> diff --git a/lisp/emacs-lisp/advice.el b/lisp/emacs-lisp/advice.el index bd85238e23e..33805836db2 100644 --- a/lisp/emacs-lisp/advice.el +++ b/lisp/emacs-lisp/advice.el @@ -2414,13 +2414,15 @@ Like `interactive-form', but also works on pieces of advice." (if (ad-interactive-form definition) 1 0)) (cdr (cdr (ad-lambda-expression definition))))))) -(defun ad-make-advised-definition-docstring (function) +(defun ad-make-advised-definition-docstring (_function) "Make an identifying docstring for the advised definition of FUNCTION. Put function name into the documentation string so we can infer the name of the advised function from the docstring. This is needed to generate a proper advised docstring even if we are just given a definition (see the code for `documentation')." - (propertize "Advice doc string" 'ad-advice-info function)) + (eval-when-compile + (propertize "Advice doc string" 'dynamic-docstring-function + #'ad--make-advised-docstring))) (defun ad-advised-definition-p (definition) "Return non-nil if DEFINITION was generated from advice information." @@ -2429,7 +2431,7 @@ definition (see the code for `documentation')." (ad-compiled-p definition)) (let ((docstring (ad-docstring definition))) (and (stringp docstring) - (get-text-property 0 'ad-advice-info docstring))))) + (get-text-property 0 'dynamic-docstring-function docstring))))) (defun ad-definition-type (definition) "Return symbol that describes the type of DEFINITION." @@ -2752,6 +2754,13 @@ Example: `(ad-map-arglists '(a &rest args) '(w x y z))' will return (require 'help-fns) ;For help-split-fundoc and help-add-fundoc-usage. (defun ad-make-advised-docstring (function &optional style) + (let* ((origdef (ad-real-orig-definition function)) + (origdoc + ;; Retrieve raw doc, key substitution will be taken care of later: + (ad-real-documentation origdef t))) + (ad--make-advised-docstring origdoc function style))) + +(defun ad--make-advised-docstring (origdoc function &optional style) "Construct a documentation string for the advised FUNCTION. It concatenates the original documentation with the documentation strings of the individual pieces of advice which will be formatted @@ -2761,9 +2770,6 @@ strings corresponds to before/around/after and the individual ordering in any of these classes." (let* ((origdef (ad-real-orig-definition function)) (origtype (symbol-name (ad-definition-type origdef))) - (origdoc - ;; Retrieve raw doc, key substitution will be taken care of later: - (ad-real-documentation origdef t)) (usage (help-split-fundoc origdoc function)) paragraphs advice-docstring ad-usage) (setq usage (if (null usage) t (setq origdoc (cdr usage)) (car usage))) @@ -2780,7 +2786,9 @@ in any of these classes." (propertize ;; separate paragraphs with blank lines: (mapconcat 'identity (nreverse paragraphs) "\n\n") - 'ad-advice-info function))) + ;; FIXME: what is this for? + 'dynamic-docstring-function + #'ad--make-advised-docstring))) (help-add-fundoc-usage origdoc usage))) (defun ad-make-plain-docstring (function) diff --git a/lisp/progmodes/sql.el b/lisp/progmodes/sql.el index 3d5abc4df62..64b87d9e436 100644 --- a/lisp/progmodes/sql.el +++ b/lisp/progmodes/sql.el @@ -2802,8 +2802,12 @@ each line with INDENT." doc)) ;;;###autoload -(defun sql-help () - "Show short help for the SQL modes. +(eval + ;; FIXME: This dynamic-docstring-function trick doesn't work for byte-compiled + ;; functions, because of the lazy-loading of docstrings, which strips away + ;; text properties. + '(defun sql-help () + #("Show short help for the SQL modes. Use an entry function to open an interactive SQL buffer. This buffer is usually named `*SQL*'. The name of the major mode is SQLi. @@ -2834,32 +2838,23 @@ anything. The name of the major mode is SQL. In this SQL buffer (SQL mode), you can send the region or the entire buffer to the interactive SQL buffer (SQLi mode). The results are appended to the SQLi buffer without disturbing your SQL buffer." + 0 1 (dynamic-docstring-function sql--make-help-docstring)) (interactive) + (describe-function 'sql-help))) - ;; Insert references to loaded products into the help buffer string - (let ((doc (documentation 'sql-help t)) - changedp) - (setq changedp nil) - - ;; Insert FREE software list - (when (string-match "^\\(\\s-*\\)[\\\\][\\\\]FREE\\s-*\n" doc 0) - (setq doc (replace-match (sql-help-list-products (match-string 1 doc) t) - t t doc 0) - changedp t)) - - ;; Insert non-FREE software list - (when (string-match "^\\(\\s-*\\)[\\\\][\\\\]NONFREE\\s-*\n" doc 0) - (setq doc (replace-match (sql-help-list-products (match-string 1 doc) nil) - t t doc 0) - changedp t)) - - ;; If we changed the help text, save the change so that the help - ;; sub-system will see it - (when changedp - (put 'sql-help 'function-documentation doc))) - - ;; Call help on this function - (describe-function 'sql-help)) +(defun sql--make-help-docstring (doc _fun) + "Insert references to loaded products into the help buffer string." + + ;; Insert FREE software list + (when (string-match "^\\(\\s-*\\)[\\\\][\\\\]FREE\\s-*\n" doc 0) + (setq doc (replace-match (sql-help-list-products (match-string 1 doc) t) + t t doc 0))) + + ;; Insert non-FREE software list + (when (string-match "^\\(\\s-*\\)[\\\\][\\\\]NONFREE\\s-*\n" doc 0) + (setq doc (replace-match (sql-help-list-products (match-string 1 doc) nil) + t t doc 0))) + doc) (defun sql-read-passwd (prompt &optional default) "Read a password using PROMPT. Optional DEFAULT is password to start with." |