2016-04-22 2 views
4

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

+1

Почему бы не играть с 'орг-рода-entries' и отсортировать его в по-разному каждый раз в зависимости от вашего настроения? 'Mx describe-function RET org-sort-entries RET' – lawlist

+0

@lawlist Я использую« контексты »из GTD для отображения различных повесток дня для разных ситуаций, но у меня есть одна основная повестка дня, которую я использую наиболее часто, независимо от контекста, и это тот список, который я хотел рандомизировать. Кроме того, я не даю много мета атрибутов для записей TODO, поэтому многие опции из 'org-sor-entries' на самом деле не работают для меня. –

+0

В нижней части doc-строки говорится об использовании опций для '? F' и'? F' - то есть вы можете написать свои собственные функции сортировки (например, рандомизировать) и включить их в функциональность 'org -sort-entries'. Возможно, кто-то напишет это, если вам нужна помощь, и вы можете всегда предлагать щедрость через несколько дней, если никто не ответил. – lawlist

ответ

2

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

(defun org-sort-entries-randomly() 
    (interactive) 
    (if (org-at-heading-p) 
     (progn 
     (setq start (point)) 
     (org-end-of-subtree) 
     (while (> (point) start) 
     (if (org-at-heading-p) 
      (org-set-property "sort-key" (format "%d" (+ 10000 (random 10000))))) 
     (previous-line)) 
     (org-sort-entries nil ?r nil nil "sort-key") 
     (goto-char start) 
     (org-end-of-subtree) 
     (while (> (point) start) 
     (if (org-at-heading-p) 
      (org-delete-property "sort-key" "PROPERTIES")) 
     (previous-line))) 
    (message "Not at heading"))) 
2

Как уже упоминалось org-sort позволяет вам определить функцию для сортировки:

Если SORTING-TYPE является F или F, то GETKEY-FUNC определяет функцию быть называется с точкой? в начале записи. Он должен возвращать либо строку, либо номер, который должен служить ключом сортировки для этой записи.

Как это происходит random - это функция, которая возвращает случайное число. Таким образом, M-x org-sort f random будет рандомизировать порядок сортировки в файле org.

Однако вместо того, чтобы изменять файл, вы можете использовать org-agenda, чтобы просмотреть тодо в рандомизированном порядке. Установив org-agenda-cmp-user-defined, вы можете настроить порядок сортировки. Эта функция будет принимать два аргумента (элементы повестки дня для сравнения) и должна возвращать -1,1 или 0 в зависимости от того, какая из записей «меньше». Вот такая функция:

(defun org-random-cmp (a b) 
    "Return -1,0 or 1 randomly" 
    (- (mod (random) 3) 1)) 

А вот повестки дня, что показывает все элементы TODO в случайном порядке:

(add-to-list 'org-agenda-custom-commands 
    '("r" "All todo items in a random order" 
    alltodo "" 
    ((org-agenda-cmp-user-defined #'org-random-cmp)))) 
+0

Для правильной сортировки функция сортировки должна возвращать тот же результат при сравнении двух объектов. Если вы производите его, сортировка никогда не закончится. – justinhj

+0

Hm. Не могли бы вы подтвердить, что это работает? Кажется, он не меняет порядок на моем. Функция 'org-random-cmp' работает, как предполагалось. Кроме того, предполагается ли это рандомизировать порядок каждый раз, когда вы открываете орг-повестку? –

+0

Вы имеете в виду функцию «org-sort» или вид повестки дня? Оба работают для меня. Представление повестки дня предназначено для рандомизации при каждом открытии повестки дня. – erikstokes

Смежные вопросы