我正在使用这种创建列的方法:
http://orgmode.org/worg/org-tutorials/org-spreadsheet-lisp-formulas.html
我有一个包含9列的电子表格,第8列包含其中包含美元符号的文件名,例如:
product_name $500.00.jpg
所以我希望第9列说明文件是否确实存在,所以我的组织TBLFM如下:
#+TBLFM: $9='(file-exists-p (concat "/import/" $8))
所以问题是,无论我是否在TBLFM末尾使用;L
标志,在应用公式时我立即得到“无效字段说明符:”$ 500“”因为没有列编号为500
有关如何使其正常工作的任何想法?我试过8美元的引号而不是引号,有和没有文字标志,我试图在实际的列中逃避美元符号都没有运气。
修改:请务必注意,将列值更改为:product_name $\ 500.00.jpg
确实有效,但返回的file-exists-p
值显然不正确。
编辑:触发错误的示例组织模式表:
| foo | bar | /some/file with $500 in it.jpg | | baz |
| | | | | |
#+TBLFM: $4='(or (file-exists-p $3) "f")
答案 0 :(得分:2)
这是Org代码的一部分,它处理公式的这种情况:
;; Insert the references to fields in same row
(while (string-match "\\$\\(\\([-+]\\)?[0-9]+\\)" form)
(setq n (+ (string-to-number (match-string 1 form))
(if (match-end 2) n0 0))
x (nth (1- (if (= n 0) n0 (max n 1))) fields))
(unless x (error "Invalid field specifier \"%s\""
(match-string 0 form)))
(setq form (replace-match
(save-match-data
(org-table-make-reference x nil numbers lispp))
t t form)))
如您所见,您无法回避这一点,但是,您可以修补该地点附近的org-table-eval-formula
以允许您使用某种转义序列来插入字面符号,我可以得到到目前为止:
;; Insert the references to fields in same row
(while (string-match "\\(^\\|[^\\$]\\)\\$\\(\\([-+]\\)?[0-9]+\\)" form)
(setq n (+ (string-to-number (match-string 2 form))
(if (match-end 3) n0 0))
x (nth (1- (if (= n 0) n0 (max n 1))) fields))
(unless x (error "Invalid field specifier \"%s\""
(match-string 0 form)))
(setq form (replace-match
(save-match-data
(org-table-make-reference x nil numbers lispp))
t t form)))
这将跳过$$
,不幸的是,这个函数递归调用自己直到所有$
被替换(我不知道)。您可以在以后做什么:在eLisp代码中用单个替换双重符号...这在我的情况下起作用:
| foo | bar | /some/file with $$500 in it.jpg | f | /some/file with $500 in it.jpg |
| | | | t | |
#+TBLFM: $4='(or (file-exists-p $3) "f")::$5='(format "%s" (replace-regexp-in-string "\\$\\$" "$" $3))
答案 1 :(得分:0)
尝试使用$ char转义$ 8,即$ 8.