如何折叠emacs组织模式日志文件中所有超过3个月的条目



我有一个大的日记账文件,里面有这样的日期条目:

【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评论的那样,你可以搜索与表达式匹配的时间戳。这会生成一个匹配列表,您可以在其中轻松编写键盘宏,将每个匹配标记为存档。这是一份关于组织模式下高级搜索的好文档

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

您有三个选项:

  1. 将所有较旧条目的VISIBILITY属性设置为folded。你可以使用C-C a<a以将议程限制在当前文件中然后标记条目并设置上述属性en集体
  2. 使用C-C C-x A将较旧的日记条目移动到"归档同级"
  3. 使用C-C C-x C-s将旧条目归档到归档文件中

相关内容

  • 没有找到相关文章

最新更新