If `org-toggle-item' is called between the text of an entry and the next heading, it removes the tags from the next heading. ECM: With the following Org markup in a buffer and point denoted by "|": #+begin_example ,* First Some text | ,** Second :tag: #+end_example invoking `org-toggle-item' removes the second heading's tags, resulting in: #+begin_example ,* First Some text | ,** Second #+end_example `org-toggle-item's documentation claims: > Convert headings or normal lines to items, items to normal > lines. > If there is no active region, only the current line is > considered. Though this doesn't seem to be the case here. There is no active region, so I would expect it to do nothing in this case. I stepped through `org-toggle-item' and I believe it's because of the following logic: >;; Determine boundaries of changes. >(if (org-region-active-p) >(setq beg (funcall skip-blanks (region-beginning)) >end (copy-marker (region-end))) >(setq beg (funcall skip-blanks (point-at-bol)) >end (copy-marker (point-at-eol)))) Blank lines are being skipped regardless of whether region is active or not.
[-- Attachment #1: Type: text/plain, Size: 208 bytes --] I've attached a patch which removes the call to skip-blanks if there is no active region. This works for me with the ECM I've provided. Not sure if it will have any adverse repercussions outside of that. [-- Warning: decoded text below may be mangled, UTF-8 assumed --] [-- Attachment #2: org-toggle-item-operate-on-single-line --] [-- Type: text/x-patch, Size: 972 bytes --] From ada4f2a55b7a701aac02d4fc167be4b46e72f2c9 Mon Sep 17 00:00:00 2001 From: Nicholas Vollmer <iarchivedmywholelife@gmail.com> Date: Fri, 31 Jul 2020 18:38:11 -0400 Subject: [PATCH] org-list: Operate on single line if no active region * lisp/org-list.el (org-toggle-item): Operate on single line if no active region. --- lisp/org-list.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lisp/org-list.el b/lisp/org-list.el index fb061b054..c43630d05 100644 --- a/lisp/org-list.el +++ b/lisp/org-list.el @@ -3032,7 +3032,7 @@ With a prefix argument ARG, change the region in a single item." (if (org-region-active-p) (setq beg (funcall skip-blanks (region-beginning)) end (copy-marker (region-end))) - (setq beg (funcall skip-blanks (point-at-bol)) + (setq beg (point-at-bol) end (copy-marker (point-at-eol)))) ;; Depending on the starting line, choose an action on the text ;; between BEG and END. -- 2.27.0
No Wayman writes:
> I've attached a patch which removes the call to skip-blanks if
> there is no active region.
> This works for me with the ECM I've provided.
> Not sure if it will have any adverse repercussions outside of
> that.
Taking a quick look, I don't spot anything. And the org-list tests
still pass with the change. Would you mind updating the patch to add a
test case along the lines of your ECM to test-org-list/toggle-item?
Thanks.
[-- Attachment #1: Type: text/plain, Size: 243 bytes --] Kyle Meyer <kyle@kyleam.com> writes: > Would you mind updating the patch to add a > test case along the lines of your ECM to > test-org-list/toggle-item? > > Thanks. Added the test in the attached patch. Thanks, Kyle. ~ Nicholas Vollmer [-- Warning: decoded text below may be mangled, UTF-8 assumed --] [-- Attachment #2: org-toggle-item-no-region-single-line --] [-- Type: text/x-patch, Size: 1728 bytes --] From 838a6a548396eecfa958161abb66f0a1719a9aef Mon Sep 17 00:00:00 2001 From: Nicholas Vollmer <iarchivedmywholelife@gmail.com> Date: Fri, 31 Jul 2020 18:38:11 -0400 Subject: [PATCH] org-list: Operate on single line if no active region * lisp/org-list.el (org-toggle-item): Operate on single line if no active region. --- lisp/org-list.el | 2 +- testing/lisp/test-org-list.el | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/lisp/org-list.el b/lisp/org-list.el index fb061b054..c43630d05 100644 --- a/lisp/org-list.el +++ b/lisp/org-list.el @@ -3032,7 +3032,7 @@ With a prefix argument ARG, change the region in a single item." (if (org-region-active-p) (setq beg (funcall skip-blanks (region-beginning)) end (copy-marker (region-end))) - (setq beg (funcall skip-blanks (point-at-bol)) + (setq beg (point-at-bol) end (copy-marker (point-at-eol)))) ;; Depending on the starting line, choose an action on the text ;; between BEG and END. diff --git a/testing/lisp/test-org-list.el b/testing/lisp/test-org-list.el index abd1a3c83..24a55464d 100644 --- a/testing/lisp/test-org-list.el +++ b/testing/lisp/test-org-list.el @@ -1109,6 +1109,13 @@ b. Item 2<point>" (org-test-with-temp-text "* H\n:PROPERTIES:\n:A: 1\n:END:\n\n\nText" (org-toggle-item nil) (buffer-string)))) + ;; When no region is marked and point is on a blank line + ;; only operate on current line + (should + (equal " \n* H :tag:" + (org-test-with-temp-text "<point> \n* H :tag:" + (org-toggle-item nil) + (buffer-string)))) ;; When a region is marked and first line is a headline, all ;; headlines are turned into items. (should -- 2.27.0
No Wayman writes:
> Added the test in the attached patch.
Thanks. Applied (093b474e6), appending a period to the comment in the
test for consistency.