Nicolas Goaziou <m...@nicolasgoaziou.fr> writes:

> Also, shouldn't the final (delete-indentation ARG) be in the "else" part
> of the `if'?

It was, at least on my disk.  I did not check the patch.

>> +(ert-deftest test-org-delete-indentation ()
>> +  "Test M-^ (`org-delete-indentation') specification."
>
> I suggest to omit binding in the description. That's one thing less we
> have to keep up-to-date if it ever changes.

OK.

The attached patch is updated and seems pretty good.  It also handles tags
and entities according to org-auto-align-tags.

The second patch (0003) adds support for tables in the sense that

| a | c |
| b | d |

can be made into

| a b | c |
|     | d |

using M-^.

While this is pretty nice since it's hidden away in a uncommon key, one
thing that bothers me about it is that there's no natural key to go back
to the first situation.

While RET could be made to move content between, it may be too annoying.
Personally. I never use RET in tables for movement commands so it would
not bother me.  I wrote a preliminary patch for this, but there's many
open questions on supposed behavior IMO.

I can work more on M-^ and tables if desirable (primarily it should be
moved to org-table, I guess).  I can also work more on RET in tables, if
desirable.  Another "quirk" that I noticed is that RET works differently
when next row is a hline (insert new row) and a row (move to next row).
This is completely illogical to me.

—Rasmus

-- 
. . . The proofs are technical in nature and provides no real understanding
>From 6f2a4d4f02680fae95c2e799db2ae455a06aa115 Mon Sep 17 00:00:00 2001
From: Rasmus <ras...@gmx.us>
Date: Sat, 16 May 2015 17:19:03 +0200
Subject: [PATCH 2/3] org.el: New function org-delete-indentation

* org.el (org-delete-indentation): New function.
  (org-mode-map): Bind org-delete-indentation to M-^.
* test-org.el (test-org-delete-indentation): Test org-delete-indentation.
* ORG-NEWS: Add entry on org-delete-indentation.
---
 etc/ORG-NEWS             |  3 +++
 lisp/org.el              | 31 +++++++++++++++++++++++++++++++
 testing/lisp/test-org.el | 30 ++++++++++++++++++++++++++++++
 3 files changed, 64 insertions(+)

diff --git a/etc/ORG-NEWS b/etc/ORG-NEWS
index a3e1ae2..91e30f8 100644
--- a/etc/ORG-NEWS
+++ b/etc/ORG-NEWS
@@ -377,6 +377,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 a46cb86..6db69c1 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)
@@ -20976,6 +20977,36 @@ 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 this line to previous and fix up whitespace at join.
+
+If previous line is a headline add to headline text.  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-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 2f21c8e..04e0843 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<point>"
+		  (org-delete-indentation)
+		  (buffer-string))))
+  ;; With optional argument.
+  (should (equal "foo bar"
+		(org-test-with-temp-text
+		    "foo<point> \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<point>"
+	     (org-delete-indentation)
+	     (buffer-string)))))
+  (should
+   (equal "* foo bar :tag:"
+	  (let (org-auto-align-tags)
+	    (org-test-with-temp-text
+		"* foo <point>:tag:\n bar"
+	      (org-delete-indentation t)
+	      (buffer-string))))))
+
 (ert-deftest test-org/return ()
   "Test `org-return' specifications."
   ;; Regular test.
-- 
2.4.1

>From 25cca4de0a20667b339abaf7cae067540e47a33d Mon Sep 17 00:00:00 2001
From: Rasmus <ras...@gmx.us>
Date: Sun, 17 May 2015 14:46:25 +0200
Subject: [PATCH 3/3] org-delete-indentation: Add support for tables

* org.el (org-delete-indentation): Add support for tables.
---
 lisp/org.el | 66 +++++++++++++++++++++++++++++++++++++++++--------------------
 1 file changed, 45 insertions(+), 21 deletions(-)

diff --git a/lisp/org.el b/lisp/org.el
index 6db69c1..0c3e61c 100755
--- a/lisp/org.el
+++ b/lisp/org.el
@@ -20985,27 +20985,51 @@ 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-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)))
+  (cond ((save-excursion (if ARG (beginning-of-line)
+			   (forward-line -1))
+			 (looking-at org-complex-heading-regexp))
+	 ;; At a 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-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)))))
+	;; TODO: Should be moved to separate function in org-table.
+	((let ((current-line (org-table-current-line)))
+	   (and (org-at-table-p)
+		(or (or ARG (not (eq current-line 1)))
+		    (and ARG (eq current-line
+				 (save-excursion
+				   (org-table-end)
+				   (org-table-current-line)))))))
+	 (when ARG (org-table-next-row))
+	 (let ((column (org-table-current-column))
+	       (starting-line (org-table-current-line))
+	       (string (delete-and-extract-region
+			(point) (1- (search-forward "|")))))
+	   (org-table-goto-line (1- starting-line))
+	   (org-table-goto-column column)
+	   (search-forward "|")
+	   (backward-char)
+	   (skip-chars-backward " \t")
+	   (let ((column (current-column)))
+	     (insert " " (org-trim string))
+	     (org-table-align)
+	     (move-to-column column)
+	     (when (eq (preceding-char) ?|) (forward-char)))))
+	(t (delete-indentation ARG))))
 
 (defun org-open-line (n)
   "Insert a new row in tables, call `open-line' elsewhere.
-- 
2.4.1

Reply via email to