【问题标题】:how can I collapse all entries older than 3 months in my emacs org-mode journal file?如何折叠我的 emacs org-mode 日志文件中超过 3 个月的所有条目?
【发布时间】:2011-09-21 00:25:32
【问题描述】:

我有一个大型日志文件,其中包含如下日期条目:

[2011-06-23 星期四] 一些文字 [2011-06-22 周三] 还有一些文字 [... 12MB 文本稍后...] [2000-01-01 星期六] 第一个条目

我希望能够配置 org-mode 以便只有最近 3 个月可见,而较旧的条目会折叠,并且仅在需要时展开。有没有办法自动设置,以便每个新的一天都让 3 个月 + 1 天的条目下一次折叠?

就目前而言,我无法使用,因为加载文档需要一分钟多的时间。

【问题讨论】:

  • 我可以使用稀疏树搜索非常接近。 C-c / m 用于匹配搜索,Match: TIMESTAMP>"<-3m>" 作为搜索表达式。但在我的测试中,这只会匹配包含 TODO 关键字的条目。解决了最后一个问题后,可以将搜索分配给键绑定或挂钩,这样您就不需要每次都键入它。

标签: emacs org-mode journal


【解决方案1】:

对于 12MB 的文本,这肯定是大量的日期条目标题,所以我想缓冲区缩小可能 still 是一个不错的选择。

我是一个 org-mode 新手,所以我可能错过了一种更简单的方法来实现这一点,但以下内容会自动将缓冲区缩小到自当前日期前三个月以来所做的条目。

(defvar my-org-journal "/path/to/file.org")

(add-hook 'org-mode-hook 'my-org-mode-hook)
(defun my-org-mode-hook ()
  (when (equal (expand-file-name (buffer-file-name))
               (expand-file-name my-org-journal))
    (my-org-narrow-to-month-of-entries)))

(defun my-org-narrow-to-month-of-entries ()
  "Narrow buffer to entries within the last three months."
  (interactive)
  (let ((minimum-date
         (with-temp-buffer
           (progn
             (org-insert-time-stamp (current-time) nil t)
             (org-timestamp-change -3 'month)
             (buffer-substring-no-properties
              (point-min) (point-max))))))
    (save-excursion
      (while (search-forward-regexp org-tsr-regexp-both nil t)
        (let ((end (point)))
          (backward-sexp)
          (let ((datestamp (buffer-substring-no-properties (point) end)))
            (if (string< datestamp minimum-date)
                (narrow-to-region (point-min) (point))
              (forward-sexp))))))))

当然,C-xnw 再次扩大缓冲区以查看所有条目。

如果您想基于局部变量而不是文件名应用此方法,则可以改用此方法:

(defvar my-org-narrow-to-month-of-entries nil)

(add-hook 'org-mode-hook 'my-org-mode-hook)
(defun my-org-mode-hook ()
  (add-hook 'hack-local-variables-hook
            (lambda () (when my-org-narrow-to-month-of-entries
                         (my-org-narrow-to-month-of-entries)))
            nil t))

在文件末尾添加以下内容:

;;; Local Variables:
;;; my-org-narrow-to-month-of-entries: t
;;; End:

参考资料:

编辑:

老实说,我不确定这是否会对这么长的加载时间产生任何影响。类似大小的示例 org 文件在我的机器上加载并不需要很长时间,但我不知道这是由于更好的硬件,还是我的简单虚拟文件更容易处理。

如果上述方法没有改善,我们可以考虑在 org-mode 初始化之前进行缩小,看看是否有什么不同?

以下方法可能不是最好的方法,但出于性能原因应该值得尝试,以防万一它有所作为。

这将代替 org-mode-hook,并使用 my-org-journal 变量作为文件名,就像上面的第一个示例一样。

(defadvice insert-file-contents (after my-insert-file-contents)
  (when (equal (expand-file-name (buffer-file-name))
               (expand-file-name my-org-journal))
    (require 'org)
    (my-org-narrow-to-month-of-entries)))
(ad-activate 'insert-file-contents)

【讨论】:

    【解决方案2】:

    使用C-[ 创建议程视图,然后使用C-u 90 C-c a a 查看每日/每周议程。您可以自定义它并将其绑定到某些东西,请参阅http://www.gnu.org/software/emacs/manual/html_node/org/Custom-agenda-views.html#Custom-agenda-views

    [编辑] 实际上,这并不能回答有关折叠旧条目的问题,但确实允许您仅查看相关条目。

    【讨论】:

      【解决方案3】:

      我没有完全自动化的方式来完成您的要求。我确信有一些 elisp/org-mode 印章的人可以自动化它。

      以下是一些可能有帮助的组织模式功能:

      • 您可以使用存档标签(通过 C-c C-x a)标记标题,这样可以防止它们在循环可见性时扩展。请参阅org-mode manual on Archiving。我认为这可以实现您想要的可见性。
      • 正如@Juancho 评论的那样,您可以搜索与表达式匹配的时间戳。这会生成一个匹配列表,您可以在其中轻松编写键盘宏以将每个匹配标记为存档。这是Advanced searches in org-mode 上的一个很好的文档。

      在我的系统上尝试此操作时发现的一个烦恼是搜索结果以所有标题级别的平面列表结束。我组织条目的方式,最好将搜索限制在顶级标题(这就是我在日记中用于日常条目的方式)。我相信您可以通过设置一些属性来解决它,或者 org-mode 可以过滤特定级别的搜索。

      【讨论】:

        【解决方案4】:

        您有三个选择:

        1. 将所有旧条目的VISIBILITY 属性设置为folded。你 可以使用 C-c a 将议程限制在当前文件中 然后标记条目并设置上述属性 en 群众。
        2. 使用 C-c C-x A 将较旧的日记条目移动到“归档兄弟”。
        3. 使用 C-c C-x C-s 将旧条目存档到存档文件。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-09-21
          • 1970-01-01
          • 2015-10-05
          • 1970-01-01
          相关资源
          最近更新 更多