Re: [QUESTION] Re: [PATCH] make org-attach-url download function as an option
> Indeed, as long as org-attach introduced new async actions. Those hooks will > have problem if they requires files is downloading finished. Also > `make-thread' > does not have process sentinel. That's also an problem. > > Does anyone have better idea? You can wrap the call to org-attach-url-function into with-mutex and run hooks in another thread ustilising the same mutex. Note that the heading contents (including :DIR: property), point, current buffer, and window might be changed at the time the hook thread will be called. You will need to perform some sanity checks and potentially cleanup after org-attach-url-function if the heading was modified in some undesired way. The above assumes that org-attach-url-function returns after the file is attached. This might not be the case if org-attach-url-function calls async shell command. This should be either documented or also handled in some way. Best, Ihor stardiviner writes: > Ihor Radchenko writes: > >> I do not know an answer to your question, but would like to point out >> that make-thread will return immidietealy and all the following code >> will run before the download finishes: >> >> (run-hook-with-args 'org-attach-after-change-hook attach-dir) >> (org-attach-tag) >> (cond ((eq org-attach-store-link-p 'attached)... >> >> At least the hooks and org-attach-tag would expect that the file is >> attached already. > > Indeed, as long as org-attach introduced new async actions. Those hooks will > have problem if they requires files is downloading finished. Also > `make-thread' > does not have process sentinel. That's also an problem. > > Does anyone have better idea? > >> >> Best, >> Ihor >> >> stardiviner writes: >> >>> I got solution for async org-attach-url now. Use `make-thread` for async >>> downloading is simple. >>> >>> Here is the code prototype, but it has a problem, seems `apply` part code >>> does >>> not really downloading file. I don't know why. Does anybody knows the >>> reason? >>> >>> #+begin_src diff >>> modified lisp/org-attach.el >>> @@ -110,6 +110,12 @@ (defcustom org-attach-method 'cp >>> (const :tag "Hard Link" ln) >>> (const :tag "Symbol Link" lns))) >>> >>> +(defcustom org-attach-url-function 'url-copy-file >>> + "The download file function to use in org-attach-url." >>> + :type '(choice (const 'url-copy-file)) >>> + :safe #'functionp >>> + :group 'org-attach) >>> + >>> (defcustom org-attach-expert nil >>>"Non-nil means do not show the splash buffer with the attach dispatcher." >>>:group 'org-attach >>> @@ -503,7 +509,12 @@ (defun org-attach-attach (file visit-dir >>> method) >>> ((eq method 'cp) (copy-file file attach-file)) >>> ((eq method 'ln) (add-name-to-file file attach-file)) >>> ((eq method 'lns) (make-symbolic-link file attach-file)) >>> - ((eq method 'url) (url-copy-file file attach-file))) >>> + ((eq method 'url) (make-thread >>> + (lambda () >>> + ;; (url-copy-file file attach-file) >>> + ;; FIXME This seems does not really download file. >>> Don't know why. >>> + (apply org-attach-url-function '(file attach-file))) >>> + "org-attach-url downloading"))) >>>(run-hook-with-args 'org-attach-after-change-hook attach-dir) >>>(org-attach-tag) >>>(cond ((eq org-attach-store-link-p 'attached) >>> #+end_src >>> >>> Bastien writes: >>> Hi, stardiviner writes: > I found when network is bad and slow, or the download file is big, the > org-attach-url will suspend Emacs for a long time. User might have to > cancel > downloading, and start again later. Indeed, this might be annoying. At the same time, it is not unreasonable to expect the user to know what size is the contents he is willing to attach to an Org node. > I hope to make "org-attach-url" download file asynchronously. But function > org-attach-attach hardcoded this function for 'url method. Here is a > patch to > make it into an option. (FWIW, I could not find the patch.) I think you are on the right track when trying to enhance the 'url package. Maybe url-copy-file should be asynchronous and url could provide url-copy-file-synchronously (to mimic the url-retrieve and url-retrieve-synchronously pair)? Until Emacs has a function to copy a URL's contents asynchronously, I'd rather not add this functionality in Org. >>> >>> >>> -- >>> [ stardiviner ] >>>I try to make every word tell the meaning that I want to express. >>> >>>Blog: https://stardiviner.github.io/ >>>IRC(freenode): stardiviner, Matrix: stardiviner >>>GPG: F09F650D7D674819892591401B5DF1C95AE89AC3 >>> > > > -- > [ stardiviner ] >I try to make every word tell the meaning that I want to express. > >Blog:
Re: [QUESTION] Re: [PATCH] make org-attach-url download function as an option
Ihor Radchenko writes: > I do not know an answer to your question, but would like to point out > that make-thread will return immidietealy and all the following code > will run before the download finishes: > > (run-hook-with-args 'org-attach-after-change-hook attach-dir) > (org-attach-tag) > (cond ((eq org-attach-store-link-p 'attached)... > > At least the hooks and org-attach-tag would expect that the file is > attached already. Indeed, as long as org-attach introduced new async actions. Those hooks will have problem if they requires files is downloading finished. Also `make-thread' does not have process sentinel. That's also an problem. Does anyone have better idea? > > Best, > Ihor > > stardiviner writes: > >> I got solution for async org-attach-url now. Use `make-thread` for async >> downloading is simple. >> >> Here is the code prototype, but it has a problem, seems `apply` part code >> does >> not really downloading file. I don't know why. Does anybody knows the reason? >> >> #+begin_src diff >> modified lisp/org-attach.el >> @@ -110,6 +110,12 @@ (defcustom org-attach-method 'cp >>(const :tag "Hard Link" ln) >>(const :tag "Symbol Link" lns))) >> >> +(defcustom org-attach-url-function 'url-copy-file >> + "The download file function to use in org-attach-url." >> + :type '(choice (const 'url-copy-file)) >> + :safe #'functionp >> + :group 'org-attach) >> + >> (defcustom org-attach-expert nil >>"Non-nil means do not show the splash buffer with the attach dispatcher." >>:group 'org-attach >> @@ -503,7 +509,12 @@ (defun org-attach-attach (file visit-dir >> method) >> ((eq method 'cp) (copy-file file attach-file)) >> ((eq method 'ln) (add-name-to-file file attach-file)) >> ((eq method 'lns) (make-symbolic-link file attach-file)) >> - ((eq method 'url) (url-copy-file file attach-file))) >> + ((eq method 'url) (make-thread >> + (lambda () >> +;; (url-copy-file file attach-file) >> +;; FIXME This seems does not really download file. >> Don't know why. >> +(apply org-attach-url-function '(file attach-file))) >> + "org-attach-url downloading"))) >>(run-hook-with-args 'org-attach-after-change-hook attach-dir) >>(org-attach-tag) >>(cond ((eq org-attach-store-link-p 'attached) >> #+end_src >> >> Bastien writes: >> >>> Hi, >>> >>> stardiviner writes: >>> I found when network is bad and slow, or the download file is big, the org-attach-url will suspend Emacs for a long time. User might have to cancel downloading, and start again later. >>> >>> Indeed, this might be annoying. At the same time, it is not >>> unreasonable to expect the user to know what size is the contents he >>> is willing to attach to an Org node. >>> I hope to make "org-attach-url" download file asynchronously. But function org-attach-attach hardcoded this function for 'url method. Here is a patch to make it into an option. >>> >>> (FWIW, I could not find the patch.) >>> >>> I think you are on the right track when trying to enhance the 'url >>> package. Maybe url-copy-file should be asynchronous and url could >>> provide url-copy-file-synchronously (to mimic the url-retrieve and >>> url-retrieve-synchronously pair)? >>> >>> Until Emacs has a function to copy a URL's contents asynchronously, >>> I'd rather not add this functionality in Org. >> >> >> -- >> [ stardiviner ] >>I try to make every word tell the meaning that I want to express. >> >>Blog: https://stardiviner.github.io/ >>IRC(freenode): stardiviner, Matrix: stardiviner >>GPG: F09F650D7D674819892591401B5DF1C95AE89AC3 >> -- [ stardiviner ] I try to make every word tell the meaning that I want to express. Blog: https://stardiviner.github.io/ IRC(freenode): stardiviner, Matrix: stardiviner GPG: F09F650D7D674819892591401B5DF1C95AE89AC3
Re: [QUESTION] Re: [PATCH] make org-attach-url download function as an option
I do not know an answer to your question, but would like to point out that make-thread will return immidietealy and all the following code will run before the download finishes: (run-hook-with-args 'org-attach-after-change-hook attach-dir) (org-attach-tag) (cond ((eq org-attach-store-link-p 'attached)... At least the hooks and org-attach-tag would expect that the file is attached already. Best, Ihor stardiviner writes: > I got solution for async org-attach-url now. Use `make-thread` for async > downloading is simple. > > Here is the code prototype, but it has a problem, seems `apply` part code does > not really downloading file. I don't know why. Does anybody knows the reason? > > #+begin_src diff > modified lisp/org-attach.el > @@ -110,6 +110,12 @@ (defcustom org-attach-method 'cp > (const :tag "Hard Link" ln) > (const :tag "Symbol Link" lns))) > > +(defcustom org-attach-url-function 'url-copy-file > + "The download file function to use in org-attach-url." > + :type '(choice (const 'url-copy-file)) > + :safe #'functionp > + :group 'org-attach) > + > (defcustom org-attach-expert nil >"Non-nil means do not show the splash buffer with the attach dispatcher." >:group 'org-attach > @@ -503,7 +509,12 @@ (defun org-attach-attach (file visit-dir > method) > ((eq method 'cp) (copy-file file attach-file)) > ((eq method 'ln) (add-name-to-file file attach-file)) > ((eq method 'lns) (make-symbolic-link file attach-file)) > - ((eq method 'url) (url-copy-file file attach-file))) > + ((eq method 'url) (make-thread > + (lambda () > + ;; (url-copy-file file attach-file) > + ;; FIXME This seems does not really download file. > Don't know why. > + (apply org-attach-url-function '(file attach-file))) > + "org-attach-url downloading"))) >(run-hook-with-args 'org-attach-after-change-hook attach-dir) >(org-attach-tag) >(cond ((eq org-attach-store-link-p 'attached) > #+end_src > > Bastien writes: > >> Hi, >> >> stardiviner writes: >> >>> I found when network is bad and slow, or the download file is big, the >>> org-attach-url will suspend Emacs for a long time. User might have to cancel >>> downloading, and start again later. >> >> Indeed, this might be annoying. At the same time, it is not >> unreasonable to expect the user to know what size is the contents he >> is willing to attach to an Org node. >> >>> I hope to make "org-attach-url" download file asynchronously. But function >>> org-attach-attach hardcoded this function for 'url method. Here is a patch >>> to >>> make it into an option. >> >> (FWIW, I could not find the patch.) >> >> I think you are on the right track when trying to enhance the 'url >> package. Maybe url-copy-file should be asynchronous and url could >> provide url-copy-file-synchronously (to mimic the url-retrieve and >> url-retrieve-synchronously pair)? >> >> Until Emacs has a function to copy a URL's contents asynchronously, >> I'd rather not add this functionality in Org. > > > -- > [ stardiviner ] >I try to make every word tell the meaning that I want to express. > >Blog: https://stardiviner.github.io/ >IRC(freenode): stardiviner, Matrix: stardiviner >GPG: F09F650D7D674819892591401B5DF1C95AE89AC3 > -- Ihor Radchenko, PhD, Center for Advancing Materials Performance from the Nanoscale (CAMP-nano) State Key Laboratory for Mechanical Behavior of Materials, Xi'an Jiaotong University, Xi'an, China Email: yanta...@gmail.com, ihor_radche...@alumni.sutd.edu.sg
[QUESTION] Re: [PATCH] make org-attach-url download function as an option
I got solution for async org-attach-url now. Use `make-thread` for async downloading is simple. Here is the code prototype, but it has a problem, seems `apply` part code does not really downloading file. I don't know why. Does anybody knows the reason? #+begin_src diff modified lisp/org-attach.el @@ -110,6 +110,12 @@ (defcustom org-attach-method 'cp (const :tag "Hard Link" ln) (const :tag "Symbol Link" lns))) +(defcustom org-attach-url-function 'url-copy-file + "The download file function to use in org-attach-url." + :type '(choice (const 'url-copy-file)) + :safe #'functionp + :group 'org-attach) + (defcustom org-attach-expert nil "Non-nil means do not show the splash buffer with the attach dispatcher." :group 'org-attach @@ -503,7 +509,12 @@ (defun org-attach-attach (file visit-dir method) ((eq method 'cp) (copy-file file attach-file)) ((eq method 'ln) (add-name-to-file file attach-file)) ((eq method 'lns) (make-symbolic-link file attach-file)) - ((eq method 'url) (url-copy-file file attach-file))) + ((eq method 'url) (make-thread + (lambda () + ;; (url-copy-file file attach-file) + ;; FIXME This seems does not really download file. Don't know why. + (apply org-attach-url-function '(file attach-file))) + "org-attach-url downloading"))) (run-hook-with-args 'org-attach-after-change-hook attach-dir) (org-attach-tag) (cond ((eq org-attach-store-link-p 'attached) #+end_src Bastien writes: > Hi, > > stardiviner writes: > >> I found when network is bad and slow, or the download file is big, the >> org-attach-url will suspend Emacs for a long time. User might have to cancel >> downloading, and start again later. > > Indeed, this might be annoying. At the same time, it is not > unreasonable to expect the user to know what size is the contents he > is willing to attach to an Org node. > >> I hope to make "org-attach-url" download file asynchronously. But function >> org-attach-attach hardcoded this function for 'url method. Here is a patch to >> make it into an option. > > (FWIW, I could not find the patch.) > > I think you are on the right track when trying to enhance the 'url > package. Maybe url-copy-file should be asynchronous and url could > provide url-copy-file-synchronously (to mimic the url-retrieve and > url-retrieve-synchronously pair)? > > Until Emacs has a function to copy a URL's contents asynchronously, > I'd rather not add this functionality in Org. -- [ stardiviner ] I try to make every word tell the meaning that I want to express. Blog: https://stardiviner.github.io/ IRC(freenode): stardiviner, Matrix: stardiviner GPG: F09F650D7D674819892591401B5DF1C95AE89AC3