emacs-orgmode@gnu.org archives
 help / color / mirror / code / Atom feed
From: John Kitchin <jkitchin@andrew.cmu.edu>
To: Nicolas Goaziou <mail@nicolasgoaziou.fr>
Cc: "Somelauw ." <somelauw@gmail.com>,
	"emacs-orgmode@gnu.org" <emacs-orgmode@gnu.org>
Subject: Re: Expose value-begin and value-end instead of just value in org-element API
Date: Sun, 25 Feb 2018 19:43:26 -0800	[thread overview]
Message-ID: <m28tbgju01.fsf@andrew.cmu.edu> (raw)
In-Reply-To: <87k1v6k2wt.fsf@nicolasgoaziou.fr>


Nicolas Goaziou writes:

> Hello,
>
> John Kitchin <jkitchin@andrew.cmu.edu> writes:
>
>> +1 on this.
>>
>> I also have some janky code to do things like go to the beginning/end of
>> the value in a src block. Here is my solution to mark the code in a src
>> block.
>>
>> (defun ob-ipython-mark-code ()
>>   "Mark the code in the block."
>>   (interactive)
>>   (org-edit-special)
>>   (let ((p0 (point-min))
>> (p1 (point-max)))
>>     (goto-char p0)
>>     (org-edit-src-exit)
>>     (set-mark (point))
>>     (goto-char (+ (point) (- p1 2)))))
>
> You get the beginning of the code of a source block with
>
>   (org-with-point-at (org-element-property :post-affiliated element)
>     (line-beginning-position 2))
>
> and its end with
>
>   (org-with-point-at (org-element-property :end element)
>     (line-beginning-position (- (org-element-property :post-blank element))))
>

Wow. I would not have guessed either one of these! Thanks for sharing
them. Is that documented somewhere? I gather that given something like

#+header: :var a=5
#+name: test
#+BEGIN_SRC ipython

print(a)

#+END_SRC

which parses like (from org-element-context):

(src-block
 (:language "ipython" :switches nil :parameters nil :begin 362 :end 436 :number-lines nil :preserve-indent nil :retain-labels t :use-labels t :label-fmt nil :value "\nprint(a)\n\n" :post-blank 1 :post-affiliated 394 :header
	    (":var a=5")
	    :name "test" :parent nil))

In this:

:begin refers to the point at the beginning of the #+header line.

whereas

:post-affiliated is the point after all the "affiliated" header/name lines, i.e. the
beginning of #+BEGIN_SRC.

:end refers to the point where the end of the element is, which may
include blank lines.

:post-blank is the number of blank lines (including lines that are just
spaces) after the element.

is that the right interpretation?

For elements with a :contents-begin where does :post-affiliated come in?


> From there, you can easily construct something that doesn't rely on
> `org-edit-special'.
>
>>> I think it would be preferable to also expose the value by beginning and
>>> ending buffer positions for the following reasons:
>>> - Consistency with elements that expose contents-begin and contents-end.
>
> The point is terminal elements are not consistent with non-terminal
> ones, and should not be.
>
>>> - More powerful. In my evil-org plugin I want to be able to mark the value
>>> property of the org element at point (so the user can do stuff like easily
>>> copy the code of the current code block), but to do so I need the beginning
>>> and ending position in the buffer of "value". The org-element API does
>>> currently not provide clean way to retrieve these positions.
>
> See above. It is quite simple to extract this information from the parse
> tree.

Once you get the idea, maybe, but this approach seems specific to
src-blocks (maybe any block) where there are delimiting lines. It
doesn't work on all elements (which to be fair was not claimed). I think
the OP was interested in something more consistent, which I am
sympathetic to.

Some things aren't clear to me what should happen though, especially in
composite elements like tables and plain lists. E.g. To just select a
table without the affiliated lines, one can use :contents-begin and
:contents-end, once you get the table element (e.g. by walking up the
:parent chain if you are in a cell or row).

In the absence of a single way, maybe there could be a small number of
ways to do this? How many cases do you think there are?

- blocks (which have :value)
- composite elements (which have :contents-begin/end and/or non-nil :parents)
- regular elements (which have :contents-begin/end)

Are there any others?

>
>>> - It's usually more efficient to return the beginning and ending positions
>>> than to retrieve the substring that contains the value, which may require a
>>> large buffer partition to be copied.
>
> Efficiency is a moot point because you still need to store the value of
> the block. If you remove it, the parse tree is no longer an equivalent
> representation of the document.

I can see this argument, but I am still unclear on which elements need a
value, and which don't. For example, src-blocks have a value, but a
paragraph doesn't, nor do items in a plain list, at least from
(org-element-context).

I guess my confusion comes from these being different than what comes
out of (org-element-parse-buffer).

>
> Regards,


--
Professor John Kitchin
Doherty Hall A207F
Department of Chemical Engineering
Carnegie Mellon University
Pittsburgh, PA 15213
412-268-7803
@johnkitchin
http://kitchingroup.cheme.cmu.edu

  parent reply	other threads:[~2018-02-26  3:43 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-02-19 23:29 Expose value-begin and value-end instead of just value in org-element API Somelauw .
2018-02-20 19:59 ` John Kitchin
2018-02-21 11:17   ` Nicolas Goaziou
2018-02-21 21:13     ` Somelauw .
2018-02-26  3:43     ` John Kitchin [this message]
2018-02-26 10:05       ` Nicolas Goaziou

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://www.orgmode.org/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=m28tbgju01.fsf@andrew.cmu.edu \
    --to=jkitchin@andrew.cmu.edu \
    --cc=emacs-orgmode@gnu.org \
    --cc=mail@nicolasgoaziou.fr \
    --cc=somelauw@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs/org-mode.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).