forked from VincentToups/emacs-utils
-
Notifications
You must be signed in to change notification settings - Fork 0
/
virtues.el
122 lines (98 loc) · 2.9 KB
/
virtues.el
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
(require 'defn)
(require 'org)
(defvar all-virtues (reverse (list
"humility"
"chastity"
"tranquility"
"cleanliness"
"moderation"
"justice"
"sincerity"
"industry"
"frugality"
"resolution"
"order"
"silence"
"temperance")))
(defn default-virtue-sums []
(loop with sums = (tbl!)
for v in
(list
"humility"
"chastity"
"tranquility"
"cleanliness"
"moderation"
"justice"
"sincerity"
"industry"
"frugality"
"resolution"
"order"
"silence"
"temperance")
do
(tbl! sums v 0)
(tbl! sums (concat v "-count") 0)
finally
(return sums)))
(defn chomp-properties [str]
(chomp (substring-no-properties str)))
(defn slurp-virtue-file
([filename sums]
(dlet [buf (find-file-noselect filename)]
(with-current-buffer buf
(loop for i from 2 to 14 do
(goto-line i)
(dlet [virtue (chomp-properties (org-table-get-field 1))
score (string-to-number (chomp-properties (org-table-get-field 2)))]
(tbl! sums virtue (+ score (tbl sums virtue)))
(tbl! sums (concat virtue "-count") (+ 1 (tbl sums (concat virtue "-count")))))))
(kill-buffer buf)
sums))
([filename]
(slurp-virtue-file filename (default-virtue-sums))))
(defn average-score [sums virtue]
(round (/ (float (tbl sums virtue))
(float (tbl sums (concat virtue "-count"))))))
(defn average-scores [sums]
(loop with averages = (tbl!)
for key in all-virtues do
(tbl! averages key (average-score sums key))
finally (return averages)))
;(keyshash sums)
; (setq sums (slurp-virtue-file "/home/toups/Dropbox/gtd/virtues/07_14_2009.org"))
; (average-scores sums)
(defn n-spaces [n]
(make-string n (car (coerce " " 'list))))
(defn print-virtue-table [averages]
(let* ((max-len (apply #'max (mapcar #'length all-virtues)))
(padded-virtues (mapcar
(fn [v] (concat v (n-spaces (- max-len (length v))) ": "))
all-virtues)))
(loop for vp in padded-virtues
and
virt in all-virtues do
(insertf "%s %s\n" vp (make-string (tbl averages virt) ?*)))))
(defvar *virtues-directory* "~/Dropbox/gtd/virtues")
(defn org-file? [filename]
(dlet [len (length filename)]
(if ($ len < 4) nil
(dlet [last-four (substring-no-properties filename (- len 4) len)]
(string= last-four ".org")))))
(defn get-files []
(mapcar (fn [f] (concat *virtues-directory* "/" f)) (filter #'org-file? (directory-files *virtues-directory*))))
(defn find-averages-from-all-files []
(dlet [files (get-files)
sums (foldl (fn [it ac]
(slurp-virtue-file it ac))
(slurp-virtue-file (car files))
(cdr files))]
(average-scores sums)))
(defun show-averages-buffer ()
(interactive)
(dlet [b (get-buffer-create "*virtues-average-buffer*")]
(with-current-buffer b
(clear-buffer)
(print-virtue-table (find-averages-from-all-files)))))
(provide 'virtues)