Hello, Ryan <r...@thompsonclan.org> writes:
> Actually, my implementation has a bug. org-element-at-point also > returns the element if point is actually on one of the blank lines > between that element and the next. So I've rewritten it to handle that > case by computing the content end position and comparing point to > that. Thank you. Here are a few notes about this implementation. > (defun org-in-src-block-p (&optional inside) > "Whether point is in a code source block. > When INSIDE is non-nil, don't consider we are within a src block > when point is at #+BEGIN_SRC or #+END_SRC." > (save-match-data > (let* ((elem (org-element-at-point)) > (elem-type (car elem)) (elem-type (org-element-type elem)) > (props (cadr elem)) > (end (plist-get props :end)) You don't need PROPS. (end (org-element-property :end elem)) > (pb (plist-get props :post-blank)) > (content-end > (save-excursion > (goto-char end) > (forward-line (- pb)) > (point))) Using PB is incorrect. (contend-end (save-excursion (goto-char end) (skip-chars-backward " \r\t\n") (line-beginning-position))) > (case-fold-search t)) > (and > ;; Elem is a src block > (eq elem-type 'src-block) > ;; Make sure point is not on one of the blank lines after the > ;; element. > (< (point) content-end) > ;; If INSIDE is non-nil, then must not be at block delimiter > (not > (and > inside > (save-excursion > (beginning-of-line) > (looking-at ".*#\\+\\(begin\\|end\\)_src")))))))) Test is simply (and (eq elem-type 'src-block) (if inside (and (> (line-beginning-position) (org-element-property :post-affiliated elem)) (< (point) contents-end)) (<= (line-beginning-position) contents-end))) Note that this is not yet possible to re-implement `org-in-src-block-p' with `org-element-at-point' as the former is used for fontification. It would be sub-optimal to use it that way, since you can call once `org-element-at-point' and fontify the element under point accordingly to its type. Regards, -- Nicolas Goaziou