summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNicolas Goaziou <mail@nicolasgoaziou.fr>2017-12-30 00:57:28 +0100
committerNicolas Goaziou <mail@nicolasgoaziou.fr>2017-12-30 00:58:11 +0100
commitd4d9e90d198764ae3824989a5bf6620527a00cab (patch)
treea282f749fbab595836ff689ec7fa0f324eef7303
parent2fb65b73b638ab3b9200768319db58d54a969f3b (diff)
downloadorg-mode-d4d9e90d198764ae3824989a5bf6620527a00cab.tar.gz
org-table: Small optimization
* lisp/org-table.el (org-table-check-inside-data-field): Add optional argument. (org-table-find-dataline): Do not call `org-at-table-p' needlessly. (org-table-delete-column): (org-table-move-column): (org-table-copy-region): (org-table-eval-formula): Use new argument. (org-table-force-dataline): Small refactoring. This patch limits the number of calls to `org-at-table-p'.
-rw-r--r--lisp/org-table.el71
1 files changed, 36 insertions, 35 deletions
diff --git a/lisp/org-table.el b/lisp/org-table.el
index 4ad643f..30946dc 100644
--- a/lisp/org-table.el
+++ b/lisp/org-table.el
@@ -1170,14 +1170,16 @@ to a number. In the case of a timestamp, increment by days."
(org-table-align)
(org-move-to-column col))))
-(defun org-table-check-inside-data-field (&optional noerror)
- "Is point inside a table data field?
-I.e. not on a hline or before the first or after the last column?
-This actually throws an error, so it aborts the current command."
- (cond ((and (org-at-table-p)
+(defun org-table-check-inside-data-field (&optional noerror assume-table)
+ "Non-nil when point is inside a table data field.
+Raise an error otherwise, unless NOERROR is non-nil. In that
+case, return nil if point is not inside a data field. When
+optional argument ASSUME-TABLE is non-nil, assume point is within
+a table."
+ (cond ((and (or assume-table (org-at-table-p))
(not (save-excursion (skip-chars-backward " \t") (bolp)))
(not (org-at-table-hline-p))
- (not (looking-at "[ \t]*$"))))
+ (not (looking-at-p "[ \t]*$"))))
(noerror nil)
(t (user-error "Not in table data field"))))
@@ -1399,23 +1401,19 @@ However, when FORCE is non-nil, create new columns if necessary."
(org-table-fix-formulas "$LR" nil (1- col) 1))))
(defun org-table-find-dataline ()
- "Find a data line in the current table, which is needed for column commands."
- (if (and (org-at-table-p)
- (not (org-at-table-hline-p)))
- t
- (let ((col (current-column))
- (end (org-table-end)))
- (org-move-to-column col)
- (while (and (< (point) end)
- (or (not (= (current-column) col))
- (org-at-table-hline-p)))
- (beginning-of-line 2)
- (org-move-to-column col))
- (if (and (org-at-table-p)
- (not (org-at-table-hline-p)))
- t
- (user-error
- "Please position cursor in a data line for column operations")))))
+ "Find a data line in the current table, which is needed for column commands.
+This function assumes point is in a table. Raise an error when
+there is no data row below."
+ (or (not (org-at-table-hline-p))
+ (let ((col (current-column))
+ (end (org-table-end)))
+ (forward-line)
+ (while (and (< (point) end) (org-at-table-hline-p))
+ (forward-line))
+ (when (>= (point) end)
+ (user-error "Cannot find data row for column operation"))
+ (org-move-to-column col)
+ t)))
(defun org-table-line-to-dline (line &optional above)
"Turn a buffer line number into a data line number.
@@ -1446,7 +1444,7 @@ non-nil, the one above is used."
(interactive)
(unless (org-at-table-p) (user-error "Not at a table"))
(org-table-find-dataline)
- (org-table-check-inside-data-field)
+ (org-table-check-inside-data-field nil t)
(let* ((col (org-table-current-column))
(beg (org-table-begin))
(end (copy-marker (org-table-end)))
@@ -1495,7 +1493,7 @@ non-nil, the one above is used."
(interactive "P")
(unless (org-at-table-p) (user-error "Not at a table"))
(org-table-find-dataline)
- (org-table-check-inside-data-field)
+ (org-table-check-inside-data-field nil t)
(let* ((col (org-table-current-column))
(col1 (if left (1- col) col))
(colpos (if left (1- col) (1+ col)))
@@ -1836,7 +1834,7 @@ with `org-table-paste-rectangle'."
(c01 (org-table-current-column))
region)
(goto-char (max beg end))
- (org-table-check-inside-data-field)
+ (org-table-check-inside-data-field nil t)
(let* ((end (copy-marker (line-end-position)))
(c02 (org-table-current-column))
(column-start (min c01 c02))
@@ -2731,7 +2729,7 @@ SUPPRESS-ANALYSIS prevents analyzing the table and checking
location of point."
(interactive "P")
(unless suppress-analysis
- (org-table-check-inside-data-field)
+ (org-table-check-inside-data-field nil t)
(org-table-analyze))
(if (equal arg '(16))
(let ((eq (org-table-current-field-formula)))
@@ -4438,18 +4436,21 @@ When LOCAL is non-nil, show references for the table at point."
(select-window win))))
(defun org-table-force-dataline ()
- "Make sure the cursor is in a dataline in a table."
- (unless (save-excursion
- (beginning-of-line 1)
- (looking-at org-table-dataline-regexp))
+ "Move point to the closest data line in a table.
+Raise an error if the table contains no data line. Preserve
+column when moving point."
+ (unless (org-match-line org-table-dataline-regexp)
(let* ((re org-table-dataline-regexp)
- (p1 (save-excursion (re-search-forward re nil 'move)))
- (p2 (save-excursion (re-search-backward re nil 'move))))
+ (column (current-column))
+ (p1 (save-excursion (re-search-forward re (org-table-end) t)))
+ (p2 (save-excursion (re-search-backward re (org-table-begin) t))))
(cond ((and p1 p2)
(goto-char (if (< (abs (- p1 (point))) (abs (- p2 (point))))
- p1 p2)))
+ p1
+ p2)))
((or p1 p2) (goto-char (or p1 p2)))
- (t (user-error "No table dataline around here"))))))
+ (t (user-error "No table data line around here")))
+ (org-move-to-column column))))
(defun org-table-fedit-line-up ()
"Move cursor one line up in the window showing the table."