thing-at-point はカーソル位置のいろいろな THING を得る関数です。

THINGはline, url, sexp, symbolなどいろいろ取りますが、
ユーザ側で拡張できます。

date-at-point.el(レビュー) は、dateが取れるように拡張したパッケージです。

コードを読めばとても簡単なので、それを使って org-mode
カーソル位置の要素 org-element を取得できるようにしてみました。

驚くほど簡単です。

(require 'org-element)
(defun org-element-at-point-bounds ()
  (let ((e (org-element-at-point)))
    (cons (org-element-property :begin e) (org-element-property :end e))))
(put 'org-element 'bounds-of-thing-at-point 'org-element-at-point-bounds)

開始位置、終了位置のコンスセルを返す関数を定義し、
bounds-of-thing-at-point に登録するだけです。

以下のorg文書の先頭でテストしてみます。

#+BEGIN_EXAMPLE

H1-1

body1

H1-2

body2
#+END_EXAMPLE

#+BEGIN_SRC emacs-lisp :results silent
(with-temp-buffer
(org-mode)
(save-excursion
(insert "* H1-1
body1

H1-2

body2"))
(thing-at-point 'org-element)
;; => "* H1-1\nbody1\n"
(let ((b (bounds-of-thing-at-point 'org-element)))
b ; => (1 . 14)
(buffer-substring (car b) (cdr b)) ; => "* H1-1\nbody1\n"
))
#+END_SRC

本日もお読みいただき、ありがとうございました。参考になれば嬉しいです。