14

アジェンダがビューを構築するときにタグをフィルタリングすることは可能ですか?私は仕事関連の予定だけを表示するために以下を試しました:

("j" "Jobb"
   ((agenda ""
       ((org-agenda-skip-function '(org-agenda-skip-entry-if 'notregexp":jobb:"))))
    (tags-todo "jobb"))
    ((org-agenda-compact-blocks nil)))

これは、実際の予定が直接タグ付けされている場合にのみ機能しますが、予定が次のように親の見出しからタグを継承している場合は機能しません。

 * Tider                                                              :jobb:                                                                                                                                                         
 ** Millas arbetstider                                                                                                                                                                                                               
   <2012-04-11 ons 05:00-09:00>                                                                                                                                                                                                     
   <2012-04-12 tor 04:15-08:30>                                                                                                                                                                                                     
   <2012-04-13 fre 14:30-18:30>                           

タグを継承する予定が表示されるようにこれを行う別の方法はありますか?

4

3 に答える 3

15

問題は、とのorg-agenda-skip-entries-if相互作用にあり'notregexpます。に一致しないエントリはスキップされます:jobb:。後のエントリはタグを継承しますが、明示的にリストされていないため、スキップされます。また、を使用してタグを照合する(または照合しない)組み込みのメソッドはないようですorg-agenda-skip-entries-if。そのような機能があれば、タグを探すのに効率的な方法かもしれませんが、私はそのような機能を知りません。

代わりに、目的の検索形式を提供するカスタム関数を作成する必要があります。

アジェンダコマンドを次のように変更した場合:

("j" "Jobb"
         ((agenda ""
                  ((org-agenda-skip-function '(zin/org-agenda-skip-tag "jobb" 't))))
          (tags-todo "jobb"))
         ((org-agenda-compact-blocks nil)))

そして次のように定義zin/org-agenda-skip-tagします:

(defun zin/org-agenda-skip-tag (tag &optional others)
  "Skip all entries that correspond to TAG.

If OTHERS is true, skip all entries that do not correspond to TAG."
  (let ((next-headline (save-excursion (or (outline-next-heading) (point-max))))
        (current-headline (or (and (org-at-heading-p)
                                   (point))
                              (save-excursion (org-back-to-heading)))))
    (if others
        (if (not (member tag (org-get-tags-at current-headline)))
            next-headline
          nil)
      (if (member tag (org-get-tags-at current-headline))
          next-headline
        nil))))

あなたは私があなたの望む議題の見方であると理解しているものを手に入れるでしょう。私がそれを逆に持っていて、次の3日間のエントリが存在しないはずの場合は、関数を(zin/org-agenda-skip-tag "jobb")またはに変更するだけ(zin/org-agenda-skip-tag "jobb" 'nil)です。この場合、これらは同等です。

アジェンダビュー

この場合test-new、私が使用していたorg-fileの名前ですが、無視してかまいません。TODOまた、議題を1つのファイルのみに制限していたため、関数をテストするときに両方の見出しが表示されるように設定しました。

Week-agenda (W15):
Monday      9 April 2012 W15
Tuesday    10 April 2012
Wednesday  11 April 2012
  test-new:    5:00- 9:00 TODO Millas arbetstider                        :jobb::
Thursday   12 April 2012
  test-new:    4:15- 8:30 TODO Millas arbetstider                        :jobb::
Friday     13 April 2012
  test-new:   14:30-18:30 TODO Millas arbetstider                        :jobb::
Saturday   14 April 2012
Sunday     15 April 2012

================================================================================
Headlines with TAGS match: jobb
  test-new:   TODO Tider                                                  :jobb:
  test-new:   TODO Millas arbetstider                                    :jobb::
于 2012-04-10T15:08:15.547 に答える
4

ジョナサンの回答の関数を数か月間使用してこの種のブロックごとのフィルタリングを行った後、より高度なクエリ(他のブロックタイプで使用される一致文字列など)を処理できるものが必要であることに気付きました。 d将来この質問に出くわした人のために、ここに投稿してください。

編集:の元の実装my/org-match-at-point-pは現在やや時代遅れです。Orgモードのソースが字句スコープになり、のコントラクトが変更されますorg-make-tags-matcher。以前は、todotags-list変数はへの呼び出しを中心に動的にスコープする必要がありましたがorg-make-tags-matcher、現在は呼び出しから返された関数に渡されているようです。(そうです!これはとても良いです!)私は新しいバージョンに一致するように以下のコードを適応させましたが、私はもうOrgモードをあまり使用していないので、それは軽くテストされただけです。

(defun my/org-match-at-point-p (match)
  "Return non-nil if headline at point matches MATCH.
Here MATCH is a match string of the same format used by
`org-tags-view'."
  (funcall (cdr (org-make-tags-matcher match))
           (org-get-todo-state)
           (org-get-tags-at)
           (org-reduced-level (org-current-level))))

(defun my/org-agenda-skip-without-match (match)
  "Skip current headline unless it matches MATCH.

Return nil if headline containing point matches MATCH (which
should be a match string of the same format used by
`org-tags-view').  If headline does not match, return the
position of the next headline in current buffer.

Intended for use with `org-agenda-skip-function', where this will
skip exactly those headlines that do not match." 
  (save-excursion
    (unless (org-at-heading-p) (org-back-to-heading)) 
    (let ((next-headline (save-excursion
                           (or (outline-next-heading) (point-max)))))
      (if (my/org-match-at-point-p match) nil next-headline))))

古いバージョンのOrgモードをまだ使用している場合は、元のコードを次に示します。このバージョンは、my/org-match-at-point-p定義されているファイルが字句スコープであると想定していることに注意してください。my/defun-dynそうでない場合は、マクロを単純なに安全に置き換えることができますdefun

(defmacro my/defun-dyn (&rest def)
  "As `defun', but always in dynamic scope.
A function defined in this way ignores the value of
`lexical-binding' and treats it as if it were nil.

\(fn NAME ARGLIST &optional DOCSTRING DECL &rest BODY)"
  (declare (debug defun)
           (indent defun)
           (doc-string 3))
  `(eval '(defun ,@def) nil))

(my/defun-dyn my/org-match-at-point-p (match &optional todo-only)
  "Return non-nil if headline at point matches MATCH.
Here MATCH is a match string of the same format used by
`org-tags-view'.

If the optional argument TODO-ONLY is non-nil, do not declare a
match unless headline at point is a todo item."
  (let ((todo      (org-get-todo-state))
        (tags-list (org-get-tags-at)))
    (eval (cdr (org-make-tags-matcher match)))))
于 2015-10-30T20:56:43.377 に答える
-1

アジェンダビューで「/」を押すと、アジェンダディスパッチャをフィルタリングできます。

"/" =すべてのアジェンダファイル、さらにorg-agenda-text-search-extra-filesにリストされているファイルで正規表現を検索します。これは、Emacsコマンドを複数回使用します。プレフィックス引数を使用して、一致するたびにコンテキスト行の数を指定できます。

于 2020-06-12T15:50:28.773 に答える