Org-mode архивирует весь файл, если все TODO СДЕЛАНЫ - PullRequest
0 голосов
/ 15 сентября 2018

Хотя я видел много SO вопросов относительно архивирования поддеревьев, я использую org-journal для создания ежедневного файла каждый день с шаблоном (например, 2018-09-14.org), который затем записываю задачи в предварительном порядке.шаблон для личного, рабочего или что вы проходите через различные состояния, пока они не будут закончены DONE или отменены KILL (я считаю, что этот подход работает для меня, поскольку он также позволяет мне визуально увидеть в виде повестки дня, какС тех пор, как началось выполнение задачи, долго).

Я пытаюсь написать интерактивную функцию, которая:

  1. обрабатывает список всех моих файлов повестки дня .org и
  2. , если он обнаруживает все TODO s и DONE или KILL в файле (или их нет),
  3. предлагает мне y, n, пропустить, чтобы переместить весь файл вего whatever.org_archive

(начинающий видеть замедления с 5-месячным построением повестки дня при использовании режима org).

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

=== Месяц спустя === Ну, самообучение немного помогло, но сейчас я нахожусь в точке, где работают 3 независимые функции,но по какой-то причине я получаю сообщение об ошибке при вызове последней функции.

Тем не менее, я получаю сообщение об ошибке в строке 28 с недопустимой функцией: при вызове rename-file-buffer-to-org-archive.Если кто-то может увидеть, в чем проблема, это решает мой вариант использования (и, возможно, кто-то другой, именно поэтому я вставил его сюда).

(defun archive-done-org-journal-files ()
"Cycles all org files through checking function."
(interactive) 
(save-excursion
(mapc 'check-org-file-finito (directory-files "~/Desktop/test_archives/" t ".org$"))
))

(defun check-org-file-finito (f)
"Checks TODO keyword items are DONE then archives."
(interactive)
(find-file f)
;; Shows open Todo items whether agenda or todo
(let (
  (kwd-re
    (cond (org-not-done-regexp)
      (
       (let ((kwd
          (completing-read "Keyword (or KWD1|KWD2|...): "
                 (mapcar #'list org-todo-keywords-1))))
       (concat "\\("
           (mapconcat 'identity (org-split-string kwd "|") "\\|")
           "\\)\\>")))
    ((<= (prefix-numeric-value) (length org-todo-keywords-1))
     (regexp-quote (nth (1- (prefix-numeric-value))
                org-todo-keywords-1)))
    (t (user-error "Invalid prefix argument: %s")))))
 (if (= (org-occur (concat "^" org-outline-regexp " *" kwd-re )) 0)
 ((rename-file-buffer-to-org-archive)
  (kill-buffer (current-buffer)))
   (kill-buffer (current-buffer))
   )))

(defun rename-file-buffer-to-org-archive ()
"Renames current buffer and file it's visiting."
(interactive)
(let ((name (buffer-name))
    (filename (buffer-file-name))
)
(if (not (and filename (file-exists-p filename)))
    (error "Buffer '%s' is not visiting a file!" name)
  (let ((new-name (concat (file-name-sans-extension filename) ".org_archive")))
    (if (get-buffer new-name)
        (error "A buffer named '%s' already exists!" new-name)
      (rename-file filename new-name 1)
      (rename-buffer new-name)
      (set-visited-file-name new-name)
      (set-buffer-modified-p nil)
      (message "File '%s' successfully archived as '%s'."
               name (file-name-nondirectory new-name)))))))

1 Ответ

0 голосов
/ 27 октября 2018

Итак, в конце концов, так я и решил.Я уверен, что здесь есть оптимизация и рефакторинг, но это определенно работает и является достаточно модульным, если вам нужно это выяснить.Просто измените каталог, который вы используете (мой находится в Dropbox) для ваших org-файлов в архиве done-org-journal-files, и это должно работать для вас.Я настоятельно рекомендую проверить это в тестовом архиве в соответствии с каталогом ~/Desktop/test_archives/ в соответствии с действительной функцией, чтобы вы могли убедиться, что он работает так, как объявлено.YMMV.Надеюсь, это кому-нибудь поможет!

(defun archive-done-org-journal-files ()
"Cycles all org files through checking function."
(interactive) 
(save-excursion
(mapc 'check-org-file-finito (directory-files "~/Desktop/test_archives/" t ".org$"))
))

(defun check-org-file-finito (f)
"Checks TODO keyword items are DONE then archives."
(interactive)
(find-file f)
;; Shows open Todo items whether agenda or todo
(let (
(kwd-re
  (cond (org-not-done-regexp)
    (
     (let ((kwd
        (completing-read "Keyword (or KWD1|KWD2|...): "
                 (mapcar #'list org-todo-keywords-1))))
       (concat "\\("
           (mapconcat 'identity (org-split-string kwd "|") "\\|")
           "\\)\\>")))
    ((<= (prefix-numeric-value) (length org-todo-keywords-1))
     (regexp-quote (nth (1- (prefix-numeric-value))
                org-todo-keywords-1)))
    (t (user-error "Invalid prefix argument: %s")))))
 (if (= (org-occur (concat "^" org-outline-regexp " *" kwd-re )) 0)
 (rename-file-buffer-to-org-archive)
     (kill-buffer (current-buffer))
   )))

(defun rename-file-buffer-to-org-archive ()
"Renames current buffer and file it's visiting."
(interactive)
(let ((name (buffer-name))
    (filename (buffer-file-name))
)
(if (not (and filename (file-exists-p filename)))
    (error "Buffer '%s' is not visiting a file!" name)
  (let ((new-name (concat (file-name-sans-extension filename) ".org_archive")))
    (if (get-buffer new-name)
        (error "A buffer named '%s' already exists!" new-name)
      (rename-file filename new-name 1)
      (rename-buffer new-name)
      (set-visited-file-name new-name)
      (set-buffer-modified-p nil)
  (kill-buffer (current-buffer))
  (message "File '%s' successfully archived as '%s'."
               name (file-name-nondirectory new-name)))))))
...