Sébastien Miquel <sebastien.miq...@posteo.eu> writes: >> Try >> 1. emacs -Q >> 2. insert >> ;; A comment >> (+ 2 2) >> 3. M-h M-q >> >> Is it emacs-lisp-mode bug? Or is it illegal to fill-region in source >> code buffers? > > I think the original report is about M-q, not M-h M-q. M-q behaves as > expected in emacs-lisp-mode. > > Currently, org-fill-paragraph will not work properly when called inside > src blocks. This can be easily fixed, but probably requires yet another > org-fill-paragraph-act-natively variable.
See the attached. I am not sure if we really need the variable. AFAIU, acting natively was the default in the past for M-q with no region selection. Then, I "fixed" some bug report in 05ee1e6ee06db and introduced the bug herein.
>From 8777839a4fe5da6c9a780eac946e1a8a892d4f22 Mon Sep 17 00:00:00 2001 Message-Id: <8777839a4fe5da6c9a780eac946e1a8a892d4f22.1664788728.git.yanta...@gmail.com> From: Ihor Radchenko <yanta...@gmail.com> Date: Mon, 3 Oct 2022 17:03:15 +0800 Subject: [PATCH] org-fill-element: Respect region selection when filling src-block * lisp/org.el (org-fill-element): When region is not active, run `fill-paragraph' at point inside src block. When region is active and within src block boundaries, run `fill-paragraph' preserving the region. When region is active and crosses src block boundaries, fill the whole src block. Reported-by: Fabio Natali <m...@fabionatali.com> Fixes: https://orgmode.org/list/201b44de-1f97-1b23-1767-970ee00f2...@posteo.eu --- lisp/org.el | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/lisp/org.el b/lisp/org.el index 036384a04..23cf4198e 100644 --- a/lisp/org.el +++ b/lisp/org.el @@ -19135,11 +19135,18 @@ (defun org-fill-element (&optional justify) ;; the buffer. In that case, ignore filling. (cl-case (org-element-type element) ;; Use major mode filling function is source blocks. - (src-block (org-babel-do-in-edit-buffer - (push-mark (point-min)) - (goto-char (point-max)) - (setq mark-active t) - (funcall-interactively #'fill-paragraph justify 'region))) + (src-block + (let ((regionp (region-active-p))) + (org-babel-do-in-edit-buffer + ;; `org-babel-do-in-edit-buffer' will preserve region if it + ;; is within src block contents. Otherwise, the region + ;; crosses src block boundaries. We re-fill the whole src + ;; block in such scenario. + (when (and regionp (not (region-active-p))) + (push-mark (point-min)) + (goto-char (point-max)) + (setq mark-active t)) + (funcall-interactively #'fill-paragraph justify 'region)))) ;; Align Org tables, leave table.el tables as-is. (table-row (org-table-align) t) (table -- 2.35.1
-- Ihor Radchenko // yantar92, Org mode contributor, Learn more about Org mode at <https://orgmode.org/>. Support Org development at <https://liberapay.com/org-mode>, or support my work at <https://liberapay.com/yantar92>