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
117
118
119
120
121
122
123
124
125
126
127
128
|
#!/bin/bash
_todo_files=(".todo.md" ".org.md", "TODO")
_todo_file=""
has_todo_file() {
cwd=`pwd`
for f in ${_todo_files[@]}; do
[[ -f "$cwd/$f" ]] && _todo_file="$cwd/$f" && return 0
done
return 1
}
print_org() {
awk '
function filename() {
n = split(FILENAME, a, "/")
return a[n]
}
function res() {
return "\033[0;10m"
}
function bold(s) {
return "" s res()
}
function red(s) {
"tput setaf 1" | getline redc;
return redc s res()
}
function green(s) {
"tput setaf 2" | getline greenc;
return greenc s res()
}
function blue(s) {
"tput setaf 5" | getline bluec;
return bluec s res()
}
function magenta(s) {
"tput setaf 191" | getline magc;
return magc s res()
}
{
if ($1 ~ /^#+/)
block=$0
if ($1 ~ /^.*(-|*)/) {
// support TODO files
if (filename() == "TODO") {
$0 = gensub(/(^[\w]*(-|*))/, "\\1 TODO", "1", $0)
}
match($0, /\s(TODO|WIP|WAITING|DONE|\?\?\?)\s/, arr)
if (arr[1] != "") {
tasks[block][arr[1]][i++]=$0
}
}
}
END {
for (b in tasks) {
print b
for (status in tasks[b]) {
for (t in tasks[b][status]) {
txt = tasks[b][status][t]
txt = gensub(/(TODO)/, red("\\1"), "1", txt)
txt = gensub(/(WIP)/, blue("\\1"), "1", txt)
txt = gensub(/(DONE)/, green("\\1"), "1", txt)
txt = gensub(/(\?\?\?)/, bold(magenta("\\1")), "1", txt)
print txt
}
}
printf "\n"
}
}' $1
}
print_shell_hook() {
case $1 in
zsh)
echo "_orgdown_hook() {$0;}
typeset -ag precmd_functions;
if [[ -z \${precmd_functions[(r)_orgdown_hook]} ]]; then
precmd_functions+=_orgdown_hook;
fi"
;;
cd)
echo "cd() { builtin cd \"\$@\" && $0; }"
;;
-h|--help|*)
echo "usage: todo hook <integration>"
echo ""
echo "supported integrations:"
echo " - zsh: run todo as a precmd hook"
echo " (this can get quite annoying when you're in a direcory that has a todo file)"
echo " - cd: run todo as a post-cd hook"
echo ""
exit 1
;;
esac
}
case "$1" in
hook)
shift
print_shell_hook "$1"
;;
-h|--help)
echo "usage: todo [-r] [hook <integration>]"
echo "A quite stupid todo/agenda script that reminds you of things you need to do"
echo ""
echo " -r, --recursive walk the file tree, searching for todos"
echo " <integration> shell integration, you should eval this"
echo ""
exit 0
;;
-r|--recursive|-R)
while read FILE; do
hr "todo [$FILE]"
print_org $FILE;
done < <(rg --files ${_todo_files[@]/#/-g })
;;
*)
[ -f "$1" ] && { print_org $1; exit 0; }
has_todo_file && {
hr "todo"
print_org $_todo_file
}
;;
esac
|