feat(format): add +format/org-block-in-region
Also updates `+org/reformat-at-point` to call `+format/org-block-in-region` if selection is active. Fix: #7936
This commit is contained in:
parent
378d0b8db6
commit
7543b04e15
4 changed files with 91 additions and 27 deletions
|
@ -135,6 +135,19 @@ Uses `evil-visual-end' if available."
|
||||||
(marker-position evil-visual-end))
|
(marker-position evil-visual-end))
|
||||||
(region-end)))
|
(region-end)))
|
||||||
|
|
||||||
|
;;;###autoload
|
||||||
|
(defun doom-region (&optional as-list)
|
||||||
|
"Return the bounds of the current seelction.
|
||||||
|
|
||||||
|
If AS-LIST is non-nil, returns (BEG END). Otherwise returns a cons cell (BEG .
|
||||||
|
END)."
|
||||||
|
(let* ((active (doom-region-active-p))
|
||||||
|
(beg (if active (doom-region-beginning)))
|
||||||
|
(end (if active (doom-region-end))))
|
||||||
|
(if as-list
|
||||||
|
(list beg end)
|
||||||
|
(cons beg end))))
|
||||||
|
|
||||||
;;;###autoload
|
;;;###autoload
|
||||||
(defun doom-thing-at-point-or-region (&optional thing prompt)
|
(defun doom-thing-at-point-or-region (&optional thing prompt)
|
||||||
"Grab the current selection, THING at point, or xref identifier at point.
|
"Grab the current selection, THING at point, or xref identifier at point.
|
||||||
|
|
|
@ -83,29 +83,4 @@ may not always work. Keep your undo keybind handy!"
|
||||||
#'+format/region
|
#'+format/region
|
||||||
#'+format/buffer)))
|
#'+format/buffer)))
|
||||||
|
|
||||||
;;;###autoload
|
;;; format.el ends here
|
||||||
(defun +format/org-block (&optional point)
|
|
||||||
"Reformat the org src block at POINT with a mode approriate formatter."
|
|
||||||
(interactive (list (point)))
|
|
||||||
(unless (derived-mode-p 'org-mode)
|
|
||||||
(user-error "Not an org-mode buffer!"))
|
|
||||||
(let ((element (org-element-at-point point)))
|
|
||||||
(unless (org-in-src-block-p nil element)
|
|
||||||
(user-error "Not in an org src block"))
|
|
||||||
(cl-destructuring-bind (beg end _) (org-src--contents-area element)
|
|
||||||
(let* ((lang (org-element-property :language element))
|
|
||||||
(mode (org-src-get-lang-mode lang)))
|
|
||||||
(save-excursion
|
|
||||||
(if (provided-mode-derived-p mode 'org-mode)
|
|
||||||
(user-error "Cannot reformat an org-mode or org-derived src block")
|
|
||||||
(let* ((major-mode mode)
|
|
||||||
(after-change-functions
|
|
||||||
;; HACK: Silence excessive and unhelpful warnings about
|
|
||||||
;; 'org-element-at-point being used in non-org-mode
|
|
||||||
;; buffers'.
|
|
||||||
(remq 'org-indent-refresh-maybe after-change-functions))
|
|
||||||
(apheleia-formatter
|
|
||||||
(or (apheleia--get-formatters 'interactive)
|
|
||||||
(apheleia--get-formatters 'prompt)
|
|
||||||
(user-error "No formatter configured for language: %s" lang))))
|
|
||||||
(+format-region beg end))))))))
|
|
||||||
|
|
64
modules/editor/format/autoload/org.el
Normal file
64
modules/editor/format/autoload/org.el
Normal file
|
@ -0,0 +1,64 @@
|
||||||
|
;;; editor/format/autoload/org.el -*- lexical-binding: t; -*-
|
||||||
|
|
||||||
|
;;;###autoload
|
||||||
|
(defun +format/org-block (&optional point)
|
||||||
|
"Reformat the org src block at POINT with a mode appropriate formatter."
|
||||||
|
(interactive (list (point)))
|
||||||
|
(unless (derived-mode-p 'org-mode)
|
||||||
|
(user-error "Not an org-mode buffer!"))
|
||||||
|
(let ((element (org-element-at-point point)))
|
||||||
|
(unless (org-in-src-block-p nil element)
|
||||||
|
(user-error "Not in an org src block"))
|
||||||
|
(cl-destructuring-bind (beg end _) (org-src--contents-area element)
|
||||||
|
(let* ((lang (or (org-element-property :language element)
|
||||||
|
(user-error "Cannot reformat src block without a valid language")))
|
||||||
|
(mode (org-src-get-lang-mode lang)))
|
||||||
|
(save-excursion
|
||||||
|
(if (provided-mode-derived-p mode 'org-mode)
|
||||||
|
(user-error "Cannot reformat an org-mode or org-derived src block")
|
||||||
|
(let* ((major-mode mode)
|
||||||
|
(after-change-functions
|
||||||
|
;; HACK: Silence excessive and unhelpful warnings about
|
||||||
|
;; 'org-element-at-point being used in non-org-mode
|
||||||
|
;; buffers'.
|
||||||
|
(remq 'org-indent-refresh-maybe after-change-functions))
|
||||||
|
(apheleia-formatter
|
||||||
|
(or (apheleia--get-formatters)
|
||||||
|
(user-error "No formatter configured for language: %s" lang))))
|
||||||
|
(+format-region beg end))))))))
|
||||||
|
|
||||||
|
;;;###autoload
|
||||||
|
(defun +format/org-block-in-region (beg end)
|
||||||
|
"Calls `+format/org-block' in each src block between BEG and END (inclusive)."
|
||||||
|
(interactive (doom-region t))
|
||||||
|
(unless (derived-mode-p 'org-mode)
|
||||||
|
(user-error "Not an org-mode buffer!"))
|
||||||
|
(unless (and beg end)
|
||||||
|
(user-error "No active selection"))
|
||||||
|
(let ((n 0))
|
||||||
|
(org-block-map
|
||||||
|
(lambda ()
|
||||||
|
(let ((element (org-element-at-point)))
|
||||||
|
(when (and (org-in-src-block-p nil element)
|
||||||
|
(org-element-property :language element))
|
||||||
|
(with-demoted-errors "+format/org-block: %s"
|
||||||
|
(call-interactively #'+format/org-block))
|
||||||
|
(cl-incf n))))
|
||||||
|
(save-excursion
|
||||||
|
(goto-char beg)
|
||||||
|
(when (org-in-src-block-p)
|
||||||
|
(org-previous-block 1))
|
||||||
|
(point))
|
||||||
|
end)
|
||||||
|
(message "Formatted %d src block(s)" n)))
|
||||||
|
|
||||||
|
;;;###autoload
|
||||||
|
(defun +format/org-block-at-point-or-in-region ()
|
||||||
|
"See `+format/org-block' and `+format/org-block-in-region'."
|
||||||
|
(interactive)
|
||||||
|
(call-interactively
|
||||||
|
(if (doom-region-active-p)
|
||||||
|
#'+format/org-block-in-region
|
||||||
|
#'+format/org-block)))
|
||||||
|
|
||||||
|
;;; org.ell ends here
|
|
@ -344,7 +344,19 @@ If in an org table, realign the cells with `org-table-align'.
|
||||||
Otherwise, falls back to `org-fill-paragraph' to reflow paragraphs."
|
Otherwise, falls back to `org-fill-paragraph' to reflow paragraphs."
|
||||||
(interactive)
|
(interactive)
|
||||||
(let ((element (org-element-at-point)))
|
(let ((element (org-element-at-point)))
|
||||||
(cond ((org-in-src-block-p nil element)
|
(cond ((doom-region-active-p)
|
||||||
|
;; TODO Perform additional formatting?
|
||||||
|
;; (save-restriction
|
||||||
|
;; (narrow-to-region beg end)
|
||||||
|
;; (org-table-recalculate t)
|
||||||
|
;; (org-table-map-tables #'org-table-align)
|
||||||
|
;; (org-align-tags t)
|
||||||
|
;; (org-update-statistics-cookies t)
|
||||||
|
;; ...)
|
||||||
|
(if (modulep! :editor format)
|
||||||
|
(call-interactively #'+format/org-block-in-region)
|
||||||
|
(message ":editor format is disabled, skipping reformatting of org-blocks")))
|
||||||
|
((org-in-src-block-p nil element)
|
||||||
(unless (modulep! :editor format)
|
(unless (modulep! :editor format)
|
||||||
(user-error ":editor format module is disabled, ignoring reformat..."))
|
(user-error ":editor format module is disabled, ignoring reformat..."))
|
||||||
(call-interactively #'+format/org-block))
|
(call-interactively #'+format/org-block))
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue