【发布时间】:2014-09-24 14:39:33
【问题描述】:
我对 elisp 很陌生,我正在尝试调整一些现有代码。
在循环表(由 orgmode 函数 org-clock-get-table-data 生成)时,我尝试以下操作:
((equal column "Project") (insert (cdr row)))
它在 Messages 缓冲区中产生以下内容:
cond: Wrong type argument: char-or-string-p, (#("Verify CalTime accruals for vacation/sick" 0 41
(fontified t org-category #("Admin" 0 5 (fontified t org-category "Admin" org-category-position 32
line-prefix nil wrap-prefix nil ...)) org-category-position 32 line-prefix #("*" 0 1 (face org-
hide)) wrap-prefix #(" " 0 4 (face org-indent)) ...)) nil 30 (("wps" . "Administration")))
我要插入的值是“管理”,所以我试试这个
((equal column "Project") (insert (nth 4 row)))
在小缓冲区中产生以下内容
Wrong type argument, char-or-string-p, (("wps" . "Administration"))
谁能告诉我如何插入字符串“Administration”?
编辑
感谢韦斯和德鲁:
(cdar row)
执行上述操作会产生我之前在 Messages 缓冲区中看到的复杂列表的第一个元素:
Verify CalTime accruals for vaction/sick
row 似乎是一个复杂的列表列表:
((equal column "Project") (insert (car row))); yeilds ^B
((equal column "Project") (insert (cdr row)))
yields:
cond: Wrong type argument: char-or-string-p, (#("Verify CalTime accruals for vacation/sick" 0 41
(fontified t org-category #("Admin" 0 5 (fontified t org-category "Admin" org-category-position 32
line-prefix nil wrap-prefix nil ...)) org-category-position 32 line-prefix #("*" 0 1 (face org-
hide)) wrap-prefix #(" " 0 4 (face org-indent)) ...)) nil 30 (("wps" . "Administration")))
我认为上面输出中的每个“#”都代表一个列表项。 (nth 4 row) 给出上面显示的错误输出的事实支持了这一点,并表明这样的事情可能会起作用:
((equal column "Project") (insert (nth 2 (nth 4 row))))
;yeilds wrong type argument, char-or-string-p, nil
所以我可能需要使用一些函数来解码第 4 个列表项......
第 4 个元素是 orgmode 属性,它已分配给我们正在解析的行上的时钟表条目。这个属性列表在我的 .emacs 中定义:
(setq org-global-properties
;; WPS = Web Platform Services. Time tracking for Google Sheet begun with CalTime Migration
'(("wps_ALL".
"Administration
ASG-Consulting
Chanc-Office-Website
")))
【问题讨论】:
-
令人困惑的是,在您的一个 sn-ps 中以
#("开头的 Emacs Lisp 语法实际上 不 表示一个列表,而是一个具有文本属性的字符串。有关其工作原理的详细信息,请参阅 Emacs Lisp 手册中的 Info 节点“Text Props and Strings”。 -
为了拆分更复杂的列表结构,我发现
cl-destructuring-bind和pcase宏非常有用。 (后者仅存在于 Emacs 24 中)。两者都允许您通过写下其结构的一种模板来提取列表的一部分,因此代码的形状类似于您要查找的数据的形状。 -
超级有用!谢谢@Jon O。我正在努力学习这些功能。
-
感谢 Lisp 人!所有这些信息都很有帮助。我选择@Phils 答案是因为
(assoc)是解决方案的关键。对于背景,我正在调整org-clocktable-write-default以展平数据,以便可以将其导入(CSV)到谷歌表格。 Here's the key line in the diff 包含(assoc)。org-clocktable-write-default给出了答案。 More code here 有帮助。