使用`org-map-entries'的`with-temp-file'的行为

时间:2013-12-11 18:18:47

标签: emacs elisp org-mode

(2012-12-12:编辑以澄清问题

  • 添加了症状描述
  • 澄清了第一段代码中temp-file的变量定义)

我正在努力让这段代码正常运行。我们的想法是将org-map-entries应用于由“with-temp-file”创建的新文件,并仍在“with-temp-file sexp:

(let ((temp-file (expand-file-name "test-tmp-sandbox.org" dir)))
  (with-temp-file temp-file
    (insert-file (expand-file-name "my-org-file.org" dir))
    (org-mode)
    (org-map-entries '(org-entry-put nil "MY-READ-ONLY" ?t) t 'file)))

它不起作用。

  • 没有崩溃:好的
  • 创建并填充临时文件:确定
  • 当我手动打开文件时,文件处于组织模式,组织标题正常
  • 但是我要用org-map-entries映射的函数org-entry-put不适用,好像没有org-entries,实际上有几个可能是(org-mode)未应用

我有以下解决方法:

(let ((temp-file (expand-file-name "test-tmp-sandbox.org" dir)))
  (with-temp-file temp-file
    (insert-file (expand-file-name "my-org-file.org" dir)))
  (find-file temp-file)
  (org-map-entries '(org-entry-put nil "MY-READ-ONLY" ?t) t 'file)
  )

其中:

  • 填写文件:确定
  • 完成映射:确定
  • 但很尴尬!

知道第一段代码出了什么问题吗?

1 个答案:

答案 0 :(得分:1)

  1. 你没有说“什么不行”。总是描述症状:你的期望与你实际看到的一样。

  2. 将您的代码包裹在(macroexpand '...)中,您将看到错误:temp-file未定义。

  3.  (let
         ((temp-file temp-file) ; TEMP-FILE on the right is undefined 
          (temp-buffer
           (get-buffer-create
            (generate-new-buffer-name " *temp file*"))))
       (unwind-protect
           (prog1
               (with-current-buffer temp-buffer
                 (insert-file
                  (expand-file-name "my-org-file.org" dir))
                 (org-mode)
                 (org-map-entries
                  '(org-entry-put nil "MY-READ-ONLY" 116)
                  t 'file))
             (with-current-buffer temp-buffer
               (write-region nil nil temp-file nil 0)))
         (and
          (buffer-name temp-buffer)
          (kill-buffer temp-buffer))))
    

    <强>更新

    不查看org-map-entries是什么或做什么(没时间;抱歉),我建议:with-temp-file在完成之前不会写文件。如果org-map-entries期望文件已经存在(即写入),那么这就解释了为什么你的第一个代码无法工作。

    再次,如果我所说的还不够,那么查看org-map-entries真正做到和期望的内容可能会让你更接近一个好的答案。