从emacs组织模式表中提取字段值

从emacs组织模式表中提取字段值,emacs,org-mode,Emacs,Org Mode,分隔符:我不熟悉emacs。 我试图创建一个函数,它遍历一个org表,提取特定的值,并对它们进行一些运算。这个算法与我的问题无关,但我很难将字段值放入整数或浮点数列表中 例如,函数 (defun print-field-value() (interactive) (setq list '()) (unless (org-table-p) (error "Not in an org-table")) (goto-char (org-table-begin)) (org-tabl

分隔符:我不熟悉emacs。 我试图创建一个函数,它遍历一个org表,提取特定的值,并对它们进行一些运算。这个算法与我的问题无关,但我很难将字段值放入整数或浮点数列表中

例如,函数

(defun print-field-value()
  (interactive)
  (setq list '())
  (unless (org-table-p) (error "Not in an org-table"))
  (goto-char (org-table-begin))
  (org-table-next-field)
  (while (org-table-p)
  (add-to-list 'list (save-excursion (org-table-get-field 1)))
  (forward-line))
  (print list)
)
在表上执行时

|  7 |  8 |  9 | 10 | 11 | -12 |
| 78 | 46 | 00 | 36 | 64 |  98 |
产生输出

(#(" 78 " 0 4 (fontified t face org-table)) #("  7 " 0 4 (fontified t face org-table)))
我想向社区提出两个问题: 1.我的列表中的这些元素是什么?(什么类型的对象或那些) 2.有没有一种方法可以将整数放入一个列表中,这样我就可以轻松地对值执行一些算术运算

理想情况下,我正在寻找一种简单的方法来实现这一点,而无需使用另一个函数来对上述函数返回的内容进行分组并提取整数。我的直觉(可能有缺陷)是,应该有一个更简单的方法来做到这一点。我说的对吗?

#(“78”04(fontified t face org table))
是一个字符串,在C中只需注意
“78”
。接下来,您不需要打印来返回结果:在代码中放置
list
而不是
print list
就足够了

如果您想在emacs中发现任何模式,请使用它的所有函数都具有相同前缀的事实。在这里,运行
description function
org table-
并按TAB键两次,以获取在org tables上工作的所有函数的列表。然后,您将看到有前途的函数
org table analyze
,并阅读其文档。通过这种方式,您可能会得出以下结论:

(defun get-field-values ()
  (unless (org-table-p) (error "Not in an org-table"))
  (org-table-analyze)
  (mapcar
   (lambda (i)
     (mapcar (lambda (j) (string-to-number (org-table-get i j)))
         (number-sequence 1 org-table-current-ncol)))
   (number-sequence 1 (1- (length org-table-dlines)))))

它将为您提供字段矩阵,作为数字列表。请注意,此函数不是交互式的,您可以使用
M-:

运行它。按照指示,我将“打印列表”更改为“列表”,但在我的机器上,在我的示例中,当我在表中调用此函数时,此更改不会产生任何输出。知道为什么吗?我会用M-:输出,但不是用M-x。这就是打印和返回之间的区别(如在C、java或其他编程语言中)。您是否尝试获取字段值?您必须使用M-:运行这些函数,您将在其中键入用括号括起来的名称。例如(获取字段值),当我尝试获取字段值时,什么都没有发生。我想我可能夸大了我对lisp/emacs的了解程度。我在#+begin_src elisp之间定义了上述函数#+组织文档中的end_src块。我在定义的末尾使用C-C-C进行编译。然后我将光标移动到同一组织文件中的一个表中,并使用我的(原始)函数键入M-x打印字段值,输出消息缓冲区中的原始字符串。当你提到M-:,我(可能是愚蠢的)认为这意味着在表格中使用M-:而不是M-x。所以我只使用了括号,你的函数工作得很好,非常感谢你的建议,我相信这是一个noobie提示。