From 24a18f1ffdc38dfd297960d9b06a12f35a256e82 Mon Sep 17 00:00:00 2001 From: Ippei FURUHASHI Date: Fri, 5 Apr 2013 16:07:00 +0900 Subject: [PATCH] org-table.el: Fix a bug of leaving the inserted TBLFM line * org-table.el (org-calc-current-TBLFM): Ensure to remove the currently inserted TBLFM line, when calling `org-table-recalculate' returns an error and the processing stops. * testing/lisp/test-org-table.el: Add test. When you hit =C-c C-c= at the line of "#+TBLFM: $2=$1*2::$2=$1**2" in | 1 | | | 2 | | #+TBLFM: $2=$1*1 #+TBLFM: $2=$1*2::$2=$1**2 you got: | 1 | | | 2 | | #+TBLFM: $2=$1*2::$2=$1**2 #+TBLFM: $2=$1*1 #+TBLFM: $2=$1*2::$2=$1**2 with the error message of: user-error: Double definition `$2=' in TBLFM line, please fix by hand In this case, you expected: | 1 | | | 2 | | #+TBLFM: $2=$1*1 #+TBLFM: $2=$1*2::$2=$1**2 --- lisp/org-table.el | 7 ++++--- testing/lisp/test-org-table.el | 25 +++++++++++++++++++++++++ 2 files changed, 29 insertions(+), 3 deletions(-) diff --git a/lisp/org-table.el b/lisp/org-table.el index ccd1735..460d249 100644 --- a/lisp/org-table.el +++ b/lisp/org-table.el @@ -3190,10 +3190,11 @@ (defun org-calc-current-TBLFM (&optional arg) (beginning-of-line 0) ; move to the inserted line (skip-chars-backward " \r\n\t") (if (org-at-table-p) - (org-call-with-arg 'org-table-recalculate (or arg t))) + (unwind-protect + (org-call-with-arg 'org-table-recalculate (or arg t)) - ;; Delete the formula inserted temporarily - (delete-region s e)))) + ;; delete the formula inserted temporarily + (delete-region s e)))))) (defun org-TBLFM-begin () "Find the beginning of the TBLFM lines and return its position. diff --git a/testing/lisp/test-org-table.el b/testing/lisp/test-org-table.el index dda8561..01adf52 100644 --- a/testing/lisp/test-org-table.el +++ b/testing/lisp/test-org-table.el @@ -929,6 +929,31 @@ (defconst references/target-special " (should (string= got expect))))) +(ert-deftest test-org-table/org-calc-current-TBLFM-when-stop-because-of-error () + "org-calc-current-TBLFM should preserve the input as it was." + (org-test-with-temp-text-in-file + " +| 1 | 1 | +| 2 | 2 | +#+TBLFM: $2=$1*1 +#+TBLFM: $2=$1*2::$2=$1*2 +#+TBLFM: $2=$1*3 +" + (let ((expect " +| 1 | 1 | +| 2 | 2 | +#+TBLFM: $2=$1*1 +#+TBLFM: $2=$1*2::$2=$1*2 +#+TBLFM: $2=$1*3 +")) + (goto-char (point-min)) + (forward-line 4) + (should-error (org-calc-current-TBLFM)) + (setq got (buffer-string)) + (message "%s" got) + (should (string= got + expect))))) + (provide 'test-org-table) ;;; test-org-table.el ends here -- 1.7.9.msysgit.0