From mboxrd@z Thu Jan 1 00:00:00 1970 From: Rasmus Subject: Re: [patch] org-delete-indentation Date: Sun, 17 May 2015 15:21:22 +0200 Message-ID: <878ucnibl9.fsf@gmx.us> References: <87fv6wh6yr.fsf@gmx.us> <87k2w78uxy.fsf@nicolasgoaziou.fr> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" Return-path: Received: from eggs.gnu.org ([2001:4830:134:3::10]:40838) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YtyVb-00010y-JP for emacs-orgmode@gnu.org; Sun, 17 May 2015 09:21:37 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1YtyVY-0004K5-8p for emacs-orgmode@gnu.org; Sun, 17 May 2015 09:21:35 -0400 Received: from plane.gmane.org ([80.91.229.3]:53393) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YtyVX-0004IA-TP for emacs-orgmode@gnu.org; Sun, 17 May 2015 09:21:32 -0400 Received: from list by plane.gmane.org with local (Exim 4.69) (envelope-from ) id 1YtyVW-0006ZJ-NQ for emacs-orgmode@gnu.org; Sun, 17 May 2015 15:21:30 +0200 Received: from 71.red-88-19-189.staticip.rima-tde.net ([88.19.189.71]) by main.gmane.org with esmtp (Gmexim 0.1 (Debian)) id 1AlnuQ-0007hv-00 for ; Sun, 17 May 2015 15:21:30 +0200 Received: from rasmus by 71.red-88-19-189.staticip.rima-tde.net with local (Gmexim 0.1 (Debian)) id 1AlnuQ-0007hv-00 for ; Sun, 17 May 2015 15:21:30 +0200 List-Id: "General discussions about Org-mode." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: emacs-orgmode-bounces+geo-emacs-orgmode=m.gmane.org@gnu.org Sender: emacs-orgmode-bounces+geo-emacs-orgmode=m.gmane.org@gnu.org To: emacs-orgmode@gnu.org --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit Nicolas Goaziou 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 --=-=-= Content-Type: text/x-diff Content-Disposition: attachment; filename=0002-org.el-New-function-org-delete-indentation.patch >From 6f2a4d4f02680fae95c2e799db2ae455a06aa115 Mon Sep 17 00:00:00 2001 From: Rasmus 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" + (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. -- 2.4.1 --=-=-= Content-Type: text/x-diff Content-Disposition: attachment; filename=0003-org-delete-indentation-Add-support-for-tables.patch >From 25cca4de0a20667b339abaf7cae067540e47a33d Mon Sep 17 00:00:00 2001 From: Rasmus 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 --=-=-=--