-
Notifications
You must be signed in to change notification settings - Fork 1
/
orgclock.py
71 lines (55 loc) · 1.78 KB
/
orgclock.py
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
import re
import rumps
# rumps.debug_mode(True)
## utilities
## ---------
def run(cmd):
import subprocess
return subprocess.check_output(cmd, shell=True).strip()
def run_emacsclient(elisp):
s = run('emacsclient -e "%s"' % elisp)
# print '>>> %s ==> %s' % (elisp, s)
return s
## orgmode functions
## -----------------
org_regex = re.compile('\#\(\"\s*\[(.+)/(.+)\] \((.+)\)\".*')
def org_parse_clock_string(s):
r = org_regex.search(s)
return r.groups()
def org_clock_string():
# TODO: set icon accordingly
if run_emacsclient("(org-clock-is-active)") == "nil":
return None
else:
s = run_emacsclient("(org-clock-get-clock-string)").splitlines()[0]
elapsed, estimated, title = org_parse_clock_string(s)
return "%s -- %s" % (elapsed, title)
def org_goto_clock():
import subprocess
cmd = 'emacsclient -e "(call-interactively \'org-clock-goto)"'
subprocess.check_call(cmd, shell=True)
subprocess.check_call(["open", "-a", "Emacs"]) # activate Emacs window
## osx menubar app
## ---------------
class OrgClockStatusBarApp(rumps.App):
@rumps.clicked("Go to current/recent task")
def current_task(self, _):
org_goto_clock()
@rumps.clicked("Refresh")
def sayhi(self, _):
clock_title = org_clock_string()
self.title = clock_title
if __name__ == "__main__":
app = OrgClockStatusBarApp("Org clock")
def timer_func(sender):
s = org_clock_string()
print s # removing the print statement makes the app hang.
if s is not None:
app.title = s
else:
app.title = "Not tracking"
timer = rumps.Timer(timer_func, 5)
# TODO: check emacs install before starting app.
timer.start()
app.icon = "task.png"
app.run()