3

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

[2011-06-23 星期四]

一些文字

[2011-06-22 周三]

还有一些文字

[... 12MB 文本稍后...]

[2000-01-01 星期六]

第一个条目

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

像现在这样,我无法使用,因为加载文档需要一分钟多的时间。

4

4 回答 4

3

对于 12MB 的文本,这必须是大量的日期条目标题,所以我想缓冲区缩小可能仍然是一个不错的方法。

我是一个 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)
于 2011-06-24T14:30:02.637 回答
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

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

于 2011-06-23T15:30:05.417 回答
2

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

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

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

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

于 2011-06-23T19:12:09.003 回答
1

你有三个选择:

  1. 为所有较旧的条目设置VISIBILITY属性。folded您可以使用C-c a < a将议程限制为当前文件,然后标记条目并设置上述属性。
  2. 将较旧的日记帐分录移动到带有C-c C-x A.
  3. 将较旧的条目存档到带有C-c C-x C-s.
于 2011-07-21T14:32:31.823 回答