aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar Tom Willemse2020-01-13 22:51:39 -0800
committerGravatar Tom Willemse2020-01-13 22:51:39 -0800
commitabf97c386a8d554c517d7d5e327c06666ba1b372 (patch)
tree33d5277689352ecda83df8119b0af8ace5f2be52
parent214eb3508189ac346ce2389d4e2a1e939cfa1e75 (diff)
downloademacs-config-abf97c386a8d554c517d7d5e327c06666ba1b372.tar.gz
emacs-config-abf97c386a8d554c517d7d5e327c06666ba1b372.zip
Generate different colors for TODO keywords and tags
-rw-r--r--.gitlab-ci.yml6
-rw-r--r--oni-org/oni-org.el35
-rw-r--r--test/oni-org-test.el18
3 files changed, 58 insertions, 1 deletions
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 03abb7f..1025948 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -181,6 +181,12 @@ unit-test-oni-highlight-indent-guides:
- package
script: make unit-test-oni-highlight-indent-guides TEST_ARCHIVE=$(realpath bin/)
+unit-test-oni-org:
+ stage: unit-test
+ dependencies:
+ - package
+ script: make unit-test-oni-org TEST_ARCHIVE=$(realpath bin/)
+
unit-test-oni-php:
stage: unit-test
dependencies:
diff --git a/oni-org/oni-org.el b/oni-org/oni-org.el
index 71df80e..55b8217 100644
--- a/oni-org/oni-org.el
+++ b/oni-org/oni-org.el
@@ -4,7 +4,7 @@
;; Author: Tom Willemse <tom@ryuslash.org>
;; Keywords: local
-;; Version: 2020.0108.161333
+;; Version: 2020.0113.225010
;; Package-Requires: (oni-yasnippet org-plus-contrib org-bullets hydra org-wild-notifier)
;; This program is free software; you can redistribute it and/or modify
@@ -130,6 +130,37 @@ After running it once remove it from `org-capture-after-finalize-hook'."
(interactive)
(find-file (oni-org-expand-to-home "documents/gtd/index.org")))
+(defun oni-org-color-for (object)
+ "Generate a hex color by taking the first 6 characters of OBJECT’s MD5 sum."
+ (format "#%s" (substring (md5 object) 0 6)))
+
+(defun oni-org-generate-todo-keyword-faces ()
+ "Create faces for all todo keywords in the current buffer."
+ (when-let ((keywords (cl-remove-if (lambda (tag) (assoc tag org-todo-keyword-faces))
+ org-todo-keywords-1)))
+ (append org-todo-keyword-faces
+ (mapcar (lambda (keyword) (cons keyword (oni-org-color-for keyword)))
+ keywords))))
+
+(defun oni-org-generate-tag-faces ()
+ "Create faces for all the tags in the current buffer."
+ (when-let ((tags (cl-remove-if (lambda (tag) (assoc (car tag) org-tag-faces))
+ (org-get-buffer-tags))))
+ (append org-tag-faces
+ (mapcar (lambda (tag)
+ (let ((tag (car tag)))
+ (cons tag (oni-org-color-for tag))))
+ tags))))
+
+(defun oni-org-set-todo-keyword-faces ()
+ "Set ‘org-todo-keyword-faces’ to all different colors."
+ (setq org-todo-keyword-faces (oni-org-generate-todo-keyword-faces)))
+
+(defun oni-org-set-tag-faces ()
+ "Set ‘org-tag-faces’ to all different colors."
+ (setq org-tag-faces (oni-org-generate-tag-faces))
+ (org-set-tag-faces 'org-tag-faces org-tag-faces))
+
;;;###autoload(autoload 'oni-hydra-org/body "oni-org")
(defhydra oni-hydra-org (:color blue)
"Org"
@@ -203,6 +234,8 @@ After running it once remove it from `org-capture-after-finalize-hook'."
(add-hook 'org-mode-hook 'auto-fill-mode)
(add-hook 'org-mode-hook 'flyspell-mode)
+(add-hook 'org-mode-hook #'oni-org-set-todo-keyword-faces)
+(add-hook 'org-mode-hook #'oni-org-set-tag-faces)
(unless (eq system-type 'windows-nt)
(require 'org-bullets)
diff --git a/test/oni-org-test.el b/test/oni-org-test.el
new file mode 100644
index 0000000..dfaf11a
--- /dev/null
+++ b/test/oni-org-test.el
@@ -0,0 +1,18 @@
+(ert-deftest oni-org-test-color-for ()
+ "Test that ‘oni-org-color-for’ returns a hex color name."
+ (should (string= "#acbd18" (oni-org-color-for "foo"))))
+
+(ert-deftest oni-org-test-generate-todo-keyword-faces ()
+ "Test that ‘oni-org-generate-todo-keyword-faces’ returns a list of colors."
+ (let ((org-todo-keywords-1 '("foo" "bar")))
+ (should (equal (oni-org-generate-todo-keyword-faces)
+ '(("foo" . "#acbd18")
+ ("bar" . "#37b51d"))))))
+
+(ert-deftest oni-org-test-generate-tag-faces ()
+ "Test that ‘oni-org-generate-tag-faces’ returns a list of colors."
+ (cl-letf (((symbol-function 'org-get-buffer-tags)
+ (lambda () '(("foo") ("bar")))))
+ (should (equal (oni-org-generate-tag-faces)
+ '(("foo" . "#acbd18")
+ ("bar" . "#37b51d"))))))