조직 : 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 내부의 항목을 우선 순위별로 정렬하고 싶습니다. ( '노력'을 기준으로 추가 정렬하는 것이 좋을 것입니다).

그리고 현재 기본 제목을 클릭하고 우선 순위 또는 할일 키워드별로 아이를 정렬 할 수 있지만 둘다는 아닙니다.

정렬 전략처럼 둘 다에 의한 정렬이 가능합니까?


현재 두 가지 제목이 있습니다

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

그러나이 접근법의 문제점은 작업을 완료 할 때 끊임없이 작업을 섞어 야한다는 것입니다.

[편집]
이것은 내가 필요로하는 그의 대답을 이해할 수 없다는 점을 제외 하면 이것 과 비슷 합니다.


1
이 기능 org-sort-entries은 모든 소제목의 주 제목에 작용하거나 선택한 지역에있는 항목을 정렬 할 수 있습니다. 선택할 수있는 대화식 옵션이 있습니다. 프로그래밍 방식으로 사용할 수도 있으며 여러 가지 정렬이 가능합니다. 나는 종종 a, o, p, t를 사용합니다 (다음 4 가지 정렬 기준을 달성하기 위해 다음에 하나씩). 예를 들어, 알파벳순, 할일 키워드, 우선 순위, 시간순으로 모든 것을 정렬 할 수 있습니다.
— lawlist

안녕하세요, 하위 작업을 정렬하는 org-sort-entries 옵션을 알고 있습니다. 더 잘 반영하기 위해 질문을 업데이트했습니다. 당신의 의견에 감사드립니다.
— Leo Ufimtsev

다음은 프로그래밍 방식으로 조직 모드 버퍼를 정렬하는 자세한 방법에 대한 링크입니다. stackoverflow.com/a/22232709/2112489
— lawlist

내 질문에 이미이 링크가 있습니다. 위의 내용은 누군가의 특정 요구에 맞게 조정되었습니다. 보다 일반적인 목적 / 쉬운 접근이 있습니까?
— Leo Ufimtsev

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 속성에 대한 문자열을 가져 오기만하면됩니다. 트릭은 org-todo-keywords알파벳순이 아닌 의 위치에 따라 TODO 속성을 정렬하려는 것 입니다.

(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-entriesTODO 키워드를 기준으로 정렬하고 org-default-priority우선 순위가 지정되지 않은 경우를 사용하여 우선 순위 와의 관계를 끊습니다 . TODO 키워드가 1000 개를 초과하면 중단됩니다. 그렇게하지 않는 것이 좋습니다.


세상에, 스크립트 주셔서 감사합니다. 문제 : 대시를 설치했습니다. 그런 다음 스크립트를 시도했지만 오류가 발생합니다. 기호 정의가 무효입니다 : todo-to-int. .emacs 파일 어딘가에 해당 기능이 있지만 위의 포함을 잊어 버린 것 같습니까? 아니면 오타?
— 레오 Ufimtsev

todo-to-int답변에 붙여 넣은 후 키워드를 정수로 변환하는 기능을 변경했습니다 . 이제 수정되었습니다.
— erikstokes

1
이제 모든 것이 작동합니다. 친구, 모든 노력에 감사드립니다 :-D.
— 레오 Ufimtsev

1
NB : 더 이상 docs에 따라 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))))))

로 현재 파일로 제한하십시오 <. 정렬 된보기에서 완료를 표시하고 보관할 수 있습니다.


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

작업 A가 B보다 중요한지 묻는 메시지를 표시하여 정렬 병합 알고리즘을 사용하고 정렬 된 목록을 작성합니다.


이것이하는 일, 특히 다른 답변과 다른 점에 대한 설명을 추가 할 수 있습니까?
— 앤드류 스완

작업 A가 B보다 중요한지 사용자에게 묻고 정렬 목록을 작성하여 정렬 병합 알고리즘을 사용합니다.
— 펠리페
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.