조직 : 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.