|
@@ -2986,20 +2986,24 @@ when a line/row is swaped out of that privileged position. So for
|
|
|
formulas that use a range of rows or columns, it may often be better
|
|
|
to anchor the formula with \"I\" row markers, or to offset from the
|
|
|
borders of the table using the @< @> $< $> makers."
|
|
|
- (let (n nmax len char)
|
|
|
- (while (string-match "\\([@$]\\)\\(<+\\|>+\\)" s)
|
|
|
- (setq nmax (if (equal (match-string 1 s) "@")
|
|
|
- (1- (length org-table-dlines))
|
|
|
- org-table-current-ncol)
|
|
|
- len (- (match-end 2) (match-beginning 2))
|
|
|
- char (string-to-char (match-string 2 s))
|
|
|
- n (if (= char ?<)
|
|
|
- len
|
|
|
- (- nmax len -1)))
|
|
|
- (if (or (< n 1) (> n nmax))
|
|
|
- (error "Reference \"%s\" in expression \"%s\" points outside table"
|
|
|
- (match-string 0 s) s))
|
|
|
- (setq s (replace-match (format "%s%d" (match-string 1 s) n) t t s))))
|
|
|
+ (let (n nmax len char (start 0))
|
|
|
+ (while (string-match "\\([@$]\\)\\(<+\\|>+\\)\\|\\(remote([^\)]+)\\)"
|
|
|
+ s start)
|
|
|
+ (if (match-end 3)
|
|
|
+ (setq start (match-end 3))
|
|
|
+ (setq nmax (if (equal (match-string 1 s) "@")
|
|
|
+ (1- (length org-table-dlines))
|
|
|
+ org-table-current-ncol)
|
|
|
+ len (- (match-end 2) (match-beginning 2))
|
|
|
+ char (string-to-char (match-string 2 s))
|
|
|
+ n (if (= char ?<)
|
|
|
+ len
|
|
|
+ (- nmax len -1)))
|
|
|
+ (if (or (< n 1) (> n nmax))
|
|
|
+ (error "Reference \"%s\" in expression \"%s\" points outside table"
|
|
|
+ (match-string 0 s) s))
|
|
|
+ (setq start (match-beginning 0))
|
|
|
+ (setq s (replace-match (format "%s%d" (match-string 1 s) n) t t s)))))
|
|
|
s)
|
|
|
|
|
|
(defun org-table-formula-substitute-names (f)
|
|
@@ -4668,6 +4672,8 @@ The return value is either a single string for a single field, or a
|
|
|
list of the fields in the rectangle ."
|
|
|
(save-match-data
|
|
|
(let ((id-loc nil)
|
|
|
+ ;; Protect a bunch of variables from being overwritten
|
|
|
+ ;; by the context of the remote table
|
|
|
org-table-column-names org-table-column-name-regexp
|
|
|
org-table-local-parameters org-table-named-field-locations
|
|
|
org-table-current-line-types org-table-current-begin-line
|
|
@@ -4704,7 +4710,8 @@ list of the fields in the rectangle ."
|
|
|
(error "Cannot find a table at NAME or ID %s" name-or-id))
|
|
|
(setq tbeg (point-at-bol))
|
|
|
(org-table-get-specials)
|
|
|
- (setq form (org-table-formula-substitute-names form))
|
|
|
+ (setq form (org-table-formula-substitute-names
|
|
|
+ (org-table-formula-handle-first/last-rc form)))
|
|
|
(if (and (string-match org-table-range-regexp form)
|
|
|
(> (length (match-string 0 form)) 1))
|
|
|
(save-match-data
|