diff --git a/etc/ORG-NEWS b/etc/ORG-NEWS index 4ef865666..a3cbcc6c3 100644 --- a/etc/ORG-NEWS +++ b/etc/ORG-NEWS @@ -376,6 +376,9 @@ for details. Calling ~org-edit-footnote-reference~ (C-c ') on a footnote reference allows to edit its definition, as long as it is not anonymous, in a dedicated buffer. It works even if buffer is currently narrowed. +*** New function ~org-delete-indentation~ bound to ~M-^~ +Work as ~delete-indentation~ unless at heading, in which case text is +added to headline text. ** Miscellaneous *** Strip all meta data from ITEM special property ITEM special property does not contain TODO, priority or tags anymore. diff --git a/lisp/org.el b/lisp/org.el index 6ed8f762c..5c54125f9 100755 --- a/lisp/org.el +++ b/lisp/org.el @@ -19832,6 +19832,7 @@ boundaries." (org-defkey org-mode-map [remap comment-dwim] 'org-comment-dwim) (org-defkey org-mode-map [remap forward-paragraph] 'org-forward-paragraph) (org-defkey org-mode-map [remap backward-paragraph] 'org-backward-paragraph) +(org-defkey org-mode-map "\M-^" 'org-delete-indentation) (org-defkey org-mode-map "\C-m" 'org-return) (org-defkey org-mode-map "\C-j" 'org-return-indent) (org-defkey org-mode-map "\C-c?" 'org-table-field-info) @@ -21159,6 +21160,39 @@ This command does many different things, depending on context: (let ((org-note-abort t)) (funcall org-finish-function)))) +(defun org-delete-indentation (&optional ARG) + "Join current line to previous and fix whitespace at join. + +If previous line is a headline add to headline title. Otherwise +the function calls `delete-indentation'. + +With argument, join this line to following line." + (interactive "*P") + (if (save-excursion + (if ARG (beginning-of-line) + (forward-line -1)) + (looking-at org-complex-heading-regexp)) + ;; At headline. + (let ((tags-column (when (match-beginning 5) + (save-excursion (goto-char (match-beginning 5)) + (current-column)))) + (string (concat " " (progn (when ARG (forward-line 1)) + (org-trim (delete-and-extract-region + (line-beginning-position) + (line-end-position))))))) + (unless (bobp) (delete-region (point) (1- (point)))) + (goto-char (or (match-end 4) + (match-beginning 5) + (match-end 0))) + (skip-chars-backward " \t") + (save-excursion (insert string)) + ;; Adjust alignment of tags. + (when tags-column + (org-align-tags-here (if org-auto-align-tags + org-tags-column + tags-column)))) + (delete-indentation ARG))) + (defun org-open-line (n) "Insert a new row in tables, call `open-line' elsewhere. If `org-special-ctrl-o' is nil, just call `open-line' everywhere." diff --git a/testing/lisp/test-org.el b/testing/lisp/test-org.el index 2f21c8e3b..04e0843dc 100644 --- a/testing/lisp/test-org.el +++ b/testing/lisp/test-org.el @@ -833,6 +833,36 @@ ;;; Editing +(ert-deftest test-org/delete-indentation () + "Test `org-delete-indentation' specifications." + ;; Regular test. + (should (equal "foo bar" + (org-test-with-temp-text + "foo \n bar" + (org-delete-indentation) + (buffer-string)))) + ;; With optional argument. + (should (equal "foo bar" + (org-test-with-temp-text + "foo \n bar" + (org-delete-indentation t) + (buffer-string)))) + ;; At headline text should be appended to the headline text. + (should + (equal"* foo bar :tag:" + (let (org-auto-align-tags) + (org-test-with-temp-text + "* foo :tag:\n bar" + (org-delete-indentation) + (buffer-string))))) + (should + (equal "* foo bar :tag:" + (let (org-auto-align-tags) + (org-test-with-temp-text + "* foo :tag:\n bar" + (org-delete-indentation t) + (buffer-string)))))) + (ert-deftest test-org/return () "Test `org-return' specifications." ;; Regular test.