emacs-orgmode
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Pending contents in org documents (Re: Asynchronous blocks for every


From: Ihor Radchenko
Subject: Re: Pending contents in org documents (Re: Asynchronous blocks for everything (was Re: ...))
Date: Fri, 31 May 2024 09:48:28 +0000

Bruno Barbier <brubar.cs@gmail.com> writes:

> ... I'm now using using a fully working example.

Thanks!
I will first reply to you email inline and then common further on your
changes from the branch.

>>> ;;        (org-pending-send-update my-rlock  (list :progress "Not ready 
>>> yet."))
>>> ;;        (org-pending-send-update my-rlock  (list :progress "Coming 
>>> soon."))
>>
>> Should the progress message always be a string?
>
> No.  It may currently be any data.  org-pending will format it as a
> string that fits on one line.

Please say this in the docstring of `org-pending-send-update'.

>>> ;;        (org-pending-send-update my-rlock (list :success 1))
>>
>> What will org-pending do with :success 1? Will it replace region with
>> "1" or will it do something else?
>
> That's the job on ON-OUTCOME to convert/format/append/prepend/replace
> some content if needed, on :success and/or on :failure.

Fair. Although, it feels like a common use case to replace the region
with :success value. Maybe the library should provide some ready-to-use
functions that can be used as the value of :on-outcome.

>> It would be nice to have an example that will also send a signal to
>> process, as it is probably the most commonly used way to utilize
>> org-pending.
>
> For my many use cases, that would always be a mistake to kill the
> process: an OS process is always in charge of many locks.
>
> More importantly, to find a self-contained working readable example
> might be a challenge.
>
> We could add a function 'org-pending-shell-command-on-region' in
> org-pending, that could be used as an implementation example, like
> `org-pending-user-edit', `org-babel-execute-src-block', etc.

Yes, having pre-cooked wrappers for `org-pending' or pre-defined values
for :on-outcome/:befire-kill-function/:user-cancel-function/etc would be useful.

;;     ;; We lock the 'region', defining how to update it when the
;;     ;; outcome is available.
;;     (setq my-lock (org-pending
;;                    region
;;                    :on-outcome
;;                    (lambda (_rl outcome)
;;                      (pcase outcome
;;                        (`(:success ,value)
;;                         ;; On :success, we replace the region with the
;;                         ;; value.
;;                         (let ((tmp-end (cdr region)))
;;                           (goto-char tmp-end)
;;                           (insert (format "%s\n" value))
;;                           (setcdr region (point))
;;                           (delete-region (car region) tmp-end)))
;; ...

This example has a major problem if user edits the buffer text _before_
locked region before the outcome is available.
(car region) and (cdr region) will no longer be accurate, and your code
will replace text in places you do not expect.

I believe that it will be better to query region-lock object about the
region location where we need to replace text:

(setq region (org-pending-reglock-region rl))

Same for reglock buffer in other examples.

Then, we will keep the possibility open for org-pending to handle cases
like killing/yanking text containing reglocks (org-refile) - org-pending
may in future keep track of them.

;;     (setf (org-pending-reglock-user-cancel-function my-lock)
;;           (let ((this-timer my-timer))
;;             (lambda (_rl)
;;               (cancel-timer this-timer)
;; ...

;;     (setf (org-pending-reglock-before-kill-function my-lock)
;;           (let ((this-timer my-timer))
;;             (lambda (_rl)
;;               (message "Killing %s" this-timer)
;;               (cancel-timer this-timer))))

What is the difference between "canceling" and "killing" the reglock?
Do they need to be separate?

-- 
Ihor Radchenko // yantar92,
Org mode contributor,
Learn more about Org mode at <https://orgmode.org/>.
Support Org development at <https://liberapay.com/org-mode>,
or support my work at <https://liberapay.com/yantar92>



reply via email to

[Prev in Thread] Current Thread [Next in Thread]