как можно свернуть все записи старше 3 месяцев в моем файле журнала emacs org-mode? - PullRequest
3 голосов
/ 23 июня 2011

У меня есть большой файл журнала с такими записями даты:

[2011-06-23 Thu]

some text

[2011-06-22 Wed]

some more text

[... 12MB of text later ...]

[2000-01-01 Sat]

first entry

Я хотел бы иметь возможность настроить режим org, чтобы были видны только последние 3 месяца, тогда как более старые записи свернуты и расширяются только тогда, когда мне это нужно. Есть ли способ настроить это так, чтобы каждый новый день приводил к сворачиванию записи в 3 месяца и 1 день в следующий раз?

Как сейчас, я не могу его использовать, потому что загрузка документа занимает больше минуты.

Ответы [ 4 ]

3 голосов
/ 24 июня 2011

С 12 МБ текста, это должно быть огромное количество заголовков ввода даты, поэтому я мог бы предположить, что сужение буфера может все же быть хорошим способом.

Яновичок в режиме орг, поэтому я могу упустить более простой способ добиться этого, но следующее автоматически сузит буфер до записей, сделанных за три месяца до текущей даты.

(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))))))))

И,конечно, Cx n w , чтобы снова расширить буфер, чтобы увидеть все записи.

Если вы хотите применить это на основеЛокальная переменная, а не по имени файла, вы можете использовать этот подход вместо этого:

(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:

Ссылки:

edit:

Я не уверен, если это будет что-то делать с этим долгим временем загрузки, если честно.Пример файла орга сравнимого размера не требует удаленной загрузки на моем компьютере, но я не знаю, связано ли это с улучшением оборудования или с упрощением обработки моего простого фиктивного файла.

ЕслиВышесказанное не улучшает ситуацию, мы могли бы взглянуть на то, как сужение произойдет до инициализации режима org, и посмотреть, имеет ли это какое-то значение?

Следующее может быть не лучшим способом сделать это, ноСтоит попробовать по соображениям производительности, на всякий случай, если это что-то изменит.

Это будет вместо 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 голосов
/ 23 июня 2011

У меня нет полностью автоматизированного способа сделать то, что вы просите.Я уверен, что кто-то с некоторыми изменениями в режиме elisp / org может автоматизировать это.

Вот некоторые функции режима org, которые могут помочь:

  • Вы можете пометить заголовки тегом Archive (через Cc Cx a ), и это предотвращает ихот расширения, когда вы переключаете видимость.См. Руководство по org-режиму по Архивированию .Я думаю, что достигается то, что вы хотите в плане видимости.
  • Как прокомментировал @Juancho, вы можете искать метки времени, соответствующие выражению.Это создает список совпадений, где вы можете легко написать клавиатурный макрос, чтобы пометить каждый как архив.Вот хороший документ по Расширенному поиску в режиме org .

Одна неприятность, которую я обнаружил при попытке сделать это в моей системе, заключается в том, что в результате поиска появился плоский список всех уровней заголовков.При организации записей лучше ограничить поиск заголовками верхнего уровня (это то, что я использую для ежедневных записей в моем журнале).Я уверен, что вы можете обойти это, установив какое-то свойство, или, возможно, режим org может фильтровать поиски на определенном уровне.

2 голосов
/ 23 июня 2011

Создайте представление повестки дня с помощью 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.

[EDIT] На самом деле, это не отвечает на вопрос о свертывании старых записей, но позволяет просматривать только соответствующие записи.

1 голос
/ 21 июля 2011

У вас есть три варианта:

  1. установите для свойства VISIBILITY значение folded для всех более старых записей. Вы можно использовать C-c a , чтобы ограничить повестку дня текущим файлом с последующей маркировкой записей и установкой вышеуказанного свойства en массово.
  2. Переместите более старые записи в журнале в «Архивный брат» с помощью C-c C-x A .
  3. Архивировать старые записи в архивный файл с помощью C-c C-x C-s .
...