Implement a simpler way to specify faces for tags and todo keywords

This is a patch by Ryan Thompson, extended by Carsten Dominik.
This commit is contained in:
Carsten Dominik 2009-09-04 11:28:10 +02:00
parent 8bb1c06a3a
commit 6fbdb8074e
6 changed files with 94 additions and 29 deletions

View File

@ -1,3 +1,8 @@
2010-02-25 Carsten Dominik <carsten.dominik@gmail.com>
* org.texi (Faces for TODO keywords, Faces for TODO keywords)
(Priorities): Document the easy colors.
2010-02-19 Carsten Dominik <carsten.dominik@gmail.com> 2010-02-19 Carsten Dominik <carsten.dominik@gmail.com>
* org.texi (Visibility cycling): Document the new double prefix * org.texi (Visibility cycling): Document the new double prefix

View File

@ -3454,15 +3454,16 @@ special faces for some of them. This can be done using the variable
@lisp @lisp
@group @group
(setq org-todo-keyword-faces (setq org-todo-keyword-faces
'(("TODO" . org-warning) '(("TODO" . org-warning) ("STARTED" . "yellow")
("DEFERRED" . shadow) ("CANCELED" . (:foreground "blue" :weight bold))))
("CANCELED" . (:foreground "blue" :weight bold))))
@end group @end group
@end lisp @end lisp
While using a list with face properties as shown for CANCELED While using a list with face properties as shown for CANCELED @emph{should}
@emph{should} work, this does not aways seem to be the case. If work, this does not aways seem to be the case. If necessary, define a
necessary, define a special face and use that. special face and use that. A string is interpreted as a color. The variable
@code{org-faces-easy-properties} determines if that color is interpreted as a
foreground or a background color.
@node TODO dependencies, , Faces for TODO keywords, TODO extensions @node TODO dependencies, , Faces for TODO keywords, TODO extensions
@subsection TODO dependencies @subsection TODO dependencies
@ -3767,11 +3768,13 @@ this
@end example @end example
@noindent @noindent
@vindex org-priority-faces
By default, Org mode supports three priorities: @samp{A}, @samp{B}, and By default, Org mode supports three priorities: @samp{A}, @samp{B}, and
@samp{C}. @samp{A} is the highest priority. An entry without a cookie @samp{C}. @samp{A} is the highest priority. An entry without a cookie is
is treated as priority @samp{B}. Priorities make a difference only in treated as priority @samp{B}. Priorities make a difference only in the
the agenda (@pxref{Weekly/daily agenda}); outside the agenda, they have agenda (@pxref{Weekly/daily agenda}); outside the agenda, they have no
no inherent meaning to Org mode. inherent meaning to Org mode. The cookies can be highlighted with special
faces by customizing the variable @code{org-priority-faces}.
Priorities can be attached to any outline tree entries; they do not need Priorities can be attached to any outline tree entries; they do not need
to be TODO items. to be TODO items.

View File

