branch: externals/org-modern commit 1a1c9785c6ed4bd0f222254f10641eb25d5ef0b4 Author: JD Smith <93749+jdtsm...@users.noreply.github.com> Commit: JD Smith <93749+jdtsm...@users.noreply.github.com>
draw-block: simplify property modification + add indent field Some renaming and use of `cl-macrolet'. The field is used to allow more convenient editing for indented blocks. E.g C-a moves back and M-\ deletes back to the field (guide bar). We use `pos-bol' for block navigation, since it ignores fields. --- org-modern-indent.el | 80 ++++++++++++++++++++++++++-------------------------- 1 file changed, 40 insertions(+), 40 deletions(-) diff --git a/org-modern-indent.el b/org-modern-indent.el index a1a6f7b11d..35de70d218 100644 --- a/org-modern-indent.el +++ b/org-modern-indent.el @@ -57,7 +57,7 @@ ;;;; Utility (defsubst omi/-lbp (p &optional n) "Return the line beginning position N at point P." - (save-excursion (goto-char p) (line-beginning-position n))) + (save-excursion (goto-char p) (pos-bol n))) ;;;; Block prefix cache (defvar omi/-prefixes (make-hash-table :test #'equal) @@ -149,50 +149,50 @@ partially overlaps the region." (setq finished t))))))) ;;;; Drawing block brackets -(defun omi/-draw-block (beg end beg0 end0 org-indent real-block-indent) +(defun omi/-draw-block (beg end beg0 end0 org-indent real-indent) "Insert brackets for block between BEG and END. BEG0 and END0 represents the block's full range, corresponding to the line beginning/end positions of the block's #+BEGIN/END header/footer lines. The `org-indent' prefix length at block header is ORG-INDENT, -and REAL-BLOCK-INDENT is the amount of \"real\" (hard space) block -indentation. REAL-BLOCK-INDENT may be zero." +and REAL-INDENT is the amount of \"real\" (hard space) block +indentation. REAL-INDENT may be zero." (with-silent-modifications - (pcase-let* - (((seq beg-str guide-str end-str) - (omi/-prefix org-indent real-block-indent)) - ((seq beg-ind-str guide-ind-str end-ind-str) - (and (> real-block-indent 0) (omi/-prefix real-block-indent 0))) - (beg-bol (omi/-lbp beg)) - (body-start (max (omi/-lbp beg0 2) beg-bol)) - (lp-begin (and (= real-block-indent 0) `(line-prefix ,beg-str))) - (lp-guide (and (= real-block-indent 0) `(line-prefix ,guide-str)))) - (when (> body-start beg) ;; BEGIN - (add-text-properties beg-bol body-start - `(,@lp-begin wrap-prefix ,guide-str)) - (when (> real-block-indent 0) - (put-text-property beg-bol (+ beg-bol real-block-indent) - 'omi/display beg-ind-str))) - (when (> end body-start) - (let* ((end-bol (omi/-lbp end)) - (end0-bol (omi/-lbp end0)) - (after-end (omi/-lbp end 2)) - (body-final (if (= end-bol end0-bol) end-bol after-end))) - (add-text-properties body-start body-final ;; GUIDE BODY - `(,@lp-guide wrap-prefix ,guide-str)) - (when (> real-block-indent 0) - (goto-char body-start) - (while (< (point) body-final) - (when (>= (current-indentation) real-block-indent) - (put-text-property (point) (+ (point) real-block-indent) - 'omi/display guide-ind-str)) - (forward-line))) - (when (= end-bol end0-bol) ;; END - (if (= real-block-indent 0) - (put-text-property end-bol after-end 'line-prefix end-str) - (goto-char end-bol) - (when (>= (current-indentation) real-block-indent) - (put-text-property end-bol (+ end-bol real-block-indent) - 'omi/display end-ind-str))))))))) + (pcase-let* (((seq beg-prefix guide-prefix end-prefix) + (omi/-prefix org-indent real-indent)) + ((seq beg-display guide-display end-display) + (and (> real-indent 0) (omi/-prefix real-indent 0))) + (beg-bol (omi/-lbp beg)) + (body-start (max (omi/-lbp beg0 2) beg-bol))) + (cl-macrolet ((add-prefixes (pbeg pend line-prefix wrap-prefix) + `(add-text-properties ,pbeg ,pend + `(,@(and (= real-indent 0) `(line-prefix ,,line-prefix)) + wrap-prefix ,,wrap-prefix))) + (add-guides (pbeg pend display-str) + `(add-text-properties ,pbeg ,pend + `( omi/display ,,display-str field org-modern-indent + rear-nonsticky t)))) + (when (> body-start beg) ;; BEGIN + (add-prefixes beg-bol body-start beg-prefix guide-prefix) + (when (> real-indent 0) + (add-guides beg-bol (+ beg-bol real-indent) beg-display))) + (when (> end body-start) ;; GUIDE BODY + (let* ((end-bol (omi/-lbp end)) + (end0-bol (omi/-lbp end0)) + (after-end (omi/-lbp end 2)) + (body-final (if (= end-bol end0-bol) end-bol after-end))) + (add-prefixes body-start body-final guide-prefix guide-prefix) + (when (> real-indent 0) + (goto-char body-start) + (while (< (point) body-final) + (when (>= (current-indentation) real-indent) + (add-guides (point) (+ (point) real-indent) guide-display)) + (forward-line))) + (when (= end-bol end0-bol) ;; END + (if (= real-indent 0) + (add-prefixes end-bol after-end end-prefix end-prefix) + (goto-char end-bol) + (when (>= (current-indentation) real-indent) + (add-guides end-bol (+ end-bol real-indent) end-display)))))))))) ;;;; org-indent interfacing (defvar-local omi/-level-change-end nil)