Compare commits

..

31 Commits

Author SHA1 Message Date
Florian Tham
19dde076cf remove accidentally commited swap file 2018-11-06 11:08:01 +01:00
Florian Tham
3bc3616651 optionally colorized date extensions (due, threshold and again) 2018-11-06 10:58:18 +01:00
kh80
d589fd0570 Add 'done' option as alias of 'do' (#169) 2018-04-11 13:34:19 -05:00
tpikonen
7a30199fe0 Cleanup (#247)
- Fixed: Reduce shellcheck warnings.
- Fixed: Remove trailing whitespace.
- Fixed: Double quote to prevent globbing and word splitting. [SC2086]
- Fixed: Invalid flags are not handled. [SC2220]
- Fixed: Cleaned up string replaces.
2018-04-04 19:33:09 -05:00
tpikonen
867ade5701 new: Add default priority variable TODOTXT_PRIORITY_ON_ADD. (#246)
Adds the config / env variable `TODOTXT_PRIORITY_ON_ADD`, which when set to one of the capital letters `A` to `Z` is given as a priority to a new task, if a priority is not given on command line.
2018-03-28 16:58:48 -05:00
Anton Ermolenko
14f5de1579 interpreter reference update to be portable (#160) 2018-03-28 16:09:07 -05:00
Guilherme Reis
7ec2a1263e Read the task's name and uses as default (#249)
Read the task's name and uses as default, so the user can read the previous task's name.

Thanks @guifeliper
2018-03-26 13:23:27 -05:00
Ali Karbassi
e40e76fb07 Release version 2.11.0 (#236)
Read CHANGELOG.md
2018-03-26 11:09:35 -05:00
AJ Jordan
8b35c5fdae Set the executable bit when preparing releases (#156) 2018-03-26 10:51:33 -05:00
Adam Goldsmith
8ec3bab53c Make Makefile more standard (#239) 2017-12-04 08:57:27 -06:00
R. Francis Smith
4a7626a8cb fixed typo within Contributing section (#240) 2017-11-20 14:42:31 -06:00
Ali Karbassi
9c390a84cb fix: Update url in code. (#237) 2017-10-23 14:20:37 -05:00
Ali Karbassi
643dafeafd Create PULL_REQUEST_TEMPLATE.md (#234) 2017-10-23 14:18:46 -05:00
Ali Karbassi
8d3ea7971b change: Moved USAGE out of README. (#238)
The usage was making the README extremely long and unruly. Let's move it
out to it's own file so it can be updated quickly as well.
2017-10-17 13:00:42 -05:00
Alberto Fanjul
64f9c8295d new: Configurable config dir (#223)
- Configurable config dir
- Describe Makefile options
2017-10-16 10:01:47 -05:00
Simon M
b7fb2ac2be fix: Make text input more user-friendly (#208)
The use of the default read command will not allow the user to use arrow keys and shortcuts to enter the data when doing a replace or entering any input, which can be frustrating. Besides, backslashed are interpreted and can be mangled.

- Using the `-e` option will trigger the use of the readline library: you can then, as expected in bash, use the arrow keys and all shortcuts to move around the line before pressing enter.
- Using the `-r` option will prevent the interpretation of the "" and insert them as typed, useful when pasting code:
2017-10-13 16:32:13 -05:00
Ali Karbassi
1d64ba59ca Create ISSUE_TEMPLATE.md (#235) 2017-10-11 10:19:09 -05:00
Ali Karbassi
4df0f15ad8 fix: Use git tags for version numbers. (#233) 2017-10-11 10:10:59 -05:00
Gutierri Barboza
a43d664fe9 README (#219)
- Updated badges, links, and install instructions.
- Added usage, flags, and commands.
2017-10-10 14:07:36 -05:00
Gutierri Barboza
953506dc6b Create Changelog (#218)
- Complete history from wiki page
- Matches keepachangelog standards via http://keepachangelog.com/en/1.0.0/
2017-10-10 13:04:55 -05:00
Ali Karbassi
cbca5d2ff6 Create CODE_OF_CONDUCT.md (#217) 2017-10-10 09:20:26 -05:00
Daniel St.Jacques
94e1c6e406 Updated add command to accept lowercase priority (#230)
- Updated add command to accept lowercase priority
- Added testcase for add with lowercase priority
2017-10-10 09:10:34 -05:00
Ali Karbassi
eeb5703728 Merge pull request #228 from cori/patch-1
Updates to Downloads
2017-10-01 21:29:57 -05:00
cori schlegel
a6cf0c0fc2 Updates to Downloads
Update Downloads links to point at the Releases page, because it seems like the files from @ginatrapani's project (which these linked to) didn't make it to the new org's files, so the links on the redirected page are no good.
2017-10-01 16:30:05 -05:00
Ali Karbassi
b52929b396 Merge branch 'karbassi-feature/completion-suppress-errormsgs'
* karbassi-feature/completion-suppress-errormsgs:
  Suppress todo.sh error messages when invoked during completion (#8)
2017-08-23 12:24:05 -05:00
Ali Karbassi
0e833e4e9d Merge branch 'master' into feature/completion-suppress-errormsgs 2017-08-23 12:23:06 -05:00
Ali Karbassi
52d47a4d80 Merge branch 'onovy-makefile-fix'
* onovy-makefile-fix:
  Don't ignore errors in tests.
  Clean tests and version file in Makefile.
2017-08-23 10:18:28 -05:00
Ali Karbassi
d61299ef9f Merge branch 'makefile-fix' of github.com:onovy/todo.txt-cli into onovy-makefile-fix
* 'makefile-fix' of github.com:onovy/todo.txt-cli:
  Don't ignore errors in tests.
  Clean tests and version file in Makefile.
2017-08-23 10:17:39 -05:00
Ingo Karkat
efea0faf78 Suppress todo.sh error messages when invoked during completion (#8)
Redirect any stderr output from todo.sh during completion to /dev/null, as it gets in the way. The error will be seen later after building and executing the command-line, anyway.

Signed-off-by: Ali Karbassi <ali@karbassi.com>
2017-08-23 10:10:50 -05:00
onovy
5bee9c88a4 Don't ignore errors in tests. 2014-11-29 17:25:09 +01:00
onovy
f4ea40d677 Clean tests and version file in Makefile. 2014-11-29 17:24:25 +01:00
16 changed files with 1102 additions and 157 deletions

BIN
.github/example.gif vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 657 KiB

410
CHANGELOG.md Normal file
View File

@@ -0,0 +1,410 @@
# Changelog
All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/)
and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html).
## [Unreleased]
## [2.11.0] - 2018-03-26
### Added
- Added support for `$XDG_CONFIG_HOME` config file/actions location
- Created [CODE_OF_CONDUCT.md](/CODE_OF_CONDUCT.md) ([#217])
- Created [CHANGELOG.md](/CHANGELOG.md) ([#218])
### Changed
- Updated `add` command to accept lowercase priority ([#230])
- Clean tests and version file in Makefile. Don't ignore errors in tests.
- Updated [README.md](/README.md) ([#219])
- Update Downloads links to point at the Releases page ([#228])
- Set the executable bit when preparing releases ([#156])
### Fixes
- Update links to use https
- Suppress todo.sh error messages when invoked during completion ([#8])
## [2.10.0] - 2013-12-06
### Added
- Enable term filtering for listcon.
- Add make install command.
- Enable use of global config file in `/etc/todo/config`. `make install` installs a global config file.
- Allow use of `post_filter_command` for `listall` and `listpri`.
- Print usage help for custom action and all passed actions.
- Allow configuring null data files (done.txt and report.txt) and don't create
them.
- Color contexts and projects without an add-on, just by setting vars in the
config file.
- Place add-ons in subfolders (for easier git clone).
### Changed
- Improve code commenting/documentation.
- Refactor code for speed/better organization.
- Improve test coverage and test library.
### Removed
- Removed add date from line completion, ie, `todo.sh ls 10[tab]`.
### Fixed
- Properly replace date when replacing task with priority and date.
- Handle `-h`, `shorthelp`, and `help` when a Fatal Error happens.
- Fix `todo_completion` problem with Bash 3.1.
## [2.9.0] - 2012-04-08
### Added
- Added tab auto-completion of projects and contexts from `todo.txt` and `done.txt`. Type `@<Tab>` or `+<Tab>` while entering a task.
- Added new listaddons command displays installed addons.
- List priorities within a range using listpri. For example, to see tasks prioritized A-B, use `todo.sh listpri A-B`
### Fixed
- Fixed various cosmetic issues, bugs, and added developer test library enhancements.
## [2.8.0] - 2011-09-13
### Added
- `listpri`/`lsp` now filters by term. For example, `todo.sh lsp A book` will only return tasks prioritized `A` with the word book in them.
- Added support for todo directory paths with spaces in them.
- Tasks with priority included and auto prepend date on (`-t`) get the date where expected.
- Smarter action completion messaging: `do`, `pri`, and `depri` all let you know if a task is already done, prioritized, or deprioritized.
- Made more parameters available to offer more control to custom actions (`-c`, `-A`, `-N`, `-T`)
### Changed
- Improved portability for Dropbox or USB key users. If not specified, todo.sh checks for a config file in its own directory; default todo.txt location is todo.sh's directory.
- Improved script performance thanks to optimized code
- Exposed `cleaninput()` for use in addons
- Improved testing framework:
- Better escaped input handling
- Abstracted make_action function to test custom action behavior
- Added tests for source code compliance
- Cleaner, simpler, modernized, optimized code
### Fixed
- Custom action output no longer prefaced by `TODO:` so it's easier to see when the core script vs. addon is performing an action
- `listpri` complains if specified priority is invalid
- Don't abort task listing when items contain certain escape sequences (`\c \033`)
- Condense whitespace ONLY whe task is quoted; automatically convert CRLF to space
- Don't delete `|` (pipe) from task input
- `-+` and `-@` no longer break task coloring if context or project appears at the end of the line
## [2.7.0] - 2010-08-03
### Added
- Added generalization of the _PRI_X_ color support to all priorities
- Added highlighting of done, but not yet archived tasks via *COLOR_DONE*
- Color map (BLACK, ...) now supports spaces in the color definitions, making it possible to override the default ANSI escape codes with e.g. Conky tags (`${color black}`)
### Changed
- Cleanup: help messages, consistent output messages
- Exporting `die()` function for use in custom commands
- `prepend` and `replace` actions keep prepended date, `append` considers sentence delimiters
- Tests: several regression tests added
## [2.6.0] - 2010-05-11
### Added
- Added a case for the fixed replace command.
### Changed
- Changed odd tabs to spaces.
- Faster help/useage document outputs.
- Consolidated `TODOTXT_VERBOSE` tests.
- Refactored various add functionality to one function.
- Updated `_list()` output to match updated `addto`.
### Fixed
- Quoting regexp to parse properly.
- Fixed erroneous hide/show comments.
- Correctly fixed regexp quoting issue for bash v3.1.x and v3.2.x.
- Old versions of bash do not have `=~`
- Fix line endings.
- Fixed bug for replace command.
## [2.5.0] - 2010-05-05
### Added
- Support use of `$HOME/.todo/` for all todo.sh configuration
- Added new multiple do capability to help message
- Added option to disable final filter
- Added a new variable `$TODO_FULL_SH`
- Added new action `addm`
- Added support PAGER pipe for help output
- Added some additional mappings, plus a project context
### Changed
- Added 'silent' to a bunch of calls
### Fixed
- Fixing prepend and priority issue.
- Replace with `priority` set
- Multiple `do` items
- `prepend` not correct on prioritized tasks
- Invalid date range. Changed regex `[ -~]` to `[ ~-]`.
- `do`: no safeguard to `do` twice. Tests item is not marked done before attempting to mark item as "done".
- Fixed `add` does not escape line breaks
- `append` and `replace` unexpected behavior if there's an `&` in task (even in quotes)
- Tasks whose `ID` begins with `0` ought to be ignored.
- Fixed auto-complete function name for contexts
## [2.4.0] - 2009-05-11
### Added
- Added support for `TODOTXT_FINAL_FILTER` to provide a final custom list filter.
- Added support for custom sorting (can set in `todo.cfg`)
- Added parameterize for `.todo.actions.d` directory
### Removed
- Removed annoying trailing space on `pri` tasks
- Don't set colors in default `todo.cfg`.
- Don't set sort command in default `todo.cfg`.
### Fixed
- `listcon` and `listproj` now work correctly on Mac OS X 10.5
- `pri` accepted priorities of more than a single letter
- Support commands combination for `TODOTXT_SORT_COMMAND`; e.g. piped commands can be used: `export TODOTXT_SORT_COMMAND=" env LC_COLLATE=C sort -f -k2 - | grep -m 10 ."`
- Replace now echoes old item AND new item, like it used to.
- `depri` no longer wipes out tasks with more than just the priority in parentheses
- Now throws an error if you try to prioritize with more than one letter, ie, `todo.sh pri AA` doesn't work any more.
## [2.3.0] - 2009-04-02
### Added
- Added hide priority, context, and projects options now enabled `-P`, `-@` and `-+`
- Enabled recursive call of todo.sh from add-ons
- Exported variables for use in add-ons
- Added `-vv` option for debugging output
- Added short usage statement (that fits on one screen) with `-h`
- Added Makefile dist infrastructure for versioned releases in Downloads area on GitHub
### Changed
- Separated `_list` function for reuse by various versions of list command to reduce duplicate code
- Set `ls` as the default action
## [2.2.0] - 2009-03-??
### Fixed
- For awhile here during the GitHub transition, we stripped the version number from todo.sh and updated it kind of willy-nilly, so we're back-versioning all unversioned copies v 2.2.
## [2.1.0] - 2009-02-23
### Added
- Added "pluggability" with `~/.todo.actions.d/` support (via [Tammy and Ed](http://tech.groups.yahoo.com/group/todotxt/message/1739))
- Added `-t` param, off by default. When specified, it automatically prepends the current date to new todo's on add
- Searches for more Unix-y `~/.todo.cfg` if `~/todo.cfg` doesn't exist (via [Ed](http://tech.groups.yahoo.com/group/todotxt/message/1767))
### Fixed
- Corrected "ambiguous redirect" bug with done file (via [Jeff](http://tech.groups.yahoo.com/group/todotxt/message/1764))
- Corrected usage and help message with new params
- Corrected config file miscomment about colors
## [2.0.1] - 2009-02-17
### Fixed
- Restored `-d` parameter functionality broken in 2.0 (d'oh, thanks Jason, you made the changelog! )
## [2.0.0] - 2009-02-17
### Added
- Added `addto [DEST] "Text to add"` will append text to any file in the todo directory, like `ideas.txt` or `maybelater.txt`.
- Added `mv # [DEST]` will move a task from `todo.txt` to another file `[DEST]` in the todo directory, like if you decide your `"Learn French"` task should go into your `maybelater.txt` file.
- `depri #` removes priority from a task.
- `rm # [TERM]` or `del # [TERM]` will delete just the `[TERM]` from the task on line # in todo.txt.
- `listfile [SRC] [TERM]` or `lf [SRC] [TERM]` will list the contents of any text file in the todo directory, and filter by keyword `[TERM]`.
- `listcon` (`lsc`) and `listproj` (`lsprj`) lists contexts and projects, respectively, that appear in todo.txt. (Requires `gawk`)
- On task deletion, line number preservation is on by default (known issue, leaves blank lines). Optional, can be turned off with `-n` option.
- Auto-archive on task completion is now on by default; can be turned off with `-a` parameter.
### Changed
- Separated config file into a non hidden dot file.
### Fixed
- Better error handling throughout for all commands.
- Archive now defrags the file (removes blank lines; see line preservation option.)
- Using `/bin/bash` instead of `/bin/sh`
## [1.7.3] - 2006-07-29
### Added
- Added short action aliases `add/a`, `list/ls`, `listpri/lsp`, `listall/lsa`, `prepend/prep`, `append/app`, `del/rm`
## [1.7.2] - 2006-07-28
### Added
- `listpri` automatically capitalizes lowercase priorities
- `listpri` now displays friendly error message, and the # of tasks returned in verbose mode
### Changed
- `do` action removes priority from task automatically
Update:
### Fixed
- Actions are now case-insensitive (ie, `todo.sh Add` will work)
## [1.7.1] - 2006-07-21
### Changed
- I'm a big dummy and didn't keep track of what I fixed here. Sorry!
## [1.7.0] - 2006-07-19
### Added
- Interactive `add`, `append`, `prepend`, and `replace` (tx, Ben!)
- Action `listall` displays tasks from both todo.txt and done.txt
- Option `-f` forces delete action and disables interactive input (for todobot.pl)
- Option `-h` displays full help message.
### Deprecated
- Option `-q` deprecated; Use `-v` to turn on verbose mode
### Changed
- A very short version of usage message displays by default instead of the long version.
- Comment in info about `.todo` file being required
### Fixed
- No colors display for done tasks (tx, Tanja!)
- Sort is now case-insensitive (tx, Lonnie!)
## [1.6.3] - 2006-07-06
### Added
- Line numbers now padded, up to 100 characters. (tx, Tanja!)
## [1.6.2] - 2006-07-05
### Fixed
- Windows config files with spaces now work (tx Ron)
## [1.6.1] - 2006-07-05
### Changed
- The default location of your `.todo` file is now `$HOME/.todo`
### Fixed
- No colors mode (`-p`) now works as expected
## [1.6.0] - 2006-07-04
### Added
- Action `prepend` adds text to an item at the beginning of the line.
- Configuration file is now separated from script into `.todo` file
- Specify a config file other than `.todo` using the `-d` option
- Option `-q` quiets todo.sh's chattiness.
- Option `-V` shows version and license information.
### Changed
- The option to turn off colors is now `-p` (no longer `-nc` as in 1.5.2)
## [1.5.2] - 2006-06-26
### Fixed
- Items that start with `x ` (an x with a space after) are archived now to avoid lines that start with a word like `xander` from being archived. (tx, Tannie!)
- Report now only archives items that start with `x ` as well.
## [1.5.1] - 2006-06-26
### Fixed
- Items with an `x` in them at all were being deleted on archive with 1.5; all fixed now.
## [1.5.0] - 2006-06-24
### Added
- Option to turn off colors (to avoid characters in piped text files or IM bot), ie `todo.sh -nc [COMMAND]`
- A date is added to a completed todo, ie `x 2006-06-24` (tx SETH)
- Action `remdup` removes exact duplicate lines from todo.txt (tx Tannie)
- Action `del` removes any blank lines from todo.txt (tx Tannie)
### Changed
- Using `sed -i` instead of copying tmp file (tx Tannie)
### Fixed
- Colors show in OS/X 10.4 (tx SETH & misha)
## [1.4.0] - 2006-06-17
### Added
- Tasks are color-coded by priority in Cygwin (Thanks, Abraham, Manuel and Luis!)
### Changed
- Switched endless `if-then` to a `case` statement, and tightened up `wc -l` regex. (Thanks, Sash!)
### Fixed
- If you `replace`/`do`/`append` to a non-existent task, your todo.txt is no longer overwritten and the error is handled gracefully. (Thanks, Scott!)
## [1.3.0] - 2006-05-29
### Added
- Displays the number of newly added todo (Thanks, Amy!)
- Confirms whether or not you really want to delete a todo
- Displays success messages and confirmations on `append`, `replace`, `do`, etc.
- Added licensing information in comments. GPL, baby!
### Changed
- Alphabetized command workflow in if/then construction
- Tightened up `sed` commands, removed unnecessary `grep`s and `cat`s (Thanks, Sash!)
- Stripped whitespace around number lines from wc results
### Removed
- Removed filenames from `report.txt` format, for easier graphing or Excel imports.
### Fixed
- Todos are now sorted alphabetically when listed by a term. (ie: `todo list flowers)
## [1.2.0] - 2006-05-15
### Added
- `list` is case insenstive. ie, `todo list Mac` will match lines with "mac" and "Mac"
### Changed
- `todo list` matches multiple [TERM]s. ie, `todo list mac offline` will match all lines that contain the words "mac" and "offline"
- `repri` and `pri` actions combined into `pri` action (Thanks Mike!)
- Quotes no longer required with `add` and `replace` (Thanks Karl!)
- Any priority added to a todo must be uppercase to preserve sort order, enforced now. ie `todo pri 1 a` will return a usage error.
### Fixed
- File "sanity checks" and cleanup function, test script and various fantastic stylistic improvements added. Extra big thanks to Karl!
## [1.1.0] - 2006-05-12
### Added
- Supports file paths with spaces (ie `C:\Documents and Settings\gina\todo.txt`)
## 1.0.0 - 2006-05-11
### Added
- Consolidated into one master script with usage notes and released.
[Unreleased]: https://github.com/todotxt/todo.txt-cli/compare/v2.11.0...HEAD
[2.11.0]: https://github.com/todotxt/todo.txt-cli/compare/v2.10.0...v2.11.0
[2.10.0]: https://github.com/todotxt/todo.txt-cli/compare/v2.9.0...v2.10.0
[2.9.0]: https://github.com/todotxt/todo.txt-cli/compare/v2.8.0...v2.9.0
[2.8.0]: https://github.com/todotxt/todo.txt-cli/compare/v2.7.0...v2.8.0
[2.7.0]: https://github.com/todotxt/todo.txt-cli/compare/v2.6.0...v2.7.0
[2.6.0]: https://github.com/todotxt/todo.txt-cli/compare/v2.5.0...v2.6.0
[2.5.0]: https://github.com/todotxt/todo.txt-cli/compare/v2.4.0...v2.5.0
[2.4.0]: https://github.com/todotxt/todo.txt-cli/compare/v2.3.0...v2.4.0
[2.3.0]: https://github.com/todotxt/todo.txt-cli/compare/v2.2.0...v2.3.0
[2.2.0]: https://github.com/todotxt/todo.txt-cli/compare/v2.1.0...v2.2.0
[2.1.0]: https://github.com/todotxt/todo.txt-cli/compare/v2.0.1...v2.1.0
[2.0.1]: https://github.com/todotxt/todo.txt-cli/compare/v2.0.0...v2.0.1
[2.0.0]: https://github.com/todotxt/todo.txt-cli/compare/v1.7.3...v2.0.0
[1.7.3]: https://github.com/todotxt/todo.txt-cli/compare/v1.7.2...v1.7.3
[1.7.2]: https://github.com/todotxt/todo.txt-cli/compare/v1.7.1...v1.7.2
[1.7.1]: https://github.com/todotxt/todo.txt-cli/compare/v1.7.0...v1.7.1
[1.7.0]: https://github.com/todotxt/todo.txt-cli/compare/v1.6.3...v1.7.0
[1.6.3]: https://github.com/todotxt/todo.txt-cli/compare/v1.6.2...v1.6.3
[1.6.2]: https://github.com/todotxt/todo.txt-cli/compare/v1.6.1...v1.6.2
[1.6.1]: https://github.com/todotxt/todo.txt-cli/compare/v1.6.0...v1.6.1
[1.6.0]: https://github.com/todotxt/todo.txt-cli/compare/v1.5.2...v1.6.0
[1.5.2]: https://github.com/todotxt/todo.txt-cli/compare/v1.5.1...v1.5.2
[1.5.1]: https://github.com/todotxt/todo.txt-cli/compare/v1.5.0...v1.5.1
[1.5.0]: https://github.com/todotxt/todo.txt-cli/compare/v1.4.0...v1.5.0
[1.4.0]: https://github.com/todotxt/todo.txt-cli/compare/v1.3.0...v1.4.0
[1.3.0]: https://github.com/todotxt/todo.txt-cli/compare/v1.2.0...v1.3.0
[1.2.0]: https://github.com/todotxt/todo.txt-cli/compare/v1.1.0...v1.2.0
[1.1.0]: https://github.com/todotxt/todo.txt-cli/compare/v1.0.0...v1.1.0
[#230]: https://github.com/todotxt/todo.txt-cli/pull/230
[#228]: https://github.com/todotxt/todo.txt-cli/pull/228
[#219]: https://github.com/todotxt/todo.txt-cli/pull/219
[#218]: https://github.com/todotxt/todo.txt-cli/pull/218
[#217]: https://github.com/todotxt/todo.txt-cli/pull/217
[#156]: https://github.com/todotxt/todo.txt-cli/pull/156
[#8]: https://github.com/todotxt/todo.txt-cli/pull/8

46
CODE_OF_CONDUCT.md Normal file
View File

@@ -0,0 +1,46 @@
# Contributor Covenant Code of Conduct
## Our Pledge
In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation.
## Our Standards
Examples of behavior that contributes to creating a positive environment include:
* Using welcoming and inclusive language
* Being respectful of differing viewpoints and experiences
* Gracefully accepting constructive criticism
* Focusing on what is best for the community
* Showing empathy towards other community members
Examples of unacceptable behavior by participants include:
* The use of sexualized language or imagery and unwelcome sexual attention or advances
* Trolling, insulting/derogatory comments, and personal or political attacks
* Public or private harassment
* Publishing others' private information, such as a physical or electronic address, without explicit permission
* Other conduct which could reasonably be considered inappropriate in a professional setting
## Our Responsibilities
Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior.
Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful.
## Scope
This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers.
## Enforcement
Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at TBD@TBD.tld. The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately.
Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership.
## Attribution
This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version]
[homepage]: http://contributor-covenant.org
[version]: http://contributor-covenant.org/version/1/4/

View File

@@ -8,7 +8,7 @@ LF='
'
if test -d .git -o -f .git &&
VN=$(git describe --abbrev=4 HEAD 2>/dev/null) &&
VN=$(git describe --abbrev=0 --tags 2>/dev/null) &&
case "$VN" in
*$LF*) (exit 1) ;;
v[0-9]*)

22
ISSUE_TEMPLATE.md Normal file
View File

@@ -0,0 +1,22 @@
**Do you want to request a *feature* or report a *bug*?**
**What is the current behavior?**
**If the current behavior is a bug, please provide the steps to reproduce and if possible a minimal demo of the problem.**
**What is the expected behavior?**
**Which versions todo.sh are you using?**
> Run `todo.sh -V`
**Which Operating System are you using?**
**Which version of bash are you using?**
> Run `bash --version`

View File

@@ -1,7 +1,7 @@
GNU GENERAL PUBLIC LICENSE
Version 3, 29 June 2007
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
@@ -645,7 +645,7 @@ the "copyright" line and a pointer to where the full notice is found.
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
along with this program. If not, see <https://www.gnu.org/licenses/>.
Also add information on how to contact you by electronic and paper mail.
@@ -664,11 +664,11 @@ might be different; for a GUI interface, you would use an "about box".
You should also get your employer (if you work as a programmer) or school,
if any, to sign a "copyright disclaimer" for the program, if necessary.
For more information on this, and how to apply and follow the GNU GPL, see
<http://www.gnu.org/licenses/>.
<https://www.gnu.org/licenses/>.
The GNU General Public License does not permit incorporating your program
into proprietary programs. If your program is a subroutine library, you
may consider it more useful to permit linking proprietary applications with
the library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License. But first, please read
<http://www.gnu.org/philosophy/why-not-lgpl.html>.
<https://www.gnu.org/licenses/why-not-lgpl.html>.

View File

@@ -1,7 +1,22 @@
#
# Makefile for todo.txt
#
INSTALL_DIR=/usr/local/bin
SHELL = /bin/sh
INSTALL = /usr/bin/install
INSTALL_PROGRAM = $(INSTALL)
INSTALL_DATA = $(INSTALL) -m 644
prefix = /usr/local
# The directory to install todo.sh in.
bindir = $(prefix)/bin
# The directory to install the config file in.
sysconfdir = $(prefix)/etc
datarootdir = $(prefix)/share
# Dynamically detect/generate version file as necessary
# This file will define a variable called VERSION.
@@ -21,21 +36,36 @@ dist: $(DISTFILES) todo.sh
mkdir -p $(DISTNAME)
cp -f $(DISTFILES) $(DISTNAME)/
sed -e 's/@DEV_VERSION@/'$(VERSION)'/' todo.sh > $(DISTNAME)/todo.sh
chmod +x $(DISTNAME)/todo.sh
tar cf $(DISTNAME).tar $(DISTNAME)/
gzip -f -9 $(DISTNAME).tar
zip -9r $(DISTNAME).zip $(DISTNAME)/
rm -r $(DISTNAME)
.PHONY: clean
clean:
clean: test-pre-clean
rm -f $(DISTNAME).tar.gz $(DISTNAME).zip
rm VERSION-FILE
install: installdirs
$(INSTALL_PROGRAM) todo.sh $(DESTDIR)$(bindir)/todo.sh
$(INSTALL_DATA) todo_completion $(DESTDIR)$(datarootdir)/bash_completion.d/todo
[ -e $(DESTDIR)$(sysconfdir)/todo/config ] || \
sed "s/^\(export[ \t]*TODO_DIR=\).*/\1~\/.todo/" todo.cfg > $(DESTDIR)$(sysconfdir)/todo/config
uninstall:
rm -f $(DESTDIR)$(bindir)/todo.sh
rm -f $(DESTDIR)$(datarootdir)/bash_completion.d/todo
rm -f $(DESTDIR)$(sysconfdir)/todo/config
rmdir $(DESTDIR)$(datarootdir)/bash_completion.d
rmdir $(DESTDIR)$(sysconfdir)/todo
installdirs:
mkdir -p $(DESTDIR)$(bindir) \
$(DESTDIR)$(sysconfdir)/todo \
$(DESTDIR)$(datarootdir)/bash_completion.d
install:
install --mode=755 todo.sh $(INSTALL_DIR)
install --mode=644 todo_completion /etc/bash_completion.d/todo
mkdir -p /etc/todo
[ -e /etc/todo/config ] || \
sed "s/^\(export[ \t]*TODO_DIR=\).*/\1~\/.todo/" todo.cfg > /etc/todo/config
#
# Testing
#
@@ -48,7 +78,7 @@ test-pre-clean:
aggregate-results: $(TESTS)
$(TESTS): test-pre-clean
-cd tests && ./$(notdir $@) $(TEST_OPTIONS)
cd tests && ./$(notdir $@) $(TEST_OPTIONS)
test: aggregate-results
tests/aggregate-results.sh tests/test-results/t*-*

9
PULL_REQUEST_TEMPLATE.md Normal file
View File

@@ -0,0 +1,9 @@
**Before submitting a pull request,** please make sure the following is done:
- [ ] Fork [the repository](https://github.com/todotxt/todo.txt-cli) and create your branch from `master`.
- [ ] If you've added code that should be tested, add tests!
- [ ] Ensure the test suite passes.
- [ ] Format your code with [ShellCheck](https://www.shellcheck.net/).
- [ ] Include a human-readable description of what the pull request is trying to accomplish.
- [ ] Steps for the reviewer(s) on how they can manually QA the changes.
- [ ] Have a `fixes #XX` reference to the issue that this pull request fixes.

99
README.md Normal file
View File

@@ -0,0 +1,99 @@
# [![todo.txt-cli](http://todotxt.org/images/todotxt_logo_2012.png)][website]
> A simple and extensible shell script for managing your todo.txt file.
[![Build Status](https://travis-ci.org/todotxt/todo.txt-cli.svg?branch=master)](https://travis-ci.org/todotxt/todo.txt-cli)
[![GitHub issues](https://img.shields.io/github/issues/todotxt/todo.txt-cli.svg)](https://github.com/todotxt/todo.txt-cli/issues)
[![GitHub forks](https://img.shields.io/github/forks/todotxt/todo.txt-cli.svg)](https://github.com/todotxt/todo.txt-cli/network)
[![GitHub stars](https://img.shields.io/github/stars/todotxt/todo.txt-cli.svg)](https://github.com/todotxt/todo.txt-cli/stargazers)
[![GitHub license](https://img.shields.io/github/license/todotxt/todo.txt-cli.svg)](https://raw.githubusercontent.com/todotxt/todo.txt-cli/master/LICENSE)
[![Gitter](https://badges.gitter.im/join_chat.svg)](https://gitter.im/todotxt/todo.txt-cli)
![gif](./.github/example.gif)
*Read our [contributing guide](CONTRIBUTING.md) if you're looking to contribute (issues/PRs/etc).*
## Installation
### Download
Download the latest stable [release][release] for use on your desktop or server.
### OS X / macOS
```shell
brew install todo-txt
```
### Linux
#### From command line
```shell
make
make install
make test
```
*NOTE:* Makefile defaults to several default paths for installed files. Adjust to your system:
- `INSTALL_DIR`: PATH for executables (default /usr/local/bin)
- `CONFIG_DIR`: PATH for todo.txt config
- `BASH_COMPLETION`: PATH for autocompletion scripts (default to /etc/bash_completion.d)
```shell
make install CONFIG_DIR=/etc INSTALL_DIR=/usr/bin BASH_COMPLETION_DIR=/usr/share/bash-completion/completions
```
#### Arch Linux (AUR)
https://aur.archlinux.org/packages/todotxt-git/
## Usage
```shell
todo.sh [-fhpantvV] [-d todo_config] action [task_number] [task_description]
```
For example, to add a todo item, you can do:
```shell
todo.sh add "THING I NEED TO DO +project @context"
```
Read about all the possible commands in the [USAGE][USAGE] file.
## Release History
See [CHANGELOG.md][CHANGELOG]
## Support
- [Stack Overflow](https://stackoverflow.com/questions/tagged/todotxt)
- [Gitter chat](https://gitter.im/todotxt/todo.txt-cli)
- [Twitter](https://twitter.com/todotxt)
## Code of Conduct
[Contributor Code of Conduct][CODE_OF_CONDUCT]. By participating in this project you agree to abide by its terms.
## Contributing
We welcome all contributations. First read our [Contributor Code of Conduct][CODE_OF_CONDUCT] and then get started [contributing][CONTRIBUTING].
## License
GNU General Public License v3.0 © [todo.txt org][github]
[release]: https://github.com/todotxt/todo.txt-cli/releases
[website]: http://todotxt.org
[github]: https://github.com/todotxt
[USAGE]: ./USAGE.md
[CHANGELOG]: ./CHANGELOG.md
[CODE_OF_CONDUCT]: ./CODE_OF_CONDUCT.md
[CONTRIBUTING]: ./CONTRIBUTING.md

View File

@@ -1,27 +0,0 @@
h1. TODO.TXT Command Line Interface !https://secure.travis-ci.org/ginatrapani/todo.txt-cli.png?branch=master(Build Status)!:http://travis-ci.org/ginatrapani/todo.txt-cli
A simple and extensible shell script for managing your todo.txt file.
h2. "Downloads":http://github.com/ginatrapani/todo.txt-cli/downloads
"Download the latest stable release":http://github.com/ginatrapani/todo.txt-cli/downloads for use on your desktop or server.
h2. "Documentation":http://wiki.github.com/ginatrapani/todo.txt-cli
* "User Documentation":http://wiki.github.com/ginatrapani/todo.txt-cli/user-documentation - Find out "how to install and use Todo.txt CLI":http://wiki.github.com/ginatrapani/todo.txt-cli/user-documentation, and get tips and tricks.
* "Developer Documentation":http://wiki.github.com/ginatrapani/todo.txt-cli/developer-documentation - "Contribute to Todo.txt CLI":http://wiki.github.com/ginatrapani/todo.txt-cli/developer-documentation and build your own custom add-ons.
h2. "Mailing List":http://groups.yahoo.com/group/todotxt/
Get support from users and developers on the "mailing list":http://groups.yahoo.com/group/todotxt/.
h2. Quick Links
* Original anemic release by "Gina Trapani":http://ginatrapani.org on 5/11/2006.
* Raised to great heights by "brainy and dedicated volunteers":http://github.com/ginatrapani/todo.txt-cli/network.
* Licensed under the "GPL":http://www.gnu.org/copyleft/gpl.html
* "Add-on Directory":https://github.com/ginatrapani/todo.txt-cli/wiki/Todo.sh-Add-on-Directory
https://github.com/ginatrapani/todo.txt-cli/wiki/Creating-and-Installing-Add-ons
* "Changelog":https://github.com/ginatrapani/todo.txt-cli/wiki/Todo.sh-Changelog
* "Known Bugs":http://github.com/ginatrapani/todo.txt-cli/issues

266
USAGE.md Normal file
View File

@@ -0,0 +1,266 @@
# [todo.txt-cli](http://todotxt.org) Usage
```shell
todo.sh [-fhpantvV] [-d todo_config] action [task_number] [task_description]
```
## Actions
### `add`
Adds THING I NEED TO DO to your todo.txt file on its own line.
Project and context notation optional.
Quotes optional.
```shell
todo.sh add "THING I NEED TO DO +project @context"
todo.sh a "THING I NEED TO DO +project @context"
```
### `addm`
Adds FIRST THING I NEED TO DO to your todo.txt on its own line and adds SECOND THING I NEED TO DO to you todo.txt on its own line.
Project and context notation optional.
```shell
todo.sh addm "FIRST THING I NEED TO DO +project1 @context
SECOND THING I NEED TO DO +project2 @context"
```
### `addto`
Adds a line of text to any file located in the todo.txt directory.
For example, `addto inbox.txt "decide about vacation"`
```shell
todo.sh addto DEST "TEXT TO ADD"
```
### `append`
Adds TEXT TO APPEND to the end of the task on line ITEM#.
Quotes optional.
```shell
todo.sh append ITEM# "TEXT TO APPEND"
todo.sh app ITEM# "TEXT TO APPEND"
```
### `archive`
Moves all done tasks from todo.txt to done.txt and removes blank lines.
```shell
todo.sh archive
```
### `command`
Runs the remaining arguments using only todo.sh builtins.
Will not call any `.todo.actions.d` scripts.
```shell
todo.sh command [ACTIONS]
```
### `deduplicate`
Removes duplicate lines from todo.txt.
```shell
todo.sh deduplicate
```
### `del`
Deletes the task on line ITEM# in todo.txt. If TERM specified, deletes only TERM from the task.
```shell
todo.sh del ITEM# [TERM]
todo.sh rm ITEM# [TERM]
```
### `depri`
Deprioritizes (removes the priority) from the task(s) on line ITEM# in todo.txt.
```shell
todo.sh depri ITEM#[, ITEM#, ITEM#, ...]
todo.sh dp ITEM#[, ITEM#, ITEM#, ...]
```
### `do`
Marks task(s) on line ITEM# as done in todo.txt.
```shell
todo.sh do ITEM#[, ITEM#, ITEM#, ...]
```
### `help`
Display help about usage, options, built-in and add-on actions, or just the usage help for the passed ACTION(s).
```shell
todo.sh help [ACTION...]
```
### `list`
Displays all tasks that contain TERM(s) sorted by priority with line numbers. Each task must match all TERM(s) (logical AND); to display tasks that contain any TERM (logical OR), use `"TERM1\|TERM2\|..."` (with quotes), or `TERM1\\|TERM2` (unquoted). Hides all tasks that contain TERM(s) preceded by a minus sign (i.e. `-TERM`).
If no TERM specified, lists entire todo.txt.
```shell
todo.sh list [TERM...]
todo.sh ls [TERM...]
```
### `listall`
Displays all the lines in todo.txt AND done.txt that contain TERM(s) sorted by priority with line numbers. Hides all tasks that contain TERM(s) preceded by a minus sign (i.e. `-TERM`).
If no TERM specified, lists entire todo.txt AND done.txt concatenated and sorted.
```shell
todo.sh listall [TERM...]
todo.sh lsa [TERM...]
```
### `listaddons`
Lists all added and overridden actions in the actions directory.
```shell
todo.sh listaddons
```
### `listcon`
Lists all the task contexts that start with the @ sign in todo.txt.
If TERM specified, considers only tasks that contain TERM(s).
```shell
todo.sh listcon [TERM...]
todo.sh lsc [TERM...]
```
### `listfile`
Displays all the lines in SRC file located in the todo.txt directory, sorted by priority with line numbers. If TERM specified, lists all lines that contain TERM(s) in SRC file. Hides all tasks that contain TERM(s) preceded by a minus sign (i.e. `-TERM`).
Without any arguments, the names of all text files in the todo.txt directory are listed.
```shell
todo.sh listfile [SRC [TERM...]]
todo.sh lf [SRC [TERM...]]
```
### `listpri`
Displays all tasks prioritized PRIORITIES. PRIORITIES can be a single one (A) or a range (A-C). If no PRIORITIES specified, lists all prioritized tasks. If TERM specified, lists only prioritized tasks that contain TERM(s). Hides all tasks that contain TERM(s) preceded by a minus sign (i.e. `-TERM`).
```shell
todo.sh listpri [PRIORITIES] [TERM...]
todo.sh lsp [PRIORITIES] [TERM...]
```
### `listproj`
Lists all the projects (terms that start with a `+` sign) in todo.txt. If TERM specified, considers only tasks that contain TERM(s).
```shell
todo.sh listproj [TERM...]
todo.sh lsprj [TERM...]
```
### `move`
Moves a line from source text file (SRC) to destination text file (DEST). Both source and destination file must be located in the directory defined in the configuration directory. When SRC is not defined it's by default todo.txt.
```shell
todo.sh move ITEM# DEST [SRC]
todo.sh mv ITEM# DEST [SRC]
```
### `prepend`
Adds TEXT TO PREPEND to the beginning of the task on line ITEM#. Quotes optional.
```shell
todo.sh prepend ITEM# "TEXT TO PREPEND"
todo.sh prep ITEM# "TEXT TO PREPEND"
```
### `pri`
Adds PRIORITY to task on line ITEM#. If the task is already prioritized, replaces current priority with new PRIORITY. PRIORITY must be a letter between A and Z.
```shell
todo.sh pri ITEM# PRIORITY
todo.sh p ITEM# PRIORITY
```
### `replace`
Replaces task on line ITEM# with UPDATED TODO.
```shell
todo.sh replace ITEM# "UPDATED TODO"
```
### `report`
Adds the number of open tasks and done tasks to report.txt.
```shell
todo.sh report
```
### `shorthelp`
List the one-line usage of all built-in and add-on actions.
```shell
todo.sh shorthelp
```
## Options
### `-@`
Hide context names in list output. Use twice to show context names (default).
### `-+`
Hide project names in list output. Use twice to show project names (default).
### `-c`
Color mode
### `-d CONFIG_FILE`
Use a configuration file other than the default `~/.todo/config`
### `-f`
Forces actions without confirmation or interactive input.
### `-h`
Display a short help message; same as action "shorthelp"
### `-p`
Plain mode turns off colors
### `-P`
Hide priority labels in list output. Use twice to show priority labels (default).
### `-a`
Don't auto-archive tasks automatically on completion
### `-A`
Auto-archive tasks automatically on completion
### `-n`
Don't preserve line numbers; automatically remove blank lines on task deletion.
### `-N`
Preserve line numbers
### `-t`
Prepend the current date to a task automatically when it's added.
### `-T`
Do not prepend the current date to a task automatically when it's added.
### `-v`
Verbose mode turns on confirmation messages
### `-vv`
Extra verbose mode prints some debugging information and additional help text
### `-V`
Displays version, license and credits
### `-x`
Disables `TODOTXT_FINAL_FILTER`

View File

@@ -37,6 +37,22 @@ TODO: 2 of 2 tasks shown
TODO: 2 deleted.
EOF
test_todo_session 'cmd line first day with lowercase priority' <<EOF
>>> todo.sh -pt add '(b) notice the daisies'
2 (B) 2009-02-13 notice the daisies
TODO: 2 added.
>>> todo.sh -p list
2 (B) 2009-02-13 notice the daisies
1 2009-02-13 notice the daisies
--
TODO: 2 of 2 tasks shown
>>> todo.sh -npf del 2
2 (B) 2009-02-13 notice the daisies
TODO: 2 deleted.
EOF
test_tick
test_todo_session 'cmd line second day' <<EOF

33
tests/t1040-add-priority.sh Executable file
View File

@@ -0,0 +1,33 @@
#!/bin/bash
test_description='test the priority on add feature'
. ./test-lib.sh
## Normal use case
echo "export TODOTXT_PRIORITY_ON_ADD=A" >> todo.cfg
test_todo_session 'config file priority' <<EOF
>>> todo.sh add take out the trash
1 (A) take out the trash
TODO: 1 added.
>>> todo.sh -p list
1 (A) take out the trash
--
TODO: 1 of 1 tasks shown
EOF
## Wrong value in config var
echo "export TODOTXT_PRIORITY_ON_ADD=1" >> todo.cfg
test_todo_session 'config file wrong priority' <<EOF
>>> todo.sh add fail to take out the trash
=== 1
TODOTXT_PRIORITY_ON_ADD should be a capital letter from A to Z (it is now "1").
>>> todo.sh -p list
=== 1
TODOTXT_PRIORITY_ON_ADD should be a capital letter from A to Z (it is now "1").
EOF
test_done

View File

@@ -67,6 +67,10 @@ export REPORT_FILE="$TODO_DIR/report.txt"
# export COLOR_PROJECT=$RED
# export COLOR_CONTEXT=$RED
# ... and for date extensions (due:yyyy-mm-dd, t:yyyy-mm-dd and again:X)
#
# export COLOR_DATEEXT=$LIGHT_BLUE
# === BEHAVIOR ===
## customize list output

205
todo.sh
View File

@@ -1,4 +1,4 @@
#! /bin/bash
#!/usr/bin/env bash
# === HEAVY LIFTING ===
shopt -s extglob extquote
@@ -11,12 +11,10 @@ version() {
cat <<-EndVersion
TODO.TXT Command Line Interface v$VERSION
First release: 5/11/2006
Original conception by: Gina Trapani (http://ginatrapani.org)
Contributors: https://github.com/ginatrapani/todo.txt-cli/network
License: GPL, https://www.gnu.org/copyleft/gpl.html
More information and mailing list at http://todotxt.com
Code repository: https://github.com/ginatrapani/todo.txt-cli/tree/master
Homepage: http://todotxt.org
Code repository: https://github.com/todotxt/todo.txt-cli/
Contributors: https://github.com/todotxt/todo.txt-cli/graphs/contributors
License: https://github.com/todotxt/todo.txt-cli/blob/master/LICENSE
EndVersion
exit 1
}
@@ -53,7 +51,7 @@ shorthelp()
deduplicate
del|rm ITEM# [TERM]
depri|dp ITEM#[, ITEM#, ITEM#, ...]
do ITEM#[, ITEM#, ITEM#, ...]
done|do ITEM#[, ITEM#, ITEM#, ...]
help [ACTION...]
list|ls [TERM...]
listall|lsa [TERM...]
@@ -136,7 +134,7 @@ help()
EndOptionsHelp
[ $TODOTXT_VERBOSE -gt 1 ] && cat <<-'EndVerboseHelp'
[ "$TODOTXT_VERBOSE" -gt 1 ] && cat <<-'EndVerboseHelp'
Environment variables:
TODOTXT_AUTO_ARCHIVE is same as option -a (0)/-A (1)
TODOTXT_CFG_FILE=CONFIG_FILE is same as option -d CONFIG_FILE
@@ -144,6 +142,7 @@ help()
TODOTXT_PRESERVE_LINE_NUMBERS is same as option -n (0)/-N (1)
TODOTXT_PLAIN is same as option -p (1)/-c (0)
TODOTXT_DATE_ON_ADD is same as option -t (1)/-T (0)
TODOTXT_PRIORITY_ON_ADD=pri default priority A-Z
TODOTXT_VERBOSE=1 is same as option -v
TODOTXT_DISABLE_FILTER=1 is same as option -x
TODOTXT_DEFAULT_ACTION="" run this when called with no arguments
@@ -202,6 +201,7 @@ actionsHelp()
Deprioritizes (removes the priority) from the task(s)
on line ITEM# in todo.txt.
done ITEM#[, ITEM#, ITEM#, ...]
do ITEM#[, ITEM#, ITEM#, ...]
Marks task(s) on line ITEM# as done in todo.txt.
@@ -294,7 +294,7 @@ addonHelp()
didPrintAddonActionsHeader=
for action in "$TODO_ACTIONS_DIR"/*
do
if [ -f "$action" -a -x "$action" ]; then
if [ -f "$action" ] && [ -x "$action" ]; then
if [ ! "$didPrintAddonActionsHeader" ]; then
cat <<-EndAddonActionsHeader
Add-on Actions:
@@ -302,14 +302,14 @@ addonHelp()
didPrintAddonActionsHeader=1
fi
"$action" usage
elif [ -d "$action" -a -x "$action/$(basename $action)" ]; then
elif [ -d "$action" ] && [ -x "$action"/"$(basename "$action")" ]; then
if [ ! "$didPrintAddonActionsHeader" ]; then
cat <<-EndAddonActionsHeader
Add-on Actions:
EndAddonActionsHeader
didPrintAddonActionsHeader=1
fi
"$action/$(basename $action)" usage
"$action"/"$(basename "$action")" usage
fi
done
fi
@@ -320,10 +320,10 @@ actionUsage()
for actionName
do
action="${TODO_ACTIONS_DIR}/${actionName}"
if [ -f "$action" -a -x "$action" ]; then
if [ -f "$action" ] && [ -x "$action" ]; then
"$action" usage
elif [ -d "$action" -a -x "$action/$(basename $action)" ]; then
"$action/$(basename $action)" usage
elif [ -d "$action" ] && [ -x "$action"/"$(basename "$action")" ]; then
"$action"/"$(basename "$action")" usage
else
builtinActionUsage=$(actionsHelp | sed -n -e "/^ ${actionName//\//\\/} /,/^\$/p" -e "/^ ${actionName//\//\\/}$/,/^\$/p")
if [ "$builtinActionUsage" ]; then
@@ -378,8 +378,9 @@ getPrefix()
# Parameters: $1: todo file; empty means $TODO_FILE.
# Returns: Uppercase FILE prefix to be used in place of "TODO:" where
# a different todo file can be specified.
local base=$(basename "${1:-$TODO_FILE}")
echo "${base%%.[^.]*}" | tr 'a-z' 'A-Z'
local base
base=$(basename "${1:-$TODO_FILE}")
echo "${base%%.[^.]*}" | tr '[:lower:]' '[:upper:]'
}
getTodo()
@@ -404,8 +405,8 @@ getNewtodo()
# Postcondition: $newtodo contains task text.
local item=$1
[ -z "$item" ] && die 'Programming error: $item should exist.'
[ "${item//[0-9]/}" ] && die 'Programming error: $item should be numeric.'
[ -z "$item" ] && die "Programming error: $item should exist."
[ "${item//[0-9]/}" ] && die "Programming error: $item should be numeric."
newtodo=$(sed "$item!d" "${2:-$TODO_FILE}")
[ -z "$newtodo" ] && die "$(getPrefix "$2"): No updated task $item."
@@ -429,7 +430,7 @@ replaceOrPrepend()
if [[ -z "$1" && $TODOTXT_FORCE = 0 ]]; then
echo -n "$querytext"
read input
read -r -i "$todo" -e input
else
input=$*
fi
@@ -439,7 +440,7 @@ replaceOrPrepend()
priority=$(sed -e "$item!d" -e "${item}s/${priAndDateExpr}.*/\\1/" "$TODO_FILE")
prepdate=$(sed -e "$item!d" -e "${item}s/${priAndDateExpr}.*/\\2/" "$TODO_FILE")
if [ "$prepdate" -a "$action" = "replace" ] && [ "$(echo "$input"|sed -e "s/${priAndDateExpr}.*/\\1\\2/")" ]; then
if [ "$prepdate" ] && [ "$action" = "replace" ] && [ "$(echo "$input"|sed -e "s/${priAndDateExpr}.*/\\1\\2/")" ]; then
# If the replaced text starts with a [priority +] date, it will replace
# the existing date, too.
prepdate=
@@ -450,7 +451,7 @@ replaceOrPrepend()
# date again.
cleaninput "for sed"
sed -i.bak -e "$item s/^${priority}${prepdate}//" -e "$item s|^.*|${priority}${prepdate}${input}${backref}|" "$TODO_FILE"
if [ $TODOTXT_VERBOSE -gt 0 ]; then
if [ "$TODOTXT_VERBOSE" -gt 0 ]; then
getNewtodo "$item"
case "$action" in
replace)
@@ -465,12 +466,26 @@ replaceOrPrepend()
fi
}
uppercasePriority()
{
# Precondition: $input contains task text for which to uppercase priority.
# Postcondition: Modifies $input.
lower=( {a..z} )
upper=( {A..Z} )
for ((i=0; i<26; i++))
do
upperPriority="${upperPriority};s/^[(]${lower[i]}[)]/(${upper[i]})/"
done
input=$(echo "$input" | sed "$upperPriority")
}
#Preserving environment variables so they don't get clobbered by the config file
OVR_TODOTXT_AUTO_ARCHIVE="$TODOTXT_AUTO_ARCHIVE"
OVR_TODOTXT_FORCE="$TODOTXT_FORCE"
OVR_TODOTXT_PRESERVE_LINE_NUMBERS="$TODOTXT_PRESERVE_LINE_NUMBERS"
OVR_TODOTXT_PLAIN="$TODOTXT_PLAIN"
OVR_TODOTXT_DATE_ON_ADD="$TODOTXT_DATE_ON_ADD"
OVR_TODOTXT_PRIORITY_ON_ADD="$TODOTXT_PRIORITY_ON_ADD"
OVR_TODOTXT_DISABLE_FILTER="$TODOTXT_DISABLE_FILTER"
OVR_TODOTXT_VERBOSE="$TODOTXT_VERBOSE"
OVR_TODOTXT_DEFAULT_ACTION="$TODOTXT_DEFAULT_ACTION"
@@ -478,7 +493,7 @@ OVR_TODOTXT_SORT_COMMAND="$TODOTXT_SORT_COMMAND"
OVR_TODOTXT_FINAL_FILTER="$TODOTXT_FINAL_FILTER"
# Prevent GREP_OPTIONS from malforming grep's output
GREP_OPTIONS=""
export GREP_OPTIONS=""
# == PROCESS OPTIONS ==
while getopts ":fhpcnNaAtTvVx+@Pd:" Option
@@ -491,7 +506,7 @@ do
## number shows context names and an odd number hides context
## names.
: $(( HIDE_CONTEXT_NAMES++ ))
if [ $(( $HIDE_CONTEXT_NAMES % 2 )) -eq 0 ]
if [ $(( HIDE_CONTEXT_NAMES % 2 )) -eq 0 ]
then
## Zero or even value -- show context names
unset HIDE_CONTEXTS_SUBSTITUTION
@@ -507,7 +522,7 @@ do
## number shows project names and an odd number hides project
## names.
: $(( HIDE_PROJECT_NAMES++ ))
if [ $(( $HIDE_PROJECT_NAMES % 2 )) -eq 0 ]
if [ $(( HIDE_PROJECT_NAMES % 2 )) -eq 0 ]
then
## Zero or even value -- show project names
unset HIDE_PROJECTS_SUBSTITUTION
@@ -554,7 +569,7 @@ do
## number shows priority labels and an odd number hides priority
## labels.
: $(( HIDE_PRIORITY_LABELS++ ))
if [ $(( $HIDE_PRIORITY_LABELS % 2 )) -eq 0 ]
if [ $(( HIDE_PRIORITY_LABELS % 2 )) -eq 0 ]
then
## Zero or even value -- show priority labels
unset HIDE_PRIORITY_SUBSTITUTION
@@ -578,9 +593,12 @@ do
x)
OVR_TODOTXT_DISABLE_FILTER=1
;;
*)
usage
;;
esac
done
shift $(($OPTIND - 1))
shift $((OPTIND - 1))
# defaults if not yet defined
TODOTXT_VERBOSE=${TODOTXT_VERBOSE:-1}
@@ -590,6 +608,7 @@ TODOTXT_FORCE=${TODOTXT_FORCE:-0}
TODOTXT_PRESERVE_LINE_NUMBERS=${TODOTXT_PRESERVE_LINE_NUMBERS:-1}
TODOTXT_AUTO_ARCHIVE=${TODOTXT_AUTO_ARCHIVE:-1}
TODOTXT_DATE_ON_ADD=${TODOTXT_DATE_ON_ADD:-0}
TODOTXT_PRIORITY_ON_ADD=${TODOTXT_PRIORITY_ON_ADD:-}
TODOTXT_DEFAULT_ACTION=${TODOTXT_DEFAULT_ACTION:-}
TODOTXT_SORT_COMMAND=${TODOTXT_SORT_COMMAND:-env LC_COLLATE=C sort -f -k2}
TODOTXT_DISABLE_FILTER=${TODOTXT_DISABLE_FILTER:-}
@@ -597,7 +616,7 @@ TODOTXT_FINAL_FILTER=${TODOTXT_FINAL_FILTER:-cat}
TODOTXT_GLOBAL_CFG_FILE=${TODOTXT_GLOBAL_CFG_FILE:-/etc/todo/config}
# Export all TODOTXT_* variables
export ${!TODOTXT_@}
export "${!TODOTXT_@}"
# Default color map
export NONE=''
@@ -625,9 +644,10 @@ export PRI_B=$GREEN # color for B priority
export PRI_C=$LIGHT_BLUE # color for C priority
export PRI_X=$WHITE # color unless explicitly defined
# Default project and context colors.
# Default project, context and dateext colors.
export COLOR_PROJECT=$NONE
export COLOR_CONTEXT=$NONE
export COLOR_DATEEXT=$NONE
# Default highlight colors.
export COLOR_DONE=$LIGHT_GREY # color for done (but not yet archived) tasks
@@ -684,7 +704,7 @@ export SENTENCE_DELIMITERS=',.:;'
}
if [ -z "$TODO_ACTIONS_DIR" -o ! -d "$TODO_ACTIONS_DIR" ]
if [ -z "$TODO_ACTIONS_DIR" ] || [ ! -d "$TODO_ACTIONS_DIR" ]
then
TODO_ACTIONS_DIR="$HOME/.todo/actions"
export TODO_ACTIONS_DIR
@@ -729,6 +749,9 @@ fi
if [ -n "$OVR_TODOTXT_DATE_ON_ADD" ] ; then
TODOTXT_DATE_ON_ADD="$OVR_TODOTXT_DATE_ON_ADD"
fi
if [ -n "$OVR_TODOTXT_PRIORITY_ON_ADD" ] ; then
TODOTXT_PRIORITY_ON_ADD="$OVR_TODOTXT_PRIORITY_ON_ADD"
fi
if [ -n "$OVR_TODOTXT_DISABLE_FILTER" ] ; then
TODOTXT_DISABLE_FILTER="$OVR_TODOTXT_DISABLE_FILTER"
fi
@@ -748,16 +771,19 @@ fi
ACTION=${1:-$TODOTXT_DEFAULT_ACTION}
[ -z "$ACTION" ] && usage
[ -d "$TODO_DIR" ] || mkdir -p $TODO_DIR 2> /dev/null || dieWithHelp "$1" "Fatal Error: $TODO_DIR is not a directory"
[ -d "$TODO_DIR" ] || mkdir -p "$TODO_DIR" 2> /dev/null || dieWithHelp "$1" "Fatal Error: $TODO_DIR is not a directory"
( cd "$TODO_DIR" ) || dieWithHelp "$1" "Fatal Error: Unable to cd to $TODO_DIR"
[ -z "$TODOTXT_PRIORITY_ON_ADD" ] \
|| echo "$TODOTXT_PRIORITY_ON_ADD" | grep -q "^[A-Z]$" \
|| die "TODOTXT_PRIORITY_ON_ADD should be a capital letter from A to Z (it is now \"$TODOTXT_PRIORITY_ON_ADD\")."
[ -f "$TODO_FILE" -o -c "$TODO_FILE" ] || > "$TODO_FILE"
[ -f "$DONE_FILE" -o -c "$DONE_FILE" ] || > "$DONE_FILE"
[ -f "$REPORT_FILE" -o -c "$REPORT_FILE" ] || > "$REPORT_FILE"
[ -f "$TODO_FILE" ] || [ -c "$TODO_FILE" ] || > "$TODO_FILE"
[ -f "$DONE_FILE" ] || [ -c "$DONE_FILE" ] || > "$DONE_FILE"
[ -f "$REPORT_FILE" ] || [ -c "$REPORT_FILE" ] || > "$REPORT_FILE"
if [ $TODOTXT_PLAIN = 1 ]; then
for clr in ${!PRI_@}; do
export $clr=$NONE
export "$clr"=$NONE
done
PRI_X=$NONE
DEFAULT=$NONE
@@ -773,13 +799,19 @@ _addto() {
file="$1"
input="$2"
cleaninput
uppercasePriority
if [[ $TODOTXT_DATE_ON_ADD = 1 ]]; then
if [[ "$TODOTXT_DATE_ON_ADD" -eq 1 ]]; then
now=$(date '+%Y-%m-%d')
input=$(echo "$input" | sed -e 's/^\(([A-Z]) \)\{0,1\}/\1'"$now /")
fi
if [[ -n "$TODOTXT_PRIORITY_ON_ADD" ]]; then
if ! echo "$input" | grep -q '^([A-Z])'; then
input=$(echo -n "($TODOTXT_PRIORITY_ON_ADD) " ; echo "$input")
fi
fi
echo "$input" >> "$file"
if [ $TODOTXT_VERBOSE -gt 0 ]; then
if [ "$TODOTXT_VERBOSE" -gt 0 ]; then
TASKNUM=$(sed -n '$ =' "$file")
echo "$TASKNUM $input"
echo "$(getPrefix "$file"): $TASKNUM added."
@@ -847,7 +879,7 @@ _list() {
_format "$src" '' "$@"
if [ $TODOTXT_VERBOSE -gt 0 ]; then
if [ "$TODOTXT_VERBOSE" -gt 0 ]; then
echo "--"
echo "$(getPrefix "$src"): ${NUMTASKS:-0} of ${TOTALTASKS:-0} tasks shown"
fi
@@ -907,7 +939,7 @@ _format()
s/^ /00/;
s/^ /0/;
''' \
| eval ${TODOTXT_SORT_COMMAND} \
| eval "${TODOTXT_SORT_COMMAND}" \
| awk '''
function highlight(colorVar, color) {
color = ENVIRON[colorVar]
@@ -933,6 +965,9 @@ _format()
ctx_beg = highlight("COLOR_CONTEXT")
ctx_end = (ctx_beg ? (highlight("DEFAULT") clr) : "")
dtx_beg = highlight("COLOR_DATEEXT")
dtx_end = (dtx_beg ? (highlight("DEFAULT") clr) : "")
gsub(/[ \t][ \t]*/, "\n&\n")
len = split($0, words, /\n/)
@@ -942,6 +977,8 @@ _format()
printf "%s", prj_beg words[i] prj_end
} else if (words[i] ~ /^[@].*[A-Za-z0-9_]$/) {
printf "%s", ctx_beg words[i] ctx_end
} else if (words[i] ~ /^(due|t|again):/) {
printf "%s", dtx_beg words[i] dtx_end
} else {
printf "%s", words[i]
}
@@ -958,11 +995,11 @@ _format()
)
[ "$filtered_items" ] && echo "$filtered_items"
if [ $TODOTXT_VERBOSE -gt 0 ]; then
if [ "$TODOTXT_VERBOSE" -gt 0 ]; then
NUMTASKS=$( echo -n "$filtered_items" | sed -n '$ =' )
TOTALTASKS=$( echo -n "$items" | sed -n '$ =' )
fi
if [ $TODOTXT_VERBOSE -gt 1 ]; then
if [ "$TODOTXT_VERBOSE" -gt 1 ]; then
echo "TODO DEBUG: Filter Command was: ${filter_command:-cat}"
fi
}
@@ -980,7 +1017,7 @@ listWordsWithSigil()
export -f cleaninput getPrefix getTodo getNewtodo shellquote filtercommand _list listWordsWithSigil getPadding _format die
# == HANDLE ACTION ==
action=$( printf "%s\n" "$ACTION" | tr 'A-Z' 'a-z' )
action=$( printf "%s\n" "$ACTION" | tr '[:upper:]' '[:lower:]' )
## If the first argument is "command", run the rest of the arguments
## using todo.sh builtins.
@@ -991,12 +1028,12 @@ then
## Get rid of "command" from arguments list
shift
## Reset action to new first argument
action=$( printf "%s\n" "$1" | tr 'A-Z' 'a-z' )
elif [ -d "$TODO_ACTIONS_DIR/$action" -a -x "$TODO_ACTIONS_DIR/$action/$action" ]
action=$( printf "%s\n" "$1" | tr '[:upper:]' '[:lower:]' )
elif [ -d "$TODO_ACTIONS_DIR/$action" ] && [ -x "$TODO_ACTIONS_DIR/$action/$action" ]
then
"$TODO_ACTIONS_DIR/$action/$action" "$@"
exit $?
elif [ -d "$TODO_ACTIONS_DIR" -a -x "$TODO_ACTIONS_DIR/$action" ]
elif [ -d "$TODO_ACTIONS_DIR" ] && [ -x "$TODO_ACTIONS_DIR/$action" ]
then
"$TODO_ACTIONS_DIR/$action" "$@"
exit $?
@@ -1007,7 +1044,7 @@ case $action in
"add" | "a")
if [[ -z "$2" && $TODOTXT_FORCE = 0 ]]; then
echo -n "Add: "
read input
read -e -r input
else
[ -z "$2" ] && die "usage: $TODO_SH add \"TODO ITEM\""
shift
@@ -1019,7 +1056,7 @@ case $action in
"addm")
if [[ -z "$2" && $TODOTXT_FORCE = 0 ]]; then
echo -n "Add: "
read input
read -e -r input
else
[ -z "$2" ] && die "usage: $TODO_SH addm \"TODO ITEM\""
shift
@@ -1060,7 +1097,7 @@ case $action in
if [[ -z "$1" && $TODOTXT_FORCE = 0 ]]; then
echo -n "Append: "
read input
read -e -r input
else
input=$*
fi
@@ -1070,8 +1107,8 @@ case $action in
esac
cleaninput "for sed"
if sed -i.bak $item" s|^.*|&${appendspace}${input}|" "$TODO_FILE"; then
if [ $TODOTXT_VERBOSE -gt 0 ]; then
if sed -i.bak "${item} s|^.*|&${appendspace}${input}|" "$TODO_FILE"; then
if [ "$TODOTXT_VERBOSE" -gt 0 ]; then
getNewtodo "$item"
echo "$item $newtodo"
fi
@@ -1083,10 +1120,10 @@ case $action in
"archive" )
# defragment blank lines
sed -i.bak -e '/./!d' "$TODO_FILE"
[ $TODOTXT_VERBOSE -gt 0 ] && grep "^x " "$TODO_FILE"
[ "$TODOTXT_VERBOSE" -gt 0 ] && grep "^x " "$TODO_FILE"
grep "^x " "$TODO_FILE" >> "$DONE_FILE"
sed -i.bak '/^x /d' "$TODO_FILE"
if [ $TODOTXT_VERBOSE -gt 0 ]; then
if [ "$TODOTXT_VERBOSE" -gt 0 ]; then
echo "TODO: $TODO_FILE archived."
fi
;;
@@ -1100,19 +1137,19 @@ case $action in
if [ -z "$3" ]; then
if [ $TODOTXT_FORCE = 0 ]; then
echo "Delete '$todo'? (y/n)"
read ANSWER
read -e -r ANSWER
else
ANSWER="y"
fi
if [ "$ANSWER" = "y" ]; then
if [ $TODOTXT_PRESERVE_LINE_NUMBERS = 0 ]; then
# delete line (changes line numbers)
sed -i.bak -e $item"s/^.*//" -e '/./!d' "$TODO_FILE"
sed -i.bak -e "${item}s/^.*//" -e '/./!d' "$TODO_FILE"
else
# leave blank line behind (preserves line numbers)
sed -i.bak -e $item"s/^.*//" "$TODO_FILE"
sed -i.bak -e "${item}s/^.*//" "$TODO_FILE"
fi
if [ $TODOTXT_VERBOSE -gt 0 ]; then
if [ "$TODOTXT_VERBOSE" -gt 0 ]; then
echo "$item $todo"
echo "TODO: $item deleted."
fi
@@ -1121,18 +1158,18 @@ case $action in
fi
else
sed -i.bak \
-e $item"s/^\((.) \)\{0,1\} *$3 */\1/g" \
-e $item"s/ *$3 *\$//g" \
-e $item"s/ *$3 */ /g" \
-e $item"s/ *$3 */ /g" \
-e $item"s/$3//g" \
-e "${item}s/^\((.) \)\{0,1\} *$3 */\1/g" \
-e "${item}s/ *$3 *\$//g" \
-e "${item}s/ *$3 */ /g" \
-e "${item}s/ *$3 */ /g" \
-e "${item}s/$3//g" \
"$TODO_FILE"
getNewtodo "$item"
if [ "$todo" = "$newtodo" ]; then
[ $TODOTXT_VERBOSE -gt 0 ] && echo "$item $todo"
[ "$TODOTXT_VERBOSE" -gt 0 ] && echo "$item $todo"
die "TODO: '$3' not found; no removal done."
fi
if [ $TODOTXT_VERBOSE -gt 0 ]; then
if [ "$TODOTXT_VERBOSE" -gt 0 ]; then
echo "$item $todo"
echo "TODO: Removed '$3' from task."
echo "$item $newtodo"
@@ -1151,8 +1188,8 @@ case $action in
getTodo "$item"
if [[ "$todo" = \(?\)\ * ]]; then
sed -i.bak -e $item"s/^(.) //" "$TODO_FILE"
if [ $TODOTXT_VERBOSE -gt 0 ]; then
sed -i.bak -e "${item}s/^(.) //" "$TODO_FILE"
if [ "$TODOTXT_VERBOSE" -gt 0 ]; then
getNewtodo "$item"
echo "$item $newtodo"
echo "TODO: $item deprioritized."
@@ -1163,7 +1200,7 @@ case $action in
done
;;
"do" )
"do" | "done" )
errmsg="usage: $TODO_SH do ITEM#[, ITEM#, ITEM#, ...]"
# shift so we get arguments to the do request
shift;
@@ -1178,9 +1215,9 @@ case $action in
if [ "${todo:0:2}" != "x " ]; then
now=$(date '+%Y-%m-%d')
# remove priority once item is done
sed -i.bak $item"s/^(.) //" "$TODO_FILE"
sed -i.bak $item"s|^|x $now |" "$TODO_FILE"
if [ $TODOTXT_VERBOSE -gt 0 ]; then
sed -i.bak "${item}s/^(.) //" "$TODO_FILE"
sed -i.bak "${item}s|^|x $now |" "$TODO_FILE"
if [ "$TODOTXT_VERBOSE" -gt 0 ]; then
getNewtodo "$item"
echo "$item $newtodo"
echo "TODO: $item marked as done."
@@ -1237,7 +1274,7 @@ case $action in
post_filter_command="${post_filter_command:-}${post_filter_command:+ | }awk -v TOTAL=$TOTAL -v PADDING=$PADDING '{ \$1 = sprintf(\"%\" PADDING \"d\", (\$1 > TOTAL ? 0 : \$1)); print }' "
cat "$TODO_FILE" "$DONE_FILE" | TODOTXT_VERBOSE=0 _format '' "$PADDING" "$@"
if [ $TODOTXT_VERBOSE -gt 0 ]; then
if [ "$TODOTXT_VERBOSE" -gt 0 ]; then
TDONE=$( sed -n '$ =' "$DONE_FILE" )
TASKNUM=$(TODOTXT_PLAIN=1 TODOTXT_VERBOSE=0 _format "$TODO_FILE" 1 "$@" | sed -n '$ =')
DONENUM=$(TODOTXT_PLAIN=1 TODOTXT_VERBOSE=0 _format "$DONE_FILE" 1 "$@" | sed -n '$ =')
@@ -1251,8 +1288,8 @@ case $action in
"listfile" | "lf" )
shift ## Was listfile, next $1 is file name
if [ $# -eq 0 ]; then
[ $TODOTXT_VERBOSE -gt 0 ] && echo "Files in the todo.txt directory:"
cd "$TODO_DIR" && ls -1 *.txt
[ "$TODOTXT_VERBOSE" -gt 0 ] && echo "Files in the todo.txt directory:"
cd "$TODO_DIR" && ls -1 -- *.txt
else
FILE="$1"
shift ## Was filename; next $1 is first search term
@@ -1274,7 +1311,7 @@ case $action in
"listpri" | "lsp" )
shift ## was "listpri", new $1 is priority to list or first TERM
pri=$(printf "%s\n" "$1" | tr 'a-z' 'A-Z' | grep -e '^[A-Z]$' -e '^[A-Z]-[A-Z]$') && shift || pri="A-Z"
pri=$(printf "%s\n" "$1" | tr '[:lower:]' '[:upper:]' | grep -e '^[A-Z]$' -e '^[A-Z]-[A-Z]$') && shift || pri="A-Z"
post_filter_command="${post_filter_command:-}${post_filter_command:+ | }grep '^ *[0-9]\+ ([${pri}]) '"
_list "$TODO_FILE" "$@"
;;
@@ -1296,21 +1333,21 @@ case $action in
[ -z "$todo" ] && die "$item: No such item in $src."
if [ $TODOTXT_FORCE = 0 ]; then
echo "Move '$todo' from $src to $dest? (y/n)"
read ANSWER
read -e -r ANSWER
else
ANSWER="y"
fi
if [ "$ANSWER" = "y" ]; then
if [ $TODOTXT_PRESERVE_LINE_NUMBERS = 0 ]; then
# delete line (changes line numbers)
sed -i.bak -e $item"s/^.*//" -e '/./!d' "$src"
sed -i.bak -e "${item}s/^.*//" -e '/./!d' "$src"
else
# leave blank line behind (preserves line numbers)
sed -i.bak -e $item"s/^.*//" "$src"
sed -i.bak -e "${item}s/^.*//" "$src"
fi
echo "$todo" >> "$dest"
if [ $TODOTXT_VERBOSE -gt 0 ]; then
if [ "$TODOTXT_VERBOSE" -gt 0 ]; then
echo "$item $todo"
echo "TODO: $item moved from '$src' to '$dest'."
fi
@@ -1326,7 +1363,7 @@ case $action in
"pri" | "p" )
item=$2
newpri=$( printf "%s\n" "$3" | tr 'a-z' 'A-Z' )
newpri=$( printf "%s\n" "$3" | tr '[:lower:]' '[:upper:]' )
errmsg="usage: $TODO_SH pri ITEM# PRIORITY
note: PRIORITY must be anywhere from A to Z."
@@ -1341,9 +1378,9 @@ note: PRIORITY must be anywhere from A to Z."
fi
if [ "$oldpri" != "$newpri" ]; then
sed -i.bak -e $item"s/^(.) //" -e $item"s/^/($newpri) /" "$TODO_FILE"
sed -i.bak -e "${item}s/^(.) //" -e "${item}s/^/($newpri) /" "$TODO_FILE"
fi
if [ $TODOTXT_VERBOSE -gt 0 ]; then
if [ "$TODOTXT_VERBOSE" -gt 0 ]; then
getNewtodo "$item"
echo "$item $newtodo"
if [ "$oldpri" != "$newpri" ]; then
@@ -1377,12 +1414,12 @@ note: PRIORITY must be anywhere from A to Z."
LASTDATA=${LASTREPORT#* } # Strip timestamp.
if [ "$LASTDATA" = "$NEWDATA" ]; then
echo "$LASTREPORT"
[ $TODOTXT_VERBOSE -gt 0 ] && echo "TODO: Report file is up-to-date."
[ "$TODOTXT_VERBOSE" -gt 0 ] && echo "TODO: Report file is up-to-date."
else
NEWREPORT="$(date +%Y-%m-%dT%T) ${NEWDATA}"
echo "${NEWREPORT}" >> "$REPORT_FILE"
echo "${NEWREPORT}"
[ $TODOTXT_VERBOSE -gt 0 ] && echo "TODO: Report file updated."
[ "$TODOTXT_VERBOSE" -gt 0 ] && echo "TODO: Report file updated."
fi
;;
@@ -1435,9 +1472,9 @@ note: PRIORITY must be anywhere from A to Z."
cd "$TODO_ACTIONS_DIR" || exit $?
for action in *
do
if [ -f "$action" -a -x "$action" ]; then
if [ -f "$action" ] && [ -x "$action" ]; then
echo "$action"
elif [ -d "$action" -a -x "$action/$action" ]; then
elif [ -d "$action" ] && [ -x "$action/$action" ]; then
echo "$action"
fi
done

20
todo_completion Normal file → Executable file
View File

@@ -19,33 +19,33 @@ _todo()
local _todo_sh=${_todo_sh:-todo.sh}
local completions
if [ $COMP_CWORD -eq 1 ]; then
completions="$COMMANDS $(eval TODOTXT_VERBOSE=0 $_todo_sh command listaddons) $OPTS"
completions="$COMMANDS $(eval TODOTXT_VERBOSE=0 $_todo_sh command listaddons 2>/dev/null) $OPTS"
elif [[ $COMP_CWORD -gt 2 && ( \
"${COMP_WORDS[COMP_CWORD-2]}" =~ $MOVE_COMMAND_PATTERN || \
"${COMP_WORDS[COMP_CWORD-3]}" =~ $MOVE_COMMAND_PATTERN ) ]]; then
# "move ITEM# DEST [SRC]" has file arguments on positions 2 and 3.
completions=$(eval TODOTXT_VERBOSE=0 $_todo_sh command listfile)
completions=$(eval TODOTXT_VERBOSE=0 $_todo_sh command listfile 2>/dev/null)
else
case "$prev" in
command)
completions=$COMMANDS;;
help)
completions="$COMMANDS $(eval TODOTXT_VERBOSE=0 $_todo_sh command listaddons)";;
completions="$COMMANDS $(eval TODOTXT_VERBOSE=0 $_todo_sh command listaddons 2>/dev/null)";;
addto|listfile|lf)
completions=$(eval TODOTXT_VERBOSE=0 $_todo_sh command listfile);;
-*) completions="$COMMANDS $(eval TODOTXT_VERBOSE=0 $_todo_sh command listaddons) $OPTS";;
completions=$(eval TODOTXT_VERBOSE=0 $_todo_sh command listfile 2>/dev/null);;
-*) completions="$COMMANDS $(eval TODOTXT_VERBOSE=0 $_todo_sh command listaddons 2>/dev/null) $OPTS";;
*) case "$cur" in
+*) completions=$(eval TODOTXT_VERBOSE=0 $_todo_sh command listproj)
+*) completions=$(eval TODOTXT_VERBOSE=0 $_todo_sh command listproj 2>/dev/null)
COMPREPLY=( $( compgen -W "$completions" -- $cur ))
[ ${#COMPREPLY[@]} -gt 0 ] && return 0
# Fall back to projects extracted from done tasks.
completions=$(eval 'TODOTXT_VERBOSE=0 TODOTXT_SOURCEVAR=\$DONE_FILE' $_todo_sh command listproj)
completions=$(eval 'TODOTXT_VERBOSE=0 TODOTXT_SOURCEVAR=\$DONE_FILE' $_todo_sh command listproj 2>/dev/null)
;;
@*) completions=$(eval TODOTXT_VERBOSE=0 $_todo_sh command listcon)
@*) completions=$(eval TODOTXT_VERBOSE=0 $_todo_sh command listcon 2>/dev/null)
COMPREPLY=( $( compgen -W "$completions" -- $cur ))
[ ${#COMPREPLY[@]} -gt 0 ] && return 0
# Fall back to contexts extracted from done tasks.
completions=$(eval 'TODOTXT_VERBOSE=0 TODOTXT_SOURCEVAR=\$DONE_FILE' $_todo_sh command listcon)
completions=$(eval 'TODOTXT_VERBOSE=0 TODOTXT_SOURCEVAR=\$DONE_FILE' $_todo_sh command listcon 2>/dev/null)
;;
*) if [[ "$cur" =~ ^[0-9]+$ ]]; then
# Remove the (padded) task number; we prepend the
@@ -60,7 +60,7 @@ _todo()
# Finally, limit the output to a single line just as
# a safety check of the ls action output.
local todo=$( \
eval TODOTXT_VERBOSE=0 $_todo_sh '-@ -+ -p -x command ls "^ *${cur} "' | \
eval TODOTXT_VERBOSE=0 $_todo_sh '-@ -+ -p -x command ls "^ *${cur} "' 2>/dev/null | \
sed -e 's/^ *[0-9]\{1,\} //' -e 's/^\((.) \)\{0,1\}[0-9]\{2,4\}-[0-9]\{2\}-[0-9]\{2\} /\1/' \
-e 's/^\([xX] \)\([0-9]\{2,4\}-[0-9]\{2\}-[0-9]\{2\} \)\{1,2\}/\1/' \
-e 's/[[:space:]]*$//' \