* Patch: perform autoloading when docs is missing from autoload object @ 2021-09-15 13:51 Arthur Miller 2021-09-15 18:14 ` Stefan Monnier 2021-09-16 12:51 ` Lars Ingebrigtsen 0 siblings, 2 replies; 23+ messages in thread From: Arthur Miller @ 2021-09-15 13:51 UTC (permalink / raw) To: emacs-devel [-- Attachment #1: Type: text/plain, Size: 1389 bytes --] I would like help functions to autoload files when help on symbols is requestd. Built-in help do that only in limited cases, while helpful dutifully loads libraries when symbol is not loaded. I would actually prefer to just load documentation not the entire library, and I think I can do that, but it is a little bit more involved (have to find source and read the docs), unlike just performing autoloading. About the patch: there is already an help-enable-autoload option for built-in help, probably meant to do exactly what I want, but it is much more savvy what it loads (only kemaps I think?). I have introduced new variable, help-enable-symbol-autoload, and more aggressive autoloading will be performed only when this one is set to 't, so it is an opt-in option. I would gladly skip that extra variable and use original one, but that would turn it into opt-out option which might not be desired by everyone. I am not sure if understand exact usage of built-in help functions, but the main entry should be describe-* functions, and this should only affect those? I am little bit unsecure here. I have two versions, I prefer the first, help-fns.el only one, but as said, I am a bit unsure how help functions are used, so I have attached an alternative too. To note: this is only for functions, I am not sure if it is needed for variables? It is just a proposal. Best regards /a [-- Warning: decoded text below may be mangled, UTF-8 assumed --] [-- Attachment #2: 0001-only-help-fns.patch --] [-- Type: text/x-patch, Size: 1351 bytes --] From 45e387e15166c5194fe4b78ec01bb65f0db9bcb4 Mon Sep 17 00:00:00 2001 From: Arthur Miller <arthur.miller@live.com> Date: Wed, 15 Sep 2021 15:15:30 +0200 Subject: [PATCH] Do autoload if docs are not present in autoloads * lisp/help-fns.el ('help-enable-symbol-autoload'): New option. (help-fns--analyze-function): Perform autoloading when docs are missing from autoload objects. --- lisp/help-fns.el | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/lisp/help-fns.el b/lisp/help-fns.el index a7219ede94..575c69638d 100644 --- a/lisp/help-fns.el +++ b/lisp/help-fns.el @@ -132,6 +132,12 @@ help-enable-completion-autoload :group 'help :version "26.3") +(defcustom help-enable-symbol-autoload nil + "Perform autoload if docs are missing from autoload objects." + :type 'boolean + :group 'help + :version "28.1") + (defun help--symbol-class (s) "Return symbol class characters for symbol S." (when (stringp s) @@ -823,6 +829,11 @@ help-fns--analyze-function f)) ((subrp def) (intern (subr-name def))) (t def)))) + + (and (autoloadp real-def) (not (nth 2 real-def)) + help-enable-symbol-autoload + (autoload-do-load real-def)) + (list real-function def aliased real-def))) (defun help-fns-function-description-header (function) -- 2.33.0 [-- Warning: decoded text below may be mangled, UTF-8 assumed --] [-- Attachment #3: 0002-with-help.el.patch --] [-- Type: text/x-patch, Size: 1788 bytes --] From 1f6fd7ee99b3807e012d366d71679ae917cac096 Mon Sep 17 00:00:00 2001 From: Arthur Miller <arthur.miller@live.com> Date: Wed, 15 Sep 2021 12:40:34 +0200 Subject: [PATCH] Load symbols when docs are not present in autoloads * lisp/help-fns.el ('help-enable-symbol-autoload'): New option. * lisp/help.el (help-function-arglist): Check if docs are present in autoload object, and perform autoload if they are not. --- lisp/help-fns.el | 6 ++++++ lisp/help.el | 4 ++++ 2 files changed, 10 insertions(+) diff --git a/lisp/help-fns.el b/lisp/help-fns.el index a7219ede94..842bcb39fe 100644 --- a/lisp/help-fns.el +++ b/lisp/help-fns.el @@ -132,6 +132,12 @@ help-enable-completion-autoload :group 'help :version "26.3") +(defcustom help-enable-symbol-autoload nil + "Perform autoload when documentation is not present in autoload object." + :type 'boolean + :group 'help + :version "28.1") + (defun help--symbol-class (s) "Return symbol class characters for symbol S." (when (stringp s) diff --git a/lisp/help.el b/lisp/help.el index 29ae340481..9b6ae0c821 100644 --- a/lisp/help.el +++ b/lisp/help.el @@ -1883,6 +1883,10 @@ help-function-arglist "Return a formal argument list for the function DEF. If PRESERVE-NAMES is non-nil, return a formal arglist that uses the same names as used in the original source code, when possible." + ;; Load docs for autoloads when doc is missing. + (if (and (autoloadp def) (not (nth 2 def)) help-enable-symbol-autoload + (not (and (nth 4 def) (eq (nth 4 def) 'keymap)))) + (autoload-do-load def)) ;; Handle symbols aliased to other symbols. (if (and (symbolp def) (fboundp def)) (setq def (indirect-function def))) ;; Advice wrappers have "catch all" args, so fetch the actual underlying -- 2.33.0 ^ permalink raw reply related [flat|nested] 23+ messages in thread
* Re: Patch: perform autoloading when docs is missing from autoload object 2021-09-15 13:51 Patch: perform autoloading when docs is missing from autoload object Arthur Miller @ 2021-09-15 18:14 ` Stefan Monnier 2021-09-15 22:29 ` Arthur Miller 2021-09-16 12:51 ` Lars Ingebrigtsen 1 sibling, 1 reply; 23+ messages in thread From: Stefan Monnier @ 2021-09-15 18:14 UTC (permalink / raw) To: Arthur Miller; +Cc: emacs-devel > loads libraries when symbol is not loaded. I would actually prefer to just load > documentation not the entire library, and I think I can do that, but it is a > little bit more involved (have to find source and read the docs), unlike just > performing autoloading. Loading a docstring from the .el file can be tricky/cumbersome (at least if we want it to be reliable and 100% correct), but as for loading a docstring from a .elc file this is standard (its controlled by the variable `byte-compile-dynamic-docstrings`), although currently it seems it's not done for autoloads. Stefan ^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: Patch: perform autoloading when docs is missing from autoload object 2021-09-15 18:14 ` Stefan Monnier @ 2021-09-15 22:29 ` Arthur Miller 2021-09-17 16:38 ` Stefan Monnier 0 siblings, 1 reply; 23+ messages in thread From: Arthur Miller @ 2021-09-15 22:29 UTC (permalink / raw) To: Stefan Monnier; +Cc: emacs-devel Stefan Monnier <monnier@iro.umontreal.ca> writes: >> loads libraries when symbol is not loaded. I would actually prefer to just load >> documentation not the entire library, and I think I can do that, but it is a >> little bit more involved (have to find source and read the docs), unlike just >> performing autoloading. > > Loading a docstring from the .el file can be tricky/cumbersome (at > least if we want it to be reliable and 100% correct), but as for loading > a docstring from a .elc file this is standard (its controlled by > the variable `byte-compile-dynamic-docstrings`), although currently it > seems it's not done for autoloads. Indeed. My thoughts were to read .elc when avialable, and .el only if there is no .elc file available. I didn't want to write too much about that, I wanted to get something usable; I see doc loading as an optimization to proposed patch. If/when I it will just replace autoload-do-load. It is one of those "would-be-nice-to-have todo items". Until than, the proposed patch is functionally equivavelnt to what helpful does in this regard. I would like to hear opinion if I should look at some other place to implement this, and if the strategy with opt-in/opt-out and extra defcustom option is OK. ^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: Patch: perform autoloading when docs is missing from autoload object 2021-09-15 22:29 ` Arthur Miller @ 2021-09-17 16:38 ` Stefan Monnier 2021-09-17 16:56 ` Generic autoloading? [Was Patch: perform autoloading when docs is missing from autoload object] Qiantan Hong 2021-09-17 21:09 ` Patch: perform autoloading when docs is missing from autoload object Arthur Miller 0 siblings, 2 replies; 23+ messages in thread From: Stefan Monnier @ 2021-09-17 16:38 UTC (permalink / raw) To: Arthur Miller; +Cc: emacs-devel > Indeed. My thoughts were to read .elc when avialable, I'm not sure you're familiar with the way it works for functions, but basically the docstring is replaced by a "pointer" that's a cons cell that combines the name of the file from which the function was loaded together with an integer indicating at which byte-offset the docstring can be found (the filename string is the same string used in all the docstring of that file as well as the string used in `load-history`, in terms of memory cost, it only really costs a single con-cell). So there'd be no need for "when available" heuristic. And all the code is already there to do the same for autoloads. All it takes is to start compiling the autoloads files. Stefan ^ permalink raw reply [flat|nested] 23+ messages in thread
* Generic autoloading? [Was Patch: perform autoloading when docs is missing from autoload object] 2021-09-17 16:38 ` Stefan Monnier @ 2021-09-17 16:56 ` Qiantan Hong 2021-09-17 19:36 ` Stefan Monnier 2021-09-17 21:25 ` Arthur Miller 2021-09-17 21:09 ` Patch: perform autoloading when docs is missing from autoload object Arthur Miller 1 sibling, 2 replies; 23+ messages in thread From: Qiantan Hong @ 2021-09-17 16:56 UTC (permalink / raw) To: Stefan Monnier; +Cc: Arthur Miller, emacs-devel@gnu.org Just in case, is it possible to provide a generic autoload mechanism that run arbitrary function to load the missing function, instead of hardcoded to basically a REQUIRE? This can be very helpful for my object capabilities implementation because it can be used to support importing object graph more lazily. (Instead of needing to traverse a full reference closure of a function, we can stop at arbitrary function and resume traversal only when that function is called). Currently I can fake it with a closure that knows where it is and replace itself once called. But it feels like reimplementing the same thing twice. (I think current autoload can also be implemented in pure Elisp in this way, but we already have autoload object, so why not generalize it a bit). Best, Qiantan ^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: Generic autoloading? [Was Patch: perform autoloading when docs is missing from autoload object] 2021-09-17 16:56 ` Generic autoloading? [Was Patch: perform autoloading when docs is missing from autoload object] Qiantan Hong @ 2021-09-17 19:36 ` Stefan Monnier 2021-09-17 19:51 ` Qiantan Hong 2021-09-17 21:25 ` Arthur Miller 1 sibling, 1 reply; 23+ messages in thread From: Stefan Monnier @ 2021-09-17 19:36 UTC (permalink / raw) To: Qiantan Hong; +Cc: Arthur Miller, emacs-devel@gnu.org > Just in case, is it possible to provide a generic autoload mechanism > that run arbitrary function to load the missing function, > instead of hardcoded to basically a REQUIRE? I think if it doesn't end up loading a file, and isn't bound to the `symbol-function` cell of a symbol, then it's probably too different from our autoloads to be worth trying to shoehorn it into the existing system. > Currently I can fake it with a closure that knows where it is > and replace itself once called. I think the fix is to remove the word "fake" in the description ;-) > But it feels like reimplementing the same thing twice. I haven't looked at your code, but if what you fetch lazily is itself a function, then I suspect that your "faking code" is clean, short, and reliable, and there isn't much to share with the autoload code (other than a philosophical similarity). > (I think current autoload can also be implemented in pure Elisp > in this way, More or less, yes (tho it gets more costly in terms of heap usage). Also, we have accrued various subtle details that are inconvenient to mimic (e.g. various places call `autoload-do-load` manually rather than just calling the function in order to get a bit more control over what happens when). Stefan ^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: Generic autoloading? [Was Patch: perform autoloading when docs is missing from autoload object] 2021-09-17 19:36 ` Stefan Monnier @ 2021-09-17 19:51 ` Qiantan Hong 0 siblings, 0 replies; 23+ messages in thread From: Qiantan Hong @ 2021-09-17 19:51 UTC (permalink / raw) To: Stefan Monnier; +Cc: emacs-devel@gnu.org > I haven't looked at your code, but if what you fetch lazily is itself > a function, then I suspect that your "faking code" is clean, short, and > reliable, and there isn't much to share with the autoload code (other > than a philosophical similarity). Thanks for the comment. I will probably do it that way then. Also the prototype I last sent doesn’t do this yet, it just demonstrate the basic idea, and is not a polished implementation. Whether and how to do it lazily is a pure implementation issue. The issue with the Elisp prototype is, it walks the object graph recursively, and I suspect in practice it will occasionally use up stack space. How can we work around this? ^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: Generic autoloading? [Was Patch: perform autoloading when docs is missing from autoload object] 2021-09-17 16:56 ` Generic autoloading? [Was Patch: perform autoloading when docs is missing from autoload object] Qiantan Hong 2021-09-17 19:36 ` Stefan Monnier @ 2021-09-17 21:25 ` Arthur Miller 1 sibling, 0 replies; 23+ messages in thread From: Arthur Miller @ 2021-09-17 21:25 UTC (permalink / raw) To: Qiantan Hong; +Cc: Stefan Monnier, emacs-devel@gnu.org Qiantan Hong <qhong@mit.edu> writes: > Just in case, is it possible to provide a generic autoload mechanism > that run arbitrary function to load the missing function, > instead of hardcoded to basically a REQUIRE? > > This can be very helpful for my object capabilities implementation > because it can be used to support importing object graph more lazily. > (Instead of needing to traverse a full reference closure of a function, > we can stop at arbitrary function and resume traversal only when > that function is called). > > Currently I can fake it with a closure that knows where it is > and replace itself once called. That is what autoloads does in principle. Autoload is just a stub in funcion slot of a symbol that loads the library where object is placed. > But it feels like reimplementing the same thing twice. Yes it sounds similar in essence, but you are doing this probably from memory, autoloads are to save cpu time and speed by delay-loading from the disk "on demand". ^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: Patch: perform autoloading when docs is missing from autoload object 2021-09-17 16:38 ` Stefan Monnier 2021-09-17 16:56 ` Generic autoloading? [Was Patch: perform autoloading when docs is missing from autoload object] Qiantan Hong @ 2021-09-17 21:09 ` Arthur Miller 2021-09-18 13:37 ` Stefan Monnier 1 sibling, 1 reply; 23+ messages in thread From: Arthur Miller @ 2021-09-17 21:09 UTC (permalink / raw) To: Stefan Monnier; +Cc: emacs-devel Stefan Monnier <monnier@iro.umontreal.ca> writes: >> Indeed. My thoughts were to read .elc when avialable, > > I'm not sure you're familiar with the way it works for functions, but > basically the docstring is replaced by a "pointer" that's a cons cell > that combines the name of the file from which the function was loaded > together with an integer indicating at which byte-offset the docstring > can be found (the filename string is the same string used in all the > docstring of that file as well as the string used in `load-history`, in > terms of memory cost, it only really costs a single con-cell). Actually I was quite aware of that part, and how it works there. I looked at that very explicitly. I am quite aware that it costs just an offset there, and I don't have anything against that. I have no intention to do anything for that case, it works as it is. I am not sure that we speak about the same thing. I am talking about the case when there is a nil for doc, and library needs to be autoloaded. When I ask for the help form describe-function, if there is a 'nil in the autoload object itself, I would prefer not to load the entire library just to load the symbol documentation for the use in help-mode buffer. Lars expressed some concerns about loading library just for the doc purpose, so it might be more appropriate in that case. > So there'd be no need for "when available" heuristic. Yes, in case you have that pointer, which I wasn't objecting to at all, but not when you have a nil instead of that pointer. Or am I wrong there? > And all the code is already there to do the same for autoloads. You mean to start generating those pointers instead of embedding the docs? It would be an improvement indeed :). Still the case of hand-crafted code or code generating but something else than supplied autoloading routines leaves for a fully valid nil to be a part of the autoload object. > All it takes is to start compiling the autoloads files. Ok, but it does not seem that it works the way you say, at least not atm. This is what I see in my Emacs, correct me if I do something wrong here. I just tested with generated package-quickstart.el file. Below is what I get when I M-: (symbol-function 'winum-select-window-0), as both before I byte-compiled and after I byte-compiled: (autoload "winum" "Jump to window 0. If prefix ARG is given, delete the window instead of selecting it. (fn &optional ARG)" t nil) It is also fully possible that someone prefer to omit anything optional :): #+begin_src emacs-lisp (autoload 'academic-phrases "academic-phrases") (autoload 'academic-phrases-by-section "academic-phrases") (autoload 'ace-select-window "ace-window") (autoload 'ace-delete-window "ace-window") (autoload 'ace-swap-window "ace-window") (autoload 'ace-delete-other-windows "ace-window") (autoload 'ace-display-buffer "ace-window") (autoload 'ace-window "ace-window") (autoload 'ace-window-display-mode "ace-window") ( ... ) #+end_src That is a fragment of what I use instead of quickstart file. I do compile entire autoloads file together with my init.el, but I don't get any pointers to doc by default. After compilining my own autoload.el, byte compiling it, loading and evaling same (symbol-function 'winum-select-window-0): Loading /home/arthur/.emacs.d/autoloads.elc...done Mark set (autoload "winum" nil nil nil) Mark set I thought maybe I needed to tell byte compiler that those autoloads are all functions: #+begin_src emacs-lisp (autoload 'academic-phrases "academic-phrases"nil nil t) (autoload 'academic-phrases-by-section "academic-phrases"nil nil t) (autoload 'ace-select-window "ace-window"nil nil t) (autoload 'ace-delete-window "ace-window"nil nil t) (autoload 'ace-swap-window "ace-window"nil nil t) (autoload 'ace-delete-other-windows "ace-window"nil nil t) (autoload 'ace-display-buffer "ace-window"nil nil t) (autoload 'ace-window "ace-window"nil nil t) (autoload 'ace-window-display-mode "ace-window"nil nil t) ( ... ) #+end_src After recompile and reload I get this: (autoload "winum" nil nil t) So the entire business of docs in autoloads is due to autoload file generation, seems to me, if I don't misunderstanding something? I certainly have no problems if autoloads generation is fixed and built-in autoloads file generator emitted byte offsets instead of kilo bytes of fully embedded docs. But there is the case that nil is a valid value for doc in autoload object, and thus I think it is still important to fix help system, to fetch docs on demand. ^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: Patch: perform autoloading when docs is missing from autoload object 2021-09-17 21:09 ` Patch: perform autoloading when docs is missing from autoload object Arthur Miller @ 2021-09-18 13:37 ` Stefan Monnier 2021-09-18 18:25 ` Arthur Miller 0 siblings, 1 reply; 23+ messages in thread From: Stefan Monnier @ 2021-09-18 13:37 UTC (permalink / raw) To: Arthur Miller; +Cc: emacs-devel > I just tested with generated package-quickstart.el file. Below is what I get > when I M-: (symbol-function 'winum-select-window-0), as both before I > byte-compiled and after I byte-compiled: How did you perform the test? I tested it on my end with the `loaddefs.el` file and "it worked", but it required several tweaks (like removing the `no-byte-compile:t` from the file-local variables, and telling `loadup.el` to load `loaddefs` rather than `loaddefs.el`). So I wouldn't be surprised if you need to take extra steps to convince Emacs to compile the file and to load the compiled version of the file. > So the entire business of docs in autoloads is due to autoload file generation, > seems to me, if I don't misunderstanding something? I'm afraid I don't know what you mean by "business of docs in autoloads". > I certainly have no problems if autoloads generation is fixed and > built-in autoloads file generator emitted byte offsets instead of kilo > bytes of fully embedded docs. Indeed, I think we should be possible to change `autoload.el` so that it directly generates the "comment + byte-offsets" form in the .el files so we don't even need to byte-compile them. Not sure if it's a better than byte-compiling them. > But there is the case that nil is a valid value for doc in autoload > object, and thus I think it is still important to fix help system, to > fetch docs on demand. That's true. We could also just always use nil and always load the source file to find the doc. I'm not sure in that case it'd be worth the trouble trying to avoid loading the whole file (I think it'd take a fair bit of effort to make it work reliably enough). Stefan ^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: Patch: perform autoloading when docs is missing from autoload object 2021-09-18 13:37 ` Stefan Monnier @ 2021-09-18 18:25 ` Arthur Miller 2021-09-20 17:02 ` Stefan Monnier 0 siblings, 1 reply; 23+ messages in thread From: Arthur Miller @ 2021-09-18 18:25 UTC (permalink / raw) To: Stefan Monnier; +Cc: emacs-devel Stefan Monnier <monnier@iro.umontreal.ca> writes: >> I just tested with generated package-quickstart.el file. Below is what I get >> when I M-: (symbol-function 'winum-select-window-0), as both before I >> byte-compiled and after I byte-compiled: > > How did you perform the test? If I remember well, we have removed the no-byte-compile form the package-quickstart.el a while ago. I just re-created new one, and I can confirm that is no file-local variable that forbids it to be byte compiled. When I checked yesterday the file was truly byte-compiled. I opened .elc file and evaled it when I was writing the mail. > > I tested it on my end with the `loaddefs.el` file and "it worked", but > it required several tweaks (like removing the `no-byte-compile:t` from > the file-local variables, and telling `loadup.el` to load `loaddefs` > rather than `loaddefs.el`). I tested with package-quickstart. As said, manually opened .elc and evaled the buffer. > So I wouldn't be surprised if you need to take extra steps to convince > Emacs to compile the file and to load the compiled version of the file. Aha. Maybe. Than I am not sure how to do it. By the way, when I was reading the manual, and testing all this, I could see that autoloads from Emacs sources were with offsets in autoload object. But I couldn't see those from installed packages. That is why I have finally ditched the entire package-quickstart and Emacs autoload generation. >> So the entire business of docs in autoloads is due to autoload file generation, >> seems to me, if I don't misunderstanding something? > > I'm afraid I don't know what you mean by "business of docs in autoloads". Eh; sorry, that was a goofy expression. I meant that documentation ends up in autoload objects, because Emacs code that scrapes for autoloads explicitly put it there. I am no 100% sure, that is just my assumption, I hoped you would say yes or no :). >> I certainly have no problems if autoloads generation is fixed and >> built-in autoloads file generator emitted byte offsets instead of kilo >> bytes of fully embedded docs. > > Indeed, I think we should be possible to change `autoload.el` so that it > directly generates the "comment + byte-offsets" form in the .el files > so we don't even need to byte-compile them. Not sure if it's a better > than byte-compiling them. I am not either, it is a lot of data that gets pulled in when docs are compiled. Maybe left it as a user option? >> But there is the case that nil is a valid value for doc in autoload >> object, and thus I think it is still important to fix help system, to >> fetch docs on demand. > > That's true. We could also just always use nil and always load the > source file to find the doc. I'm not sure in that case it'd be worth > the trouble trying to avoid loading the whole file (I think it'd take > a fair bit of effort to make it work reliably enough). Rationale was that it is faster to just parsing with 'read' without loading structures in the memory; But I think that you are correct; it might not be worth the trouble, since it would take quite some parsing effort to do it well, if it is even possible. I think it could only be those symbols that are more or less explicitly defined as defun, defmacro, defconst, defvar etc. Indirect definitions are almost impossible to find but I don't think those are recognized by completion either, so they are probably not possible to request with describe-* functions. I have some parsing code I wrote tonight to pull in source for symbols (instead of built-ins I used yesterday, as seen in patched help-mode.el in the bug report I filed). What I have noticed is that I can't request from Emacs to give me docs for 'package-desc' which is a cl-defstruct in package.el, because completion does not seem to recoginze it as a symbol. But maybe I am wrong about that one, I am not sure there. ^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: Patch: perform autoloading when docs is missing from autoload object 2021-09-18 18:25 ` Arthur Miller @ 2021-09-20 17:02 ` Stefan Monnier 2021-09-22 16:18 ` Arthur Miller 0 siblings, 1 reply; 23+ messages in thread From: Stefan Monnier @ 2021-09-20 17:02 UTC (permalink / raw) To: Arthur Miller; +Cc: emacs-devel > I tested with package-quickstart. As said, manually opened .elc and > evaled the buffer. Hmm... Can't see an obvious reason why it didn't do "the right thing" for you (tho `M-x eval-buffer` will result in an unusable (FILE . OFFSET) pair because the `load-file-name` var is not setup; a better test is to load the file, but that doesn't explain why you ended up with an actual doc *string*). > By the way, when I was reading the manual, and testing all this, I could see > that autoloads from Emacs sources were with offsets in autoload object. Yes, this a special case: they're offsets into the `etc/DOC` file, generated by the `lib-src/make-docfile.c` auxiliary tool. This so as to bring the cost down further: instead of (FILE . OFFSET) we can use just OFFSET where FILE is known implicitly to be `etc/DOC`. > But I couldn't see those from installed packages. That is why I have > finally ditched the entire package-quickstart and Emacs > autoload generation. Looking at the code, everything seems to be in place such that byte-compiling the `package-quickstart.el` file *should* end up with (FILE . OFFSET)s, but I haven't tested it to confirm yet. You say it doesn't work, so apparently there's something somewhere that still gets in the way :-( >>> So the entire business of docs in autoloads is due to autoload file generation, >>> seems to me, if I don't misunderstanding something? >> I'm afraid I don't know what you mean by "business of docs in autoloads". > Eh; sorry, that was a goofy expression. I meant that documentation ends up > in autoload objects, because Emacs code that scrapes for autoloads explicitly put > it there. I am no 100% sure, that is just my assumption, I hoped you would say > yes or no :). Ah, well then "yes" ;-) > Rationale was that it is faster to just parsing with 'read' without loading > structures in the memory; Most Elisp files can be loaded fairly quickly (some exceptions are things like `org.el` that pull in a lot of dependencies) and we'd only do it once per session an only in some particular cases (not in loops, etc...), so it's not that terribly important. Stefan ^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: Patch: perform autoloading when docs is missing from autoload object 2021-09-20 17:02 ` Stefan Monnier @ 2021-09-22 16:18 ` Arthur Miller 0 siblings, 0 replies; 23+ messages in thread From: Arthur Miller @ 2021-09-22 16:18 UTC (permalink / raw) To: Stefan Monnier; +Cc: emacs-devel Stefan Monnier <monnier@iro.umontreal.ca> writes: >> I tested with package-quickstart. As said, manually opened .elc and >> evaled the buffer. > > Hmm... Can't see an obvious reason why it didn't do "the right thing" > for you (tho `M-x eval-buffer` will result in an unusable (FILE . OFFSET) > pair because the `load-file-name` var is not setup; a better test is to > load the file, but that doesn't explain why you ended up with an actual > doc *string*). Sorry for bit late answer, I was little busy with playing with help-buffer, so wasn't have so much time for anything else. I wanted to try this with Emac -Q to be sure it's not my init file. I did as you describe, and just loaded the file in Emacs -Q, but it still puts in embedded docs. I am not sure, I have just been looking now around, without actually exectuing anything, but I think that the actual data is emitted in (defun autoload-print-form (form)) in autoload.el, and I don't see there anything about offsets. But I am not sure about it, to be honest; was just quick look at the pipleine. I have tried to trace package-quicstart-refresh calls, but I didn't come out more informed than I was before, so I will leave it for the moment. >> By the way, when I was reading the manual, and testing all this, I could see >> that autoloads from Emacs sources were with offsets in autoload object. > > Yes, this a special case: they're offsets into the `etc/DOC` file, > generated by the `lib-src/make-docfile.c` auxiliary tool. > This so as to bring the cost down further: instead of (FILE . OFFSET) we > can use just OFFSET where FILE is known implicitly to be `etc/DOC`. Cool, thank you for the info. Can't generated autoloads use the same trick for every file? I reason that every .elc file installe din elpa is known at compile time and load time as well. Since file itself is recorded in autoload object, can't the same be applied? Or are there more details in the play? >> But I couldn't see those from installed packages. That is why I have >> finally ditched the entire package-quickstart and Emacs >> autoload generation. > > Looking at the code, everything seems to be in place such that > byte-compiling the `package-quickstart.el` file *should* end up with > (FILE . OFFSET)s, but I haven't tested it to confirm yet. > You say it doesn't work, so apparently there's something somewhere that > still gets in the way :-( As mentioned above, I just tried with Emacs -Q and doing as you described, but I just see embedded docs. I am not trolling or anything, I'll be glad to help to find why is it so if I can. >>>> So the entire business of docs in autoloads is due to autoload file generation, >>>> seems to me, if I don't misunderstanding something? >>> I'm afraid I don't know what you mean by "business of docs in autoloads". >> Eh; sorry, that was a goofy expression. I meant that documentation ends up >> in autoload objects, because Emacs code that scrapes for autoloads explicitly put >> it there. I am no 100% sure, that is just my assumption, I hoped you would say >> yes or no :). > > Ah, well then "yes" ;-) > >> Rationale was that it is faster to just parsing with 'read' without loading >> structures in the memory; > > Most Elisp files can be loaded fairly quickly (some exceptions are > things like `org.el` that pull in a lot of dependencies) and we'd only do > it once per session an only in some particular cases (not in loops, > etc...), so it's not that terribly important. > Indeed require/provide mechanism is a good thing and I also think it is not that important. When you touch on loading files; may I ask, if you have time to anser; why require/provide isn't automated in a sense, that it always provide a feature equaly named as the file loaded? When I was learning about it, as I understand, a file can provide several features, which not many elisp file actually do. It can also be used to name feature differently from the file itself, which few actually do. It is all good, flexibility is always good, but for if I would like to check if a file is loaded, and I don't know which features it provides, if any, do I have any easy way of knowing it? I can look at load-hist and serach in lists, but it is very convenient to say, as an example, (require 'subr) and be confident that the file won't be loaded if it is already loaded. 'load' loads files unconditionally, right? It probably should since it is a low-level function I guess. Sorry if I am asking too much, there is so much to learn about Emacs :). ^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: Patch: perform autoloading when docs is missing from autoload object 2021-09-15 13:51 Patch: perform autoloading when docs is missing from autoload object Arthur Miller 2021-09-15 18:14 ` Stefan Monnier @ 2021-09-16 12:51 ` Lars Ingebrigtsen 2021-09-17 6:49 ` Arthur Miller 1 sibling, 1 reply; 23+ messages in thread From: Lars Ingebrigtsen @ 2021-09-16 12:51 UTC (permalink / raw) To: Arthur Miller; +Cc: emacs-devel Arthur Miller <arthur.miller@live.com> writes: > I would like help functions to autoload files when help on symbols is > requestd. In which cases will this make a difference when displaying the *Help* buffer for the symbol? -- (domestic pets only, the antidote for overdose, milk.) bloggy blog: http://lars.ingebrigtsen.no ^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: Patch: perform autoloading when docs is missing from autoload object 2021-09-16 12:51 ` Lars Ingebrigtsen @ 2021-09-17 6:49 ` Arthur Miller 2021-09-17 14:01 ` Lars Ingebrigtsen 0 siblings, 1 reply; 23+ messages in thread From: Arthur Miller @ 2021-09-17 6:49 UTC (permalink / raw) To: Lars Ingebrigtsen; +Cc: emacs-devel Lars Ingebrigtsen <larsi@gnus.org> writes: > Arthur Miller <arthur.miller@live.com> writes: > >> I would like help functions to autoload files when help on symbols is >> requestd. > > In which cases will this make a difference when displaying the *Help* > buffer for the symbol? In case where the symbol is not loaded, and there is no doc entry in autoload object. Doc entry is optional for autoload objects. It can be useful when a handcrafts an autoload statement, and omitt doc entry in the object, or it someone might write an application that does not omit docs in autoload statements. I personally don't use package-quickstart.el and I don't use built-in code to generate autoloads for my system, because it is faster and less resource consuming to not to. I just emit symbol name and path. Helpful autoload on deman when I ask for docs, while built-in does not, so I think it would be useful in built-in help too. ^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: Patch: perform autoloading when docs is missing from autoload object 2021-09-17 6:49 ` Arthur Miller @ 2021-09-17 14:01 ` Lars Ingebrigtsen 2021-09-17 15:04 ` Arthur Miller 0 siblings, 1 reply; 23+ messages in thread From: Lars Ingebrigtsen @ 2021-09-17 14:01 UTC (permalink / raw) To: Arthur Miller; +Cc: emacs-devel Arthur Miller <arthur.miller@live.com> writes: >> In which cases will this make a difference when displaying the *Help* >> buffer for the symbol? > > In case where the symbol is not loaded, and there is no doc entry in autoload > object. Oh, right --- I was thinking about ;;;###autoload, where the doc string is available always, not (autoload 'foo "foo") Yes, in those cases it would indeed be helpful if the help machinery just went ahead and loaded the library. However, there are some instances where loading a library has unexpected side effects, like enabling new modes and keymaps. Doing so is frowned upon (loading a library shouldn't do those things), but it happens. If this is a concern, then we could perhaps add a button to *Help* to do the loading instead of loading automatically? But perhaps just loading the file automatically would be fine anyway -- it's a bug for libraries to side-effect to an annoying degree upon load. -- (domestic pets only, the antidote for overdose, milk.) bloggy blog: http://lars.ingebrigtsen.no ^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: Patch: perform autoloading when docs is missing from autoload object 2021-09-17 14:01 ` Lars Ingebrigtsen @ 2021-09-17 15:04 ` Arthur Miller 2021-09-18 13:21 ` Lars Ingebrigtsen 0 siblings, 1 reply; 23+ messages in thread From: Arthur Miller @ 2021-09-17 15:04 UTC (permalink / raw) To: Lars Ingebrigtsen; +Cc: emacs-devel Lars Ingebrigtsen <larsi@gnus.org> writes: > Arthur Miller <arthur.miller@live.com> writes: > >>> In which cases will this make a difference when displaying the *Help* >>> buffer for the symbol? >> >> In case where the symbol is not loaded, and there is no doc entry in autoload >> object. > > Oh, right --- I was thinking about ;;;###autoload, where the doc string > is available always, not > > (autoload 'foo "foo") > > Yes, in those cases it would indeed be helpful if the help machinery > just went ahead and loaded the library. However, there are some > instances where loading a library has unexpected side effects, like > enabling new modes and keymaps. Doing so is frowned upon (loading a > library shouldn't do those things), but it happens. > > If this is a concern, then we could perhaps add a button to *Help* to do > the loading instead of loading automatically? It would be one option. The other one would be to warn about possible unwanting side-effects in docs. I wanted to later switch to just fetch the docs instead of performing load. Loading docs can be done without evaluating the code. It might be a better solution anyway? By the way, I had thoughts about loading the library vs just docs. I reason, that, if I look at some symbol docs via describe-* functions, I am probably already using that library/package, or am about to use it, so it probably is going to be loaded anyway. At least in many cases, not always of course. > But perhaps just loading the file automatically would be fine anyway -- > it's a bug for libraries to side-effect to an annoying degree upon load. Helpful does it and a lot of people seems to be happy with it, but it does not mean it is the correct thing to do, just often acceptable, or overlooked. Built-in help does it too in some cases too, I think just for keymaps, I am not sure there. ^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: Patch: perform autoloading when docs is missing from autoload object 2021-09-17 15:04 ` Arthur Miller @ 2021-09-18 13:21 ` Lars Ingebrigtsen 2021-09-18 16:03 ` [External] : " Drew Adams 2021-09-18 17:31 ` Arthur Miller 0 siblings, 2 replies; 23+ messages in thread From: Lars Ingebrigtsen @ 2021-09-18 13:21 UTC (permalink / raw) To: Arthur Miller; +Cc: emacs-devel Arthur Miller <arthur.miller@live.com> writes: > I wanted to later switch to just fetch the docs instead of performing > load. Loading docs can be done without evaluating the code. It might be a > better solution anyway? If that's possible, that would be preferable, but as you say: > By the way, I had thoughts about loading the library vs just docs. I reason, > that, if I look at some symbol docs via describe-* functions, I am > probably already using that library/package, or am about to use it, so it > probably is going to be loaded anyway. At least in many cases, not always of > course. It is quite likely that you want to use the library if you've looked up the symbol in a *Help* buffer, so why not, indeed, just load it at that point? If loading the library also helps with some other things -- highlighting `package-symbol's correctly in the doc string, for instance. So I think I'd be fine with adding the proposed functionality. If there are people that don't want this, we can add a user option to switch it off. -- (domestic pets only, the antidote for overdose, milk.) bloggy blog: http://lars.ingebrigtsen.no ^ permalink raw reply [flat|nested] 23+ messages in thread
* RE: [External] : Re: Patch: perform autoloading when docs is missing from autoload object 2021-09-18 13:21 ` Lars Ingebrigtsen @ 2021-09-18 16:03 ` Drew Adams 2021-09-18 17:34 ` Arthur Miller 2021-09-18 17:31 ` Arthur Miller 1 sibling, 1 reply; 23+ messages in thread From: Drew Adams @ 2021-09-18 16:03 UTC (permalink / raw) To: Lars Ingebrigtsen, Arthur Miller; +Cc: emacs-devel@gnu.org > It is quite likely that you want to use the > library if you've looked up the symbol in a > *Help* buffer, so why not, indeed, just load > it at that point? It's also quite likely - even more likely IMO - that you do NOT want to use (load) the library - you just wanted to check the doc of something in it. "Just load it" isn't right. Let _users_ load it when they want to. That's trivial to do. If you added an option that does such eager loading, that would be one thing. But to "just load" unconditionally would be very wrong, IMHO. > So I think I'd be fine with adding the proposed > functionality. If there are people that don't > want this, we can add a user option to switch it off. That's wrong. Add an option to switch it on, if you want to provide such an optional behavior. ^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [External] : Re: Patch: perform autoloading when docs is missing from autoload object 2021-09-18 16:03 ` [External] : " Drew Adams @ 2021-09-18 17:34 ` Arthur Miller 0 siblings, 0 replies; 23+ messages in thread From: Arthur Miller @ 2021-09-18 17:34 UTC (permalink / raw) To: Drew Adams; +Cc: Lars Ingebrigtsen, emacs-devel@gnu.org Drew Adams <drew.adams@oracle.com> writes: >> It is quite likely that you want to use the >> library if you've looked up the symbol in a >> *Help* buffer, so why not, indeed, just load >> it at that point? > > It's also quite likely - even more likely IMO > - that you do NOT want to use (load) the > library - you just wanted to check the doc of > something in it. > > "Just load it" isn't right. Let _users_ load > it when they want to. That's trivial to do. > > If you added an option that does such eager > loading, that would be one thing. But to > "just load" unconditionally would be very > wrong, IMHO. > >> So I think I'd be fine with adding the proposed >> functionality. If there are people that don't >> want this, we can add a user option to switch it off. > > That's wrong. Add an option to switch it > on, if you want to provide such an optional > behavior. :) Yes I agree with you. That option is in the patch already, and the default is 'nil'. Haven't you looked at it? Everything is "as-before" until user actively toggles that option on: (defcustom help-enable-symbol-autoload nil "Perform autoload when documentation is not present in autoload object." :type 'boolean :group 'help :version "28.1") ^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: Patch: perform autoloading when docs is missing from autoload object 2021-09-18 13:21 ` Lars Ingebrigtsen 2021-09-18 16:03 ` [External] : " Drew Adams @ 2021-09-18 17:31 ` Arthur Miller 2021-09-18 17:53 ` Lars Ingebrigtsen 1 sibling, 1 reply; 23+ messages in thread From: Arthur Miller @ 2021-09-18 17:31 UTC (permalink / raw) To: Lars Ingebrigtsen; +Cc: emacs-devel Lars Ingebrigtsen <larsi@gnus.org> writes: > Arthur Miller <arthur.miller@live.com> writes: > >> I wanted to later switch to just fetch the docs instead of performing >> load. Loading docs can be done without evaluating the code. It might be a >> better solution anyway? > > If that's possible, that would be preferable, but as you say: > >> By the way, I had thoughts about loading the library vs just docs. I reason, >> that, if I look at some symbol docs via describe-* functions, I am >> probably already using that library/package, or am about to use it, so it >> probably is going to be loaded anyway. At least in many cases, not always of >> course. > > It is quite likely that you want to use the library if you've looked up > the symbol in a *Help* buffer, so why not, indeed, just load it at that > point? If loading the library also helps with some other things -- > highlighting `package-symbol's correctly in the doc string, for > instance. > > So I think I'd be fine with adding the proposed functionality. If there > are people that don't want this, we can add a user option to switch it off. It is already an opt-in option. (defcustom help-enable-symbol-autoload nil "Perform autoload when documentation is not present in autoload object." :type 'boolean :group 'help :version "28.1") There is a defcustom variable that controls this, and it is nil by default, so this is off unless user actively put it on. It would be nice if it is in. Thank you. ^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: Patch: perform autoloading when docs is missing from autoload object 2021-09-18 17:31 ` Arthur Miller @ 2021-09-18 17:53 ` Lars Ingebrigtsen 2021-09-18 18:38 ` Arthur Miller 0 siblings, 1 reply; 23+ messages in thread From: Lars Ingebrigtsen @ 2021-09-18 17:53 UTC (permalink / raw) To: Arthur Miller; +Cc: emacs-devel Arthur Miller <arthur.miller@live.com> writes: > It is already an opt-in option. > > (defcustom help-enable-symbol-autoload nil > "Perform autoload when documentation is not present in autoload object." > :type 'boolean > :group 'help > :version "28.1") I guess I should have read the patch. :-) I've now pushed it to Emacs 28 (with some changes). It's really too late in the Emacs 28 cycle to add new features, but since it defaults to nil, I think it should be OK. It'll default to t in Emacs 29. -- (domestic pets only, the antidote for overdose, milk.) bloggy blog: http://lars.ingebrigtsen.no ^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: Patch: perform autoloading when docs is missing from autoload object 2021-09-18 17:53 ` Lars Ingebrigtsen @ 2021-09-18 18:38 ` Arthur Miller 0 siblings, 0 replies; 23+ messages in thread From: Arthur Miller @ 2021-09-18 18:38 UTC (permalink / raw) To: Lars Ingebrigtsen; +Cc: emacs-devel Lars Ingebrigtsen <larsi@gnus.org> writes: > Arthur Miller <arthur.miller@live.com> writes: > >> It is already an opt-in option. >> >> (defcustom help-enable-symbol-autoload nil >> "Perform autoload when documentation is not present in autoload object." >> :type 'boolean >> :group 'help >> :version "28.1") > > I guess I should have read the patch. :-) I've now pushed it to Emacs > 28 (with some changes). > > It's really too late in the Emacs 28 cycle to add new features, but > since it defaults to nil, I think it should be OK. It'll default to t > in Emacs 29. Thanks for accepting it! ^ permalink raw reply [flat|nested] 23+ messages in thread
end of thread, other threads:[~2021-09-22 16:18 UTC | newest] Thread overview: 23+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2021-09-15 13:51 Patch: perform autoloading when docs is missing from autoload object Arthur Miller 2021-09-15 18:14 ` Stefan Monnier 2021-09-15 22:29 ` Arthur Miller 2021-09-17 16:38 ` Stefan Monnier 2021-09-17 16:56 ` Generic autoloading? [Was Patch: perform autoloading when docs is missing from autoload object] Qiantan Hong 2021-09-17 19:36 ` Stefan Monnier 2021-09-17 19:51 ` Qiantan Hong 2021-09-17 21:25 ` Arthur Miller 2021-09-17 21:09 ` Patch: perform autoloading when docs is missing from autoload object Arthur Miller 2021-09-18 13:37 ` Stefan Monnier 2021-09-18 18:25 ` Arthur Miller 2021-09-20 17:02 ` Stefan Monnier 2021-09-22 16:18 ` Arthur Miller 2021-09-16 12:51 ` Lars Ingebrigtsen 2021-09-17 6:49 ` Arthur Miller 2021-09-17 14:01 ` Lars Ingebrigtsen 2021-09-17 15:04 ` Arthur Miller 2021-09-18 13:21 ` Lars Ingebrigtsen 2021-09-18 16:03 ` [External] : " Drew Adams 2021-09-18 17:34 ` Arthur Miller 2021-09-18 17:31 ` Arthur Miller 2021-09-18 17:53 ` Lars Ingebrigtsen 2021-09-18 18:38 ` Arthur Miller
Code repositories for project(s) associated with this public inbox https://git.savannah.gnu.org/cgit/emacs.git This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).