@ -1,7 +1,16 @@
2010-02-25 Carsten Dominik <carsten.dominik@gmail.com> 2010-02-25 Carsten Dominik <carsten.dominik@gmail.com>
* org.el (org-face-from-face-or-color): New function.
(org-get-todo-face, org-font-lock-add-priority-faces)
(org-get-tag-face): Use `org-face-from-face-or-color'.
* org-faces.el (org-todo-keyword-faces, org-priority-faces): Allow
simple colors as values.
(org-faces-easy-properties): New option.
* org-agenda.el (org-agenda-set-mode-name): Show if the agenda is * org-agenda.el (org-agenda-set-mode-name): Show if the agenda is
restricted, as an agenda mode. restricted, as an agenda mode.
(org-agenda-fontify-priorities): Allow simple colors as values.
2010-02-25 Bastien Guerry <bzg@altern.org> 2010-02-25 Bastien Guerry <bzg@altern.org>

View File

@ -1349,8 +1349,10 @@ cookies, not the entire task.
This may also be an association list of priority faces, whose This may also be an association list of priority faces, whose
keys are the character values of `org-highest-priority', keys are the character values of `org-highest-priority',
`org-default-priority', and `org-lowest-priority' (the default values `org-default-priority', and `org-lowest-priority' (the default values
are ?A, ?B, and ?C, respectively). The face may be a named face, are ?A, ?B, and ?C, respectively). The face may be a named face, a
or a list like `(:background \"Red\")'." color as a string, or a list like `(:background \"Red\")'.
If it is a color, the variable `org-faces-easy-properties'
determines if it is a foreground or a background color."
:group 'org-agenda-line-format :group 'org-agenda-line-format
:type '(choice :type '(choice
(const :tag "Never" nil) (const :tag "Never" nil)
@ -1358,7 +1360,9 @@ or a list like `(:background \"Red\")'."
(const :tag "Cookies only" cookies) (const :tag "Cookies only" cookies)
(repeat :tag "Specify" (repeat :tag "Specify"
(list (character :tag "Priority" :value ?A) (list (character :tag "Priority" :value ?A)
(sexp :tag "face"))))) (choice :tag "Face "
(string :tag "Color")
(sexp :tag "Face"))))))
(defgroup org-agenda-column-view nil (defgroup org-agenda-column-view nil
"Options concerning column view in the agenda." "Options concerning column view in the agenda."
@ -2790,9 +2794,13 @@ bind it in the options section.")
ov (org-make-overlay b e)) ov (org-make-overlay b e))
(org-overlay-put (org-overlay-put
ov 'face ov 'face
(cond ((cdr (assoc p org-priority-faces))) (cond ((org-face-from-face-or-color
'priority nil
(cdr (assoc p org-priority-faces))))
((and (listp org-agenda-fontify-priorities) ((and (listp org-agenda-fontify-priorities)
(cdr (assoc p org-agenda-fontify-priorities)))) (org-face-from-face-or-color
'priority nil
(cdr (assoc p org-agenda-fontify-priorities)))))
((equal p l) 'italic) ((equal p l) 'italic)
((equal p h) 'bold))) ((equal p h) 'bold)))
(org-overlay-put ov 'org-type 'org-priority))))) (org-overlay-put ov 'org-type 'org-priority)))))

View File

@ -338,29 +338,53 @@ This face is only used if `org-fontify-done-headline' is set. If applies
to the part of the headline after the DONE keyword." to the part of the headline after the DONE keyword."
:group 'org-faces) :group 'org-faces)
(defcustom org-faces-easy-properties
'((todo . :foreground) (tag . :foreground) (priority . :foreground))
"The property changes by easy faces.
This is an alist, the keys show the area of application, the values
can be `:foreground' or `:background'. A color string for special
keywords will then be interpreted as either foreground or background
color."
:group 'org-faces
:group 'org-todo
:type '(repeat
(cons (choice (const todo) (const tag) (const priority))
(choice (const :foreground) (const :background)))))
(defcustom org-todo-keyword-faces nil (defcustom org-todo-keyword-faces nil
"Faces for specific TODO keywords. "Faces for specific TODO keywords.
This is a list of cons cells, with TODO keywords in the car This is a list of cons cells, with TODO keywords in the car
and faces in the cdr. The face can be a symbol, or a property and faces in the cdr. The face can be a symbol, a color
list of attributes, like (:foreground \"blue\" :weight bold :underline t)." as a string (in which case the rest is inherited from the `org-todo' face),
or a property list of attributes, like
(:foreground \"blue\" :weight bold :underline t).
If it is a color string, the variable `org-faces-easy-properties'
determines if it is a foreground or a background color."
:group 'org-faces :group 'org-faces
:group 'org-todo :group 'org-todo
:type '(repeat :type '(repeat
(cons (cons
(string :tag "keyword") (string :tag "Keyword")
(sexp :tag "face")))) (choice :tag "Face "
(string :tag "Color")
(sexp :tag "Face")))))
(defcustom org-priority-faces nil (defcustom org-priority-faces nil
"Faces for specific Priorities. "Faces for specific Priorities.
This is a list of cons cells, with priority character in the car This is a list of cons cells, with priority character in the car
and faces in the cdr. The face can be a symbol, or a property and faces in the cdr. The face can be a symbol, a color as
list of attributes, like (:foreground \"blue\" :weight bold :underline t)." as a string, or a property list of attributes, like
(:foreground \"blue\" :weight bold :underline t).
If it is a color string, the variable `org-faces-easy-properties'
determines if it is a foreground or a background color."
:group 'org-faces :group 'org-faces
:group 'org-todo :group 'org-todo
:type '(repeat :type '(repeat
(cons (cons
(character :tag "Priority") (character :tag "Priority")
(sexp :tag "face")))) (choice :tag "Face "
(string :tag "Color")
(sexp :tag "Face")))))
(defvar org-tags-special-faces-re nil) (defvar org-tags-special-faces-re nil)
(defun org-set-tag-faces (var value) (defun org-set-tag-faces (var value)
@ -386,7 +410,8 @@ list of attributes, like (:foreground \"blue\" :weight bold :underline t)."
(defcustom org-tag-faces nil (defcustom org-tag-faces nil
"Faces for specific tags. "Faces for specific tags.
This is a list of cons cells, with tags in the car and faces in the cdr. This is a list of cons cells, with tags in the car and faces in the cdr.
The face can be a symbol, or a property list of attributes, The face can be a symbol, a foreground color (in which case the rest is
inherited from the `org-tag' face) or a property list of attributes,
like (:foreground \"blue\" :weight bold :underline t). like (:foreground \"blue\" :weight bold :underline t).
If you set this variable through customize, it will immediately be effective If you set this variable through customize, it will immediately be effective
in new buffers and in modified lines. in new buffers and in modified lines.
@ -397,8 +422,10 @@ changes."
:set 'org-set-tag-faces :set 'org-set-tag-faces
:type '(repeat :type '(repeat
(cons (cons
(string :tag "Tag") (string :tag "Tag ")
(sexp :tag "Face")))) (choice :tag "Face"
(string :tag "Foreground color")
(sexp :tag "Face")))))
(defface org-table ;; originally copied from font-lock-function-name-face (defface org-table ;; originally copied from font-lock-function-name-face
(org-compatible-face nil (org-compatible-face nil

View File

@ -5060,10 +5060,20 @@ For plain list items, if they are matched by `outline-regexp', this returns
"Get the right face for a TODO keyword KWD. "Get the right face for a TODO keyword KWD.
If KWD is a number, get the corresponding match group." If KWD is a number, get the corresponding match group."
(if (numberp kwd) (setq kwd (match-string kwd))) (if (numberp kwd) (setq kwd (match-string kwd)))
(or (cdr (assoc kwd org-todo-keyword-faces)) (or (org-face-from-face-or-color
'todo 'org-todo (cdr (assoc kwd org-todo-keyword-faces)))
(and (member kwd org-done-keywords) 'org-done) (and (member kwd org-done-keywords) 'org-done)
'org-todo)) 'org-todo))
(defun org-face-from-face-or-color (context inherit face-or-color)
"Create a face list that inherits INHERIT, but sets the foreground color.
When FACE-OR-COLOR is not a string, just return it."
(if (stringp face-or-color)
(list :inherit inherit
(cdr (assoc context org-faces-easy-properties))
face-or-color)
face-or-color))
(defun org-font-lock-add-tag-faces (limit) (defun org-font-lock-add-tag-faces (limit)
"Add the special tag faces." "Add the special tag faces."
(when (and org-tag-faces org-tags-special-faces-re) (when (and org-tag-faces org-tags-special-faces-re)
@ -5078,8 +5088,10 @@ If KWD is a number, get the corresponding match group."
(while (re-search-forward "\\[#\\([A-Z0-9]\\)\\]" limit t) (while (re-search-forward "\\[#\\([A-Z0-9]\\)\\]" limit t)
(add-text-properties (add-text-properties
(match-beginning 0) (match-end 0) (match-beginning 0) (match-end 0)
(list 'face (or (cdr (assoc (char-after (match-beginning 1)) (list 'face (or (org-face-from-face-or-color
org-priority-faces)) 'priority 'org-special-keyword
(cdr (assoc (char-after (match-beginning 1))
org-priority-faces)))
'org-special-keyword) 'org-special-keyword)
'font-lock-fontified t)))) 'font-lock-fontified t))))
@ -5087,7 +5099,8 @@ If KWD is a number, get the corresponding match group."
"Get the right face for a TODO keyword KWD. "Get the right face for a TODO keyword KWD.
If KWD is a number, get the corresponding match group." If KWD is a number, get the corresponding match group."
(if (numberp kwd) (setq kwd (match-string kwd))) (if (numberp kwd) (setq kwd (match-string kwd)))
(or (cdr (assoc kwd org-tag-faces)) (or (org-face-from-face-or-color
'tag 'org-tag (cdr (assoc kwd org-tag-faces)))
'org-tag)) 'org-tag))
(defun org-unfontify-region (beg end &optional maybe_loudly) (defun org-unfontify-region (beg end &optional maybe_loudly)