我有一个大的日记账文件,里面有这样的日期条目:
【2011-06-23周四】一些文本〔2011-06-22周三〕更多文本[…12MB的文本稍后…][2000-01-01周六]第一个条目
我希望能够配置组织模式,这样只有最后3个月可见,而旧的条目会被折叠,并且只有在需要时才会展开。有没有一种方法可以自动设置,这样每新一天都会让3个月+1天的条目下次被折叠?
现在,我无法使用它,因为加载文档需要一分钟以上的时间。
对于12MB的文本,一定有大量的日期条目标题,所以我认为缩小缓冲区可能仍然是一个不错的方法。
我是一个组织模式的新手,所以我可能错过了一个更简单的方法来实现这一点,但以下内容将自动将缓冲区缩小到当前日期前三个月以来的条目。
(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:
参考文献:
- 如何在主模式挂钩中访问目录本地变量
- 如何根据文件位置运行挂钩
编辑:
老实说,我不确定这对这么长的加载时间是否有帮助。类似大小的样本组织文件在我的机器上加载不会花那么长时间,但我不知道这是因为更好的硬件,还是因为我的简单伪文件更容易处理。
如果以上没有改善,我们可以考虑在初始化组织模式之前进行缩小,看看这是否有什么不同?
以下方法可能不是最好的方法,但出于性能原因,应该值得尝试,以防产生影响。
这将取代组织模式挂钩,并使用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)
使用C-[
创建一个议程视图,然后使用C-u 90 C-c a a
查看每日/每周议程。你可以自定义它并将其绑定到某个东西上,请参阅http://www.gnu.org/software/emacs/manual/html_node/org/Custom-agenda-views.html#Custom-议程观点。
[EDIT]实际上,这并不能回答折叠旧条目的问题,但确实允许您仅查看相关条目。
我没有一种完全自动化的方法来完成您的要求。我相信有一些elisp/org模式的人才可以自动化它
以下是一些可能有所帮助的组织模式功能:
- 您可以使用Archive标签标记标题(通过C-C C-x a),这样可以防止它们在循环可见性时扩展。请参阅关于归档的组织模式手册。我认为这达到了你想要的可见性
- 正如@Juancho评论的那样,你可以搜索与表达式匹配的时间戳。这会生成一个匹配列表,您可以在其中轻松编写键盘宏,将每个匹配标记为存档。这是一份关于组织模式下高级搜索的好文档
当我在我的系统上尝试这个时,我发现一个烦恼是搜索结果是所有标题级别的平面列表。在我组织条目的方式中,最好将搜索限制在顶级标题(这是我在日记中用于日常条目的内容)。我相信你可以通过设置一些属性来解决这个问题,或者组织模式可以在特定级别过滤搜索。
您有三个选项:
- 将所有较旧条目的
VISIBILITY
属性设置为folded
。你可以使用C-C a<a以将议程限制在当前文件中然后标记条目并设置上述属性en集体 - 使用C-C C-x A将较旧的日记条目移动到"归档同级"
- 使用C-C C-x C-s将旧条目归档到归档文件中