Re: [PATCH] Re: Bug: org-edit-special indents inline latex [9.5 (nil @ /home/david/.emacs.d/.local/straight/build-27.2/org-mode/)]
Hi Sébastien, Sébastien Miquel writes: > I've rebased the patch on main. It is still relevant (Ihor and I have > provided > reproducers earlier in the thread). Applied in bugfix, thanks! -- Bastien
Re: [PATCH] Re: Bug: org-edit-special indents inline latex [9.5 (nil @ /home/david/.emacs.d/.local/straight/build-27.2/org-mode/)]
Sébastien Miquel writes: > I had done some testing, and some more recently. The patch only affects > latex-fragments and org entities to be edited which do not need to start > at a > beginning of line (latex-fragments, inline src blocks, footnote > definitions). Also looks fine for me. Best, Ihor
Re: [PATCH] Re: Bug: org-edit-special indents inline latex [9.5 (nil @ /home/david/.emacs.d/.local/straight/build-27.2/org-mode/)]
Hi Bastien, Bastien writes: Sébastien, have you been able to test this patch heavily and is it still needed, or has it been made somehow irrelevant? (I see it does apply well on the bugfix branch, but not on main.) Thanks for any feedback, I've rebased the patch on main. It is still relevant (Ihor and I have provided reproducers earlier in the thread). I had done some testing, and some more recently. The patch only affects latex-fragments and org entities to be edited which do not need to start at a beginning of line (latex-fragments, inline src blocks, footnote definitions). Regards, -- Sébastien Miquel From b80124aa6edbd3b6992817dd8c37253705c82ae3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Miquel?= Date: Mon, 30 Aug 2021 23:18:41 +0200 Subject: [PATCH] org-src.el: Fix special editing of LaTeX fragments * lisp/org-macs.el (org-do-remove-indentation): Add optional argument to skip the first line. * lisp/org-src.el (org-src--coordinates): Fix coordinates for inline LaTeX fragments. (org-src--contents-for-write-back): Do not indent first line for LaTeX fragments. (org-src--edit-element): Compute block-indentation according to parent for LaTeX fragments. Skip first line when removing common indentation for LaTeX fragments. --- lisp/org-macs.el | 9 ++--- lisp/org-src.el | 18 ++ 2 files changed, 20 insertions(+), 7 deletions(-) diff --git a/lisp/org-macs.el b/lisp/org-macs.el index bf1340b0a..1ef89a04d 100644 --- a/lisp/org-macs.el +++ b/lisp/org-macs.el @@ -326,17 +326,19 @@ it for output." ;;; Indentation -(defun org-do-remove-indentation ( n) +(defun org-do-remove-indentation ( n skip-fl) "Remove the maximum common indentation from the buffer. When optional argument N is a positive integer, remove exactly -that much characters from indentation, if possible. Return nil -if it fails." +that much characters from indentation, if possible. When +optional argument SKIP-FL is non-nil, skip the first +line. Return nil if it fails." (catch :exit (goto-char (point-min)) ;; Find maximum common indentation, if not specified. (let ((n (or n (let ((min-ind (point-max))) (save-excursion + (when skip-fl (forward-line)) (while (re-search-forward "^[ \t]*\\S-" nil t) (let ((ind (current-indentation))) (if (zerop ind) (throw :exit nil) @@ -344,6 +346,7 @@ if it fails." min-ind (if (zerop n) (throw :exit nil) ;; Remove exactly N indentation, but give up if not possible. +(when skip-fl (forward-line)) (while (not (eobp)) (let ((ind (progn (skip-chars-forward " \t") (current-column (cond ((eolp) (delete-region (line-beginning-position) (point))) diff --git a/lisp/org-src.el b/lisp/org-src.el index 3b25fad60..d78f46186 100644 --- a/lisp/org-src.el +++ b/lisp/org-src.el @@ -327,7 +327,8 @@ a cons cell (LINE . COLUMN) or symbol `end'. See also (if (>= pos end) 'end (org-with-wide-buffer (goto-char (max beg pos)) - (cons (count-lines beg (line-beginning-position)) + (cons (count-lines (save-excursion (goto-char beg) (line-beginning-position)) +(line-beginning-position)) ;; Column is relative to the end of line to avoid problems of ;; comma escaping or colons appended in front of the line. (- (point) (min end (line-end-position))) @@ -445,6 +446,7 @@ Assume point is in the corresponding edit buffer." org-src--content-indentation 0 (use-tabs? (and (> org-src--tab-width 0) t)) +(preserve-fl (eq org-src--source-type 'latex-fragment)) (source-tab-width org-src--tab-width) (contents (org-with-wide-buffer (let ((eol (line-end-position))) @@ -466,7 +468,8 @@ Assume point is in the corresponding edit buffer." ;; Add INDENTATION-OFFSET to every line in buffer, ;; unless indentation is meant to be preserved. (when (> indentation-offset 0) - (while (not (eobp)) + (when preserve-fl (forward-line)) +(while (not (eobp)) (skip-chars-forward " \t") (when (or (not (eolp)) ; not a blank line (and (eq (point) (marker-position marker)) ; current line @@ -518,7 +521,13 @@ Leave point in edit buffer." (source-tab-width (if indent-tabs-mode tab-width 0)) (type (org-element-type datum)) (block-ind (org-with-point-at (org-element-property :begin datum) - (current-indentation))) + (cond + ((save-excursion (skip-chars-backward " \t") (bolp)) + (current-indentation)) + ((org-element-property :parent datum) +(org--get-expected-indentation + (org-element-property :parent datum) nil)) + (t (current-indentation) (content-ind org-edit-src-content-indentation) (blank-line
Re: [PATCH] Re: Bug: org-edit-special indents inline latex [9.5 (nil @ /home/david/.emacs.d/.local/straight/build-27.2/org-mode/)]
Hi! I briefly tried the patch today, and it seemed to solve the issue on my end, but I'm afraid a deeper analysis of the changes is beyond what I can do. As for it's relevance, when I didn't apply Sebastien's patch and disabled my temporary workaround fix I described in the original post, the problem it was still very much there. Best, David On 9/27/21 13:01, Bastien wrote: Hi David and Sébastien, Sébastien Miquel writes: Thanks for reporting and confirming. David, Did you have time to look at Sébastien's patch? Sébastien, have you been able to test this patch heavily and is it still needed, or has it been made somehow irrelevant? (I see it does apply well on the bugfix branch, but not on main.) Thanks for any feedback,
Re: [PATCH] Re: Bug: org-edit-special indents inline latex [9.5 (nil @ /home/david/.emacs.d/.local/straight/build-27.2/org-mode/)]
Hi David and Sébastien, Sébastien Miquel writes: > Thanks for reporting and confirming. David, Did you have time to look at Sébastien's patch? Sébastien, have you been able to test this patch heavily and is it still needed, or has it been made somehow irrelevant? (I see it does apply well on the bugfix branch, but not on main.) Thanks for any feedback, -- Bastien
[PATCH] Re: Bug: org-edit-special indents inline latex [9.5 (nil @ /home/david/.emacs.d/.local/straight/build-27.2/org-mode/)]
Hi, Ihor Radchenko writes: Dávid Jakab writes: When using org-edit-special to edit inline latex, i.e., equations between \( and \), in an org-mode buffer, a number of spaces may get inserted before \( after the latex editing minibuffer is closed. The attached patch fixes this as well as a couple other issues with special editing of latex fragments : + the coordinates computation was wrong, so point position inside fragment isn't preserved when calling ~org-edit-special~ from an inline fragment. + common leading indentation wasn't getting trimmed when editing a multiline fragment inside an org list such as $$abc def$$ Thanks for reporting and confirming. Regards, -- Sébastien Miquel >From 5c3254d42e3d359021d41dae9a0549244e6fddff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Miquel?= Date: Mon, 30 Aug 2021 23:18:41 +0200 Subject: [PATCH] org-src.el: Fix special editing of LaTeX fragments * lisp/org-macs.el (org-do-remove-indentation): Add optional argument to skip the first line. * lisp/org-src.el (org-src--coordinates): Fix coordinates for inline LaTeX fragments. (org-src--contents-for-write-back): Do not indent first line for LaTeX fragments. (org-src--edit-element): Compute block-indentation according to parent for LaTeX fragments. Skip first line when removing common indentation for LaTeX fragments. --- lisp/org-macs.el | 9 ++--- lisp/org-src.el | 18 ++ 2 files changed, 20 insertions(+), 7 deletions(-) diff --git a/lisp/org-macs.el b/lisp/org-macs.el index 77458db96..5c90c92f6 100644 --- a/lisp/org-macs.el +++ b/lisp/org-macs.el @@ -326,17 +326,19 @@ it for output." ;;; Indentation -(defun org-do-remove-indentation ( n) +(defun org-do-remove-indentation ( n skip-fl) "Remove the maximum common indentation from the buffer. When optional argument N is a positive integer, remove exactly -that much characters from indentation, if possible. Return nil -if it fails." +that much characters from indentation, if possible. When +optional argument SKIP-FL is non-nil, skip the first +line. Return nil if it fails." (catch :exit (goto-char (point-min)) ;; Find maximum common indentation, if not specified. (let ((n (or n (let ((min-ind (point-max))) (save-excursion + (when skip-fl (forward-line)) (while (re-search-forward "^[ \t]*\\S-" nil t) (let ((ind (current-indentation))) (if (zerop ind) (throw :exit nil) @@ -344,6 +346,7 @@ if it fails." min-ind (if (zerop n) (throw :exit nil) ;; Remove exactly N indentation, but give up if not possible. +(when skip-fl (forward-line)) (while (not (eobp)) (let ((ind (progn (skip-chars-forward " \t") (current-column (cond ((eolp) (delete-region (line-beginning-position) (point))) diff --git a/lisp/org-src.el b/lisp/org-src.el index 4698c6dd2..2e72b1755 100644 --- a/lisp/org-src.el +++ b/lisp/org-src.el @@ -324,7 +324,8 @@ a cons cell (LINE . COLUMN) or symbol `end'. See also (if (>= pos end) 'end (org-with-wide-buffer (goto-char (max beg pos)) - (cons (count-lines beg (line-beginning-position)) + (cons (count-lines (save-excursion (goto-char beg) (line-beginning-position)) +(line-beginning-position)) ;; Column is relative to the end of line to avoid problems of ;; comma escaping or colons appended in front of the line. (- (point) (min end (line-end-position))) @@ -442,6 +443,7 @@ Assume point is in the corresponding edit buffer." org-src--content-indentation 0 (use-tabs? (and (> org-src--tab-width 0) t)) +(preserve-fl (eq org-src--source-type 'latex-fragment)) (source-tab-width org-src--tab-width) (contents (org-with-wide-buffer (buffer-string))) (write-back org-src--allow-write-back)) @@ -456,7 +458,8 @@ Assume point is in the corresponding edit buffer." ;; Add INDENTATION-OFFSET to every line in buffer, ;; unless indentation is meant to be preserved. (when (> indentation-offset 0) - (while (not (eobp)) + (when preserve-fl (forward-line)) +(while (not (eobp)) (skip-chars-forward " \t") (let ((i (current-column))) (delete-region (line-beginning-position) (point)) @@ -504,7 +507,13 @@ Leave point in edit buffer." (source-tab-width (if indent-tabs-mode tab-width 0)) (type (org-element-type datum)) (block-ind (org-with-point-at (org-element-property :begin datum) - (current-indentation))) + (cond + ((save-excursion (skip-chars-backward " \t") (bolp)) + (current-indentation)) + ((org-element-property :parent datum) +(org--get-expected-indentation + (org-element-property :parent datum) nil)) + (t (current-indentation) (content-ind org-edit-src-content-indentation)