laktak / todd Goto Github PK
View Code? Open in Web Editor NEWtodd is an interactive console TODO-list manager with VI key bindings for `todo.txt`
License: GNU General Public License v3.0
todd is an interactive console TODO-list manager with VI key bindings for `todo.txt`
License: GNU General Public License v3.0
I find myself hitting esc if I pressed enter by accident. I would expect to leave task edit mode.
I didn't realise the create date was being added by default as it was hidden.
So just the ability to sort by created date might be handy.
I am using @context inline of the sentence:
talk to @laktak about the context thing in +todd
pushing the context to the right, breaks the sentence.
It would be nice to have them highlighted.
Checked out master then:
python3.7 ./todd.py
Version 0.0.7
It feels kind of natural to use Home to go to the top issue or End to go to the last issue.
Using these keys seems to be unhandled.
Home:
Traceback (most recent call last):
File "todd.py", line 9, in <module>
main()
File "/home/peter/Code/todd/todd/main.py", line 132, in main
view.main(enable_word_wrap) # start up the urwid UI event loop
File "/home/peter/Code/todd/todd/taskui/main_ui.py", line 467, in main
self.loop.run()
File "/usr/lib64/python3.7/site-packages/urwid/main_loop.py", line 287, in run
self._run()
File "/usr/lib64/python3.7/site-packages/urwid/main_loop.py", line 385, in _run
self.event_loop.run()
File "/usr/lib64/python3.7/site-packages/urwid/main_loop.py", line 790, in run
self._loop()
File "/usr/lib64/python3.7/site-packages/urwid/main_loop.py", line 827, in _loop
self._watch_files[fd]()
File "/usr/lib64/python3.7/site-packages/urwid/raw_display.py", line 417, in <lambda>
event_loop, callback, self.get_available_raw_input())
File "/usr/lib64/python3.7/site-packages/urwid/raw_display.py", line 515, in parse_input
callback(processed, processed_codes)
File "/usr/lib64/python3.7/site-packages/urwid/main_loop.py", line 412, in _update
self.process_input(keys)
File "/usr/lib64/python3.7/site-packages/urwid/main_loop.py", line 513, in process_input
k = self._topmost_widget.keypress(self.screen_size, k)
File "/usr/lib64/python3.7/site-packages/urwid/container.py", line 2310, in keypress
key = w.keypress((mc,) + size[1:], key)
File "/usr/lib64/python3.7/site-packages/urwid/container.py", line 1131, in keypress
return self.body.keypress( (maxcol, remaining), key )
File "/home/peter/Code/todd/todd/taskui/components.py", line 116, in keypress
key = super(ViListBox, self).keypress(size, key)
File "/usr/lib64/python3.7/site-packages/urwid/listbox.py", line 978, in keypress
return actual_key(self._keypress_max_left((maxcol, maxrow)))
TypeError: _keypress_max_left() takes 1 positional argument but 2 were given
End:
Traceback (most recent call last):
File "./todd.py", line 9, in <module>
main()
File "/home/peter/Code/todd/todd/main.py", line 132, in main
view.main(enable_word_wrap) # start up the urwid UI event loop
File "/home/peter/Code/todd/todd/taskui/main_ui.py", line 467, in main
self.loop.run()
File "/usr/lib64/python3.7/site-packages/urwid/main_loop.py", line 287, in run
self._run()
File "/usr/lib64/python3.7/site-packages/urwid/main_loop.py", line 385, in _run
self.event_loop.run()
File "/usr/lib64/python3.7/site-packages/urwid/main_loop.py", line 790, in run
self._loop()
File "/usr/lib64/python3.7/site-packages/urwid/main_loop.py", line 827, in _loop
self._watch_files[fd]()
File "/usr/lib64/python3.7/site-packages/urwid/raw_display.py", line 417, in <lambda>
event_loop, callback, self.get_available_raw_input())
File "/usr/lib64/python3.7/site-packages/urwid/raw_display.py", line 515, in parse_input
callback(processed, processed_codes)
File "/usr/lib64/python3.7/site-packages/urwid/main_loop.py", line 412, in _update
self.process_input(keys)
File "/usr/lib64/python3.7/site-packages/urwid/main_loop.py", line 513, in process_input
k = self._topmost_widget.keypress(self.screen_size, k)
File "/usr/lib64/python3.7/site-packages/urwid/container.py", line 2310, in keypress
key = w.keypress((mc,) + size[1:], key)
File "/usr/lib64/python3.7/site-packages/urwid/container.py", line 1131, in keypress
return self.body.keypress( (maxcol, remaining), key )
File "/home/peter/Code/todd/todd/taskui/components.py", line 116, in keypress
key = super(ViListBox, self).keypress(size, key)
File "/usr/lib64/python3.7/site-packages/urwid/listbox.py", line 981, in keypress
return actual_key(self._keypress_max_right((maxcol, maxrow)))
TypeError: _keypress_max_right() takes 1 positional argument but 2 were given
It would be very useful to be able to select multiple contexts in the swithching pane
Use case:
I have tasks that can only be done at home and others only in my office, but there are some that can be done at either as long as i have my laptop and an internet connection.
If I'm at the office, I might want to select both @office and @online as my current contexts.
Alternatively, if I could exclude the @home context, that would also be neat!
Hi,
Just found your todo.txt client and looks pretty awesome so far.
I've been using todotxt-machine for a few weeks and yours feels like an improvement in a number of ways.
I've crashed it once already, but wasn't paying attention how, so once I work that out I'll log a bug with the repro.
๐
I'd tried due:tomorrow
and it crashed with:
Traceback (most recent call last):
File "/home/peter/.local/bin/todd", line 11, in <module>
sys.exit(main())
File "/home/peter/.local/lib/python3.6/site-packages/todd/main.py", line 132, in main
view.main(enable_word_wrap) # start up the urwid UI event loop
File "/home/peter/.local/lib/python3.6/site-packages/todd/taskui/main_ui.py", line 467, in main
self.loop.run()
File "/home/peter/.local/lib/python3.6/site-packages/urwid/main_loop.py", line 286, in run
self._run()
File "/home/peter/.local/lib/python3.6/site-packages/urwid/main_loop.py", line 384, in _run
self.event_loop.run()
File "/home/peter/.local/lib/python3.6/site-packages/urwid/main_loop.py", line 788, in run
self._loop()
File "/home/peter/.local/lib/python3.6/site-packages/urwid/main_loop.py", line 825, in _loop
self._watch_files[fd]()
File "/home/peter/.local/lib/python3.6/site-packages/urwid/raw_display.py", line 404, in <lambda>
event_loop, callback, self.get_available_raw_input())
File "/home/peter/.local/lib/python3.6/site-packages/urwid/raw_display.py", line 502, in parse_input
callback(processed, processed_codes)
File "/home/peter/.local/lib/python3.6/site-packages/urwid/main_loop.py", line 411, in _update
self.process_input(keys)
File "/home/peter/.local/lib/python3.6/site-packages/urwid/main_loop.py", line 511, in process_input
k = self._topmost_widget.keypress(self.screen_size, k)
File "/home/peter/.local/lib/python3.6/site-packages/urwid/container.py", line 2271, in keypress
key = w.keypress((mc,) + size[1:], key)
File "/home/peter/.local/lib/python3.6/site-packages/urwid/container.py", line 1131, in keypress
return self.body.keypress( (maxcol, remaining), key )
File "/home/peter/.local/lib/python3.6/site-packages/todd/taskui/components.py", line 116, in keypress
key = super(ViListBox, self).keypress(size, key)
File "/home/peter/.local/lib/python3.6/site-packages/urwid/listbox.py", line 999, in keypress
key = focus_widget.keypress((maxcol,),key)
File "/home/peter/.local/lib/python3.6/site-packages/todd/taskui/taskitem.py", line 103, in keypress
self.end_edit()
File "/home/peter/.local/lib/python3.6/site-packages/todd/taskui/taskitem.py", line 96, in end_edit
self.parent_ui.task_changed()
File "/home/peter/.local/lib/python3.6/site-packages/todd/taskui/main_ui.py", line 266, in task_changed
t.update_relative_due_date()
File "/home/peter/.local/lib/python3.6/site-packages/todd/tasklib/task.py", line 191, in update_relative_due_date
date = Util.mod_date_by(Util.get_today(), match.group(1))
File "/home/peter/.local/lib/python3.6/site-packages/todd/tasklib/util.py", line 91, in mod_date_by
(prefix, value, itype) = Util._interval_parts_regex.match(text).groups()
AttributeError: 'NoneType' object has no attribute 'groups'
A python library like Arrow might make the time conversions a cinch if you wanted to grab human readable date/time values and try to convert them.
Either way, the app should do something graceful if a bad due value is entered.
I am using my todo.txt as a kind of backlog. Is there a way to disable the default 7-day view?
It would be nice key:value data would be highlighted.
If there's no tasks in the current view then you hit enter to edit, it'll crash with:
Traceback (most recent call last):
File "/usr/local/bin/todd", line 11, in <module>
sys.exit(main())
File "/usr/local/lib/python3.7/site-packages/todd/main.py", line 129, in main
view.main(enable_word_wrap) # start up the urwid UI event loop
File "/usr/local/lib/python3.7/site-packages/todd/taskui/main_ui.py", line 369, in main
self.loop.run()
File "/usr/local/lib/python3.7/site-packages/urwid/main_loop.py", line 286, in run
self._run()
File "/usr/local/lib/python3.7/site-packages/urwid/main_loop.py", line 384, in _run
self.event_loop.run()
File "/usr/local/lib/python3.7/site-packages/urwid/main_loop.py", line 788, in run
self._loop()
File "/usr/local/lib/python3.7/site-packages/urwid/main_loop.py", line 825, in _loop
self._watch_files[fd]()
File "/usr/local/lib/python3.7/site-packages/urwid/raw_display.py", line 404, in <lambda>
event_loop, callback, self.get_available_raw_input())
File "/usr/local/lib/python3.7/site-packages/urwid/raw_display.py", line 502, in parse_input
callback(processed, processed_codes)
File "/usr/local/lib/python3.7/site-packages/urwid/main_loop.py", line 411, in _update
self.process_input(keys)
File "/usr/local/lib/python3.7/site-packages/urwid/main_loop.py", line 517, in process_input
something_handled |= bool(self.unhandled_input(k))
File "/usr/local/lib/python3.7/site-packages/urwid/main_loop.py", line 563, in unhandled_input
return self._unhandled_input(input)
File "/usr/local/lib/python3.7/site-packages/todd/taskui/main_ui.py", line 343, in keystroke
elif self.key_bindings.is_bound_to(key, "edit"): self.edit_task()
File "/usr/local/lib/python3.7/site-packages/todd/taskui/main_ui.py", line 197, in edit_task
focus.edit_item(normal_mode)
AttributeError: 'NoneType' object has no attribute 'edit_item'
So do a search with something that returns empty results and then try to edit to reproduce this.
Marking a task as done always archives that task immediately instead of showing it in the list.
Excellent TUI!! Many thanks indeed.
I can see that projects are scanned on a task, but I can't see a column for them or the ability to sort/filter.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
๐ Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. ๐๐๐
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google โค๏ธ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.