2017-12-25 23:42 GMT+01:00 Nicolas Goaziou <m...@nicolasgoaziou.fr>: > I suggest the following. > > For contents begin: > > (save-excursion > (goto-char (org-element-property :post-affiliated element)) > (line-beginning-position 2)) > > For contents end: > > (save-excursion > (goto-char (org-element-property :end element)) > (skip-chars-backward " \t\n") > (line-beginning-position)) >
Thanks, your code works as long as the element at point is some kind of block element. I have identified the following block elements: - all elements that end with "-block - latex-export/environment - diary - drawer - export - fixed_width However, I'm trying to write something that works on all elements and I want my code to continue working even if new elements are added to org-mode. It would be ideal if elements had the following additional properties: - :value-begin - :value-end Unfortunately, they don't. I have come to the following hackish solution: #+BEGIN_SRC emacs-lisp (defun org-select-inner-element () "Select inner-element. Return begin and end of inner contents of org-element at point." (let* ((element (org-element-context))) ;; Element has a value (if-let ((value (org-element-property :value element))) ;; Try to return begin and end of :value property (let ((lines (remove "" (split-string value "[\n\r]")))) (list (save-excursion (goto-char (org-element-property :post-affiliated element)) (search-forward (first lines)) (match-beginning 0)) (save-excursion (goto-char (org-element-property :end element)) (search-backward (car (last lines))) (match-end 0)))) ;; Check if element has :contents-begin and contents-end (if (org-element-property :contents-begin element) (list (org-element-property :contents-begin element) (org-element-property :contents-end element)) ;; Otherwise select the whole element (list (org-element-property :begin element) (org-element-property :end element))) ))) #+END_SRC