组织表格式与美元符号列

时间:2013-06-23 17:17:26

标签: emacs elisp org-mode

我正在使用这种创建列的方法:
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")

2 个答案:

答案 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.