From 1f0f2052b8dddf4982ab35267ed1564f2250784b Mon Sep 17 00:00:00 2001 From: SÅ‚awomir Grochowski Date: Mon, 3 Apr 2023 19:23:09 +0200 Subject: [PATCH] org-columns: add feat to move row up/down --- lisp/org-colview.el | 22 +++++++++++ testing/lisp/test-org-colview.el | 66 ++++++++++++++++++++++++++++++++ 2 files changed, 88 insertions(+) diff --git a/lisp/org-colview.el b/lisp/org-colview.el index 92a3b473d..0971d5eef 100644 --- a/lisp/org-colview.el +++ b/lisp/org-colview.el @@ -209,6 +209,8 @@ See `org-columns-summary-types' for details.") (org-defkey org-columns-map ">" #'org-columns-widen) (org-defkey org-columns-map [(meta right)] #'org-columns-move-right) (org-defkey org-columns-map [(meta left)] #'org-columns-move-left) +(org-defkey org-columns-map [(meta down)] #'org-columns-move-row-down) +(org-defkey org-columns-map [(meta up)] #'org-columns-move-row-up) (org-defkey org-columns-map [(shift meta right)] #'org-columns-new) (org-defkey org-columns-map [(shift meta left)] #'org-columns-delete) (dotimes (i 10) @@ -1003,6 +1005,26 @@ details." (org-columns-move-right) (backward-char 1))) +(defun org-columns--move-row (&optional up) + "Move table row. Calls `org-move-subtree-down' or `org-move-subtree-up'." + (let ((inhibit-read-only t) + (col (current-column))) + (if up (org-move-subtree-up) + (org-move-subtree-down)) + (let ((org-columns-inhibit-recalculation t)) + (org-columns-redo) + (move-to-column col)))) + +(defun org-columns-move-row-down () + "Move table row (subtree) down." + (interactive) + (org-columns--move-row)) + +(defun org-columns-move-row-up () + "Move table row (subtree) up." + (interactive) + (org-columns--move-row 'up)) + (defun org-columns-store-format () "Store the text version of the current columns format. The format is stored either in the COLUMNS property of the node diff --git a/testing/lisp/test-org-colview.el b/testing/lisp/test-org-colview.el index 9daec18e2..fd02f054c 100644 --- a/testing/lisp/test-org-colview.el +++ b/testing/lisp/test-org-colview.el @@ -1010,6 +1010,72 @@ (list (get-char-property 1 'org-columns-value-modified) (get-char-property 2 'org-columns-value-modified)))))) +;; Each column is an overlay on top of a character. So there has +;; to be at least as many characters available on the line as +;; columns to display. +;; 'org-columns--display-here' +(ert-deftest test-org-colview/bug-add-whitespace () + "Insert space characters if number of characters on the line + is lower then number of columns." + :expected-result :failed + (should + (equal "* H +** A +** B +" + (org-test-with-temp-text "* H +** A +** B +" + (org-columns) + (buffer-substring-no-properties (point-min) (point-max)))))) + +(ert-deftest test-org-colview/columns-move-row-down () + "Test `org-columns-move-row-down' specifications." + (should + (equal "* H +** B +** A +" + (org-test-with-temp-text "* H +** A +** B +" + (let ((org-columns-default-format "%ITEM")) (org-columns) + (next-line 1) + (org-columns-move-row-down) + (buffer-substring-no-properties (point-min) (point-max))))))) + +(ert-deftest test-org-colview/columns-move-row-up () + "Test `org-columns-move-row-up' specifications." + (should + (equal "* H +** B +** A +" + (org-test-with-temp-text "* H +** A +** B +" + (let ((org-columns-default-format "%ITEM")) (org-columns) + (next-line 2) + (org-columns-move-row-up) + (buffer-substring-no-properties (point-min) (point-max))))))) + +(ert-deftest test-org-colview/columns-move-row () + "After function call 'org-columns--move-row' point should stay at the same column." + (should + (equal 35 + (org-test-with-temp-text "* H +** A +** B +" + (org-columns) + (next-line 1) + (forward-char 2) + (org-columns-move-row-down) + (current-column))))) + (ert-deftest test-org-colview/columns-move-left () "Test `org-columns-move-left' specifications." ;; Error when trying to move the left-most column. -- 2.30.2