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内の項目を優先度でソートします。(その後、「Effort」でさらにソートするとよいでしょう)。

そして、私は現在、メインの見出しをクリックして、優先順位またはtodoキーワードのいずれかで既に子を並べ替えることができますが、両方ではありません。

sort-strategyのように両方でソートできますか?


現在、2つの見出しがあります

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

しかし、このアプローチの問題は、タスクを完了するときにタスクを常にシャッフルする必要があることです。

[編集]
これは、これに似ていますが、彼の答えを理解できなかったので、それを私のニーズに転送できませんでしたか?


1
この関数org-sort-entriesは、すべてのサブヘッダーのメインヘッダーに作用するか、選択した領域にあるものをソートできます。インタラクティブなオプションから選択できます。プログラムで使用することもでき、いくつかの並べ替えが可能です-私はしばしばa、o、p、t(4段階の並べ替え基準を達成するために次々に)を使用します。たとえば、すべてを最初にアルファベット順、次にtodoキーワード、次に優先度、次に時間順に並べ替えることができます。
ローリスト

こんにちは、子タスクをソートするorg-sort-entriesオプションを知っています。それをよりよく反映するように質問を更新しました。コメントありがとうございます。
レオUfimtsev

ここでORGモードをプログラムバッファソーティングのための詳細なアプローチへのリンクである: 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プロパティの文字列を取得することだけです。秘Theは、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-entriesTODOキーワードでソートし、PRIORITYとの関係を解除します(org-default-priority優先順位が指定されていない場合に使用します)。1000個を超えるTODOキーワードがある場合、これは中断します。これは、それを行わない正当な理由です。


Omg、スクリプトをありがとう。問題:ダッシュをインストールしました。その後、スクリプトを試しましたが、エラーが発生しています:シンボル定義は無効です:todo-to-int。.emacsファイルのどこかにその関数があると思いますが、上記に含めるのを忘れましたか?または多分タイプミス?
レオUfimtsev

todo-to-int回答に貼り付けた後、キーワードをintに変換する関数を変更しました。現在修正されています。
エリクスト

1
これですべて動作します。よろしくお願いします、ありがとうございました:-D。
レオUfimtsev

1
注: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))))))

で現在のファイルに制限します<。ソートされたビューから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

タスクAがBよりも重要かどうかをユーザーに尋ねることにより、マージソートアルゴを使用し、ソートされたリストを作成します。


これが何をするのか、特にそれが他の回答とどのように異なるのかについての説明を追加できますか。
アンドリュースワン

タスクAがBよりも重要かどうかをユーザーに尋ねることにより、マージソートアルゴを使用し、ソートされたリストを作成します。
フェリペ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.