org: Як сортувати заголовки за TODO, а потім за пріоритетом?


24

У мене часто є такий список:

* Main heading
** TODO [#A] Make world better
** TODO [#B] Make Emacs better 
** TODO [#B] Customize emacs 
** DONE [#C] some task
** TODO [#A] Launch rocket to mars

Спочатку я хотів би відсортувати його відповідно до завдань "TODO". Потім елементи всередині відсортованого TODO я б хотів сортувати за пріоритетом. (було б непогано далі сортувати за "Зусиллями").

І я маю на увазі, що зараз я можу натиснути на основний заголовок і сортувати дітей уже за пріоритетом або за ключовим словом todo, але не за обома.

Чи можливе сортування за обома можливими на зразок стратегії сортування?


На даний момент у мене є два заголовки

* Tasks
** TODO [#A] meh
** TODO [#B] meh2
* Completed.
** DONE [#B] meh3.

Але проблема такого підходу полягає в тому, що мені доводиться постійно перемішувати завдання, коли я їх виконую.

[EDIT]
Це щось подібне до цього, за винятком того, що я не міг осмислити його відповідь, щоб передати його на мої потреби?


1
Функція org-sort-entriesабо буде діяти на основний заголовок для всіх підзаголовків, або може сортувати те, що знаходиться у вибраному регіоні. Є інтерактивні варіанти для вибору. Ви також можете його програмно використовувати, і можливі кілька видів - я часто використовую a, o, p, t (один за наступним, щоб виконати 4 рівні критеріїв сортування). Наприклад, ви можете сортувати все спочатку за алфавітом, потім за ключовими словами todo, потім за пріоритетом, а потім за часом.
законник

Здрастуйте, я знаю варіант org-sort-entries для сортування дочірніх завдань. Я оновив питання, щоб краще відобразити це. Дякую за Ваш коментар
Лев Уфімцев,

Ось посилання на детальний підхід для сортування буфера орг-режимі програмно: stackoverflow.com/a/22232709/2112489
lawlist

Я вже маю це посилання у своєму питанні. Сказане вище якось підлаштоване під чиїсь конкретні потреби. Чи є більш загальний мета / простіший підхід?
Лев Уфімцев

1
@LeoUfimtsev Спробуйте встановити org-refile-targetsщось подібне (setq org-refile-targets '((nil . (:maxlevel . 6)))). Це дозволить org-modeпоказувати заголовки на глибині до 6 при заправці. Ви можете перевірити документацію для org-refile-targetsотримання додаткової інформації.
itsjeyd

Відповіді:


19

Було б чудово, якби щось із org-agenda-sorting-stratagyцим працювало org-sort-entries, але, схоже, цього не буде. Ми можемо підробити це, оскільки org-sort-entriesможемо взяти аргумент, вказуючи функцію, що присвоює (рядок чи номер) ключ кожному заголовку, який буде використовуватися для сортування записів при ?fнаданні типу сортування. Все, що нам потрібно зробити, - це отримати рядок для властивостей TODO та PRIORITY. Хитрість полягає в тому, що ми хочемо сортувати властивість TODO за його положенням org-todo-keywords, а не за алфавітом.

(require 'cl)
(require 'dash)

(defun todo-to-int (todo)
    (first (-non-nil
            (mapcar (lambda (keywords)
                      (let ((todo-seq
                             (-map (lambda (x) (first (split-string  x "(")))
                                   (rest keywords)))) 
                        (cl-position-if (lambda (x) (string= x todo)) todo-seq)))
                    org-todo-keywords))))

(defun my/org-sort-key ()
  (let* ((todo-max (apply #'max (mapcar #'length org-todo-keywords)))
         (todo (org-entry-get (point) "TODO"))
         (todo-int (if todo (todo-to-int todo) todo-max))
         (priority (org-entry-get (point) "PRIORITY"))
         (priority-int (if priority (string-to-char priority) org-default-priority)))
    (format "%03d %03d" todo-int priority-int)
    ))

(defun my/org-sort-entries ()
  (interactive)
  (org-sort-entries nil ?f #'my/org-sort-key))

M-x my/org-sort-entriesбуде сортувати за ключовим словом TODO та розірвати зв'язки з PRIORITY (використовуючи, org-default-priorityколи пріоритет не вказаний). Це зламається, якщо у вас більше 1000 ключових слів TODO, що є вагомою причиною цього не робити.


Омг, дякую за сценарій. Проблема: я встановив тире. Потім спробував сценарій, але я отримую помилку: визначення символу недійсне: todo-to-int. Я здогадуюсь, у вас є ця функція десь у вашому файлі .emacs, але забули включити у вищезазначене? а може, якийсь друкарський помилок?
Лев Уфімцев

Я змінив функцію, яка перетворює ключове слово на int, todo-to-intпісля того як я вставив свою відповідь. Це зараз виправлено.
erikstokes

1
Зараз все працює. Чувак, дякую за всі ваші зусилля, дуже високо оцінений :-D.
Лев Уфімцев

1
NB: Більше не рекомендується використовувати cl згідно з документами .
cammil

1

Додайте у файл наступне:

#+ARCHIVE: :: * Completed.

І перемішування стає архівуванням

Замість того, щоб сортувати записи, як щодо відсортованого виду?

(setq org-agenda-custom-commands
      '(("cx" "TODOs sorted by state, priority, effort"
         todo "*"
         ((org-agenda-overriding-header "\nTODOs sorted by state, priority, effort")
          (org-agenda-sorting-strategy '(todo-state-down priority-down effort-up))))))

Обмежте його поточним файлом за допомогою <. Ви можете відзначити «DONE» та архівувати їх у сортованому вікні.


1

Ви також можете визначити org-agenda-cmp-user-definedфункцію та додати її до org-agenda-sorting-strategy. Це я створив як приклад.

(setq org-todo-sort-order '("WAIT" "TODO" "DOING" "CANCELED" "DONE"))

(defun my:user-todo-sort (a b)
  "Sort todo based on which I want to see first"
  (when-let ((state-a (get-text-property 14 'todo-state a))
             (state-b (get-text-property 14 'todo-state b))
             (cmp (--map (cl-position-if (lambda (x)
                                           (equal x it))
                                         org-todo-sort-order)
                         (list state-a state-b))))
    (cond ((apply '> cmp) 1)
          ((apply '< cmp) -1)
          (t nil))))
(setq org-agenda-cmp-user-defined 'my:user-todo-sort)

1

Ви можете використовувати цю створену мною бібліотеку: https://github.com/felipelalli/org-sort-tasks

Він використовує Algo Merge Sort, запитуючи користувача, чи завдання A важливіше B, а потім створює відсортований список.


Чи можете ви додати деякий опис того, що це робить, і зокрема, чим він відрізняється від інших відповідей.
Ендрю Сванн

Він використовує Alge Merge Sort, запитуючи користувача, чи завдання A важливіше B, а потім створити відсортований список.
Феліпе
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.