doing 2.1.13 → 2.1.17

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (94) hide show
  1. checksums.yaml +4 -4
  2. data/.irbrc +1 -0
  3. data/.yardoc/checksums +14 -12
  4. data/.yardoc/object_types +0 -0
  5. data/.yardoc/objects/root.dat +0 -0
  6. data/CHANGELOG.md +76 -0
  7. data/Gemfile.lock +9 -2
  8. data/README.md +56 -19
  9. data/bin/doing +218 -68
  10. data/docs/doc/Array.html +117 -3
  11. data/docs/doc/BooleanTermParser/Clause.html +1 -1
  12. data/docs/doc/BooleanTermParser/Operator.html +1 -1
  13. data/docs/doc/BooleanTermParser/Query.html +1 -1
  14. data/docs/doc/BooleanTermParser/QueryParser.html +1 -1
  15. data/docs/doc/BooleanTermParser/QueryTransformer.html +1 -1
  16. data/docs/doc/BooleanTermParser.html +1 -1
  17. data/docs/doc/Doing/Color.html +6 -2
  18. data/docs/doc/Doing/Completion.html +1 -1
  19. data/docs/doc/Doing/Configuration.html +8 -4
  20. data/docs/doc/Doing/Errors/DoingNoTraceError.html +1 -1
  21. data/docs/doc/Doing/Errors/DoingRuntimeError.html +1 -1
  22. data/docs/doc/Doing/Errors/DoingStandardError.html +1 -1
  23. data/docs/doc/Doing/Errors/EmptyInput.html +1 -1
  24. data/docs/doc/Doing/Errors/NoResults.html +1 -1
  25. data/docs/doc/Doing/Errors/PluginException.html +1 -1
  26. data/docs/doc/Doing/Errors/UserCancelled.html +1 -1
  27. data/docs/doc/Doing/Errors/WrongCommand.html +1 -1
  28. data/docs/doc/Doing/Errors.html +1 -1
  29. data/docs/doc/Doing/Hooks.html +1 -1
  30. data/docs/doc/Doing/Item.html +340 -14
  31. data/docs/doc/Doing/Items.html +2 -2
  32. data/docs/doc/Doing/LogAdapter.html +1 -1
  33. data/docs/doc/Doing/Note.html +2 -2
  34. data/docs/doc/Doing/Pager.html +1 -1
  35. data/docs/doc/Doing/Plugins.html +1 -1
  36. data/docs/doc/Doing/Prompt.html +103 -1
  37. data/docs/doc/Doing/Section.html +1 -1
  38. data/docs/doc/Doing/TemplateString.html +2 -2
  39. data/docs/doc/Doing/Util/Backup.html +1 -1
  40. data/docs/doc/Doing/Util.html +1 -1
  41. data/docs/doc/Doing/WWID.html +77 -71
  42. data/docs/doc/Doing.html +3 -3
  43. data/docs/doc/GLI/Commands/MarkdownDocumentListener.html +1 -1
  44. data/docs/doc/GLI/Commands.html +1 -1
  45. data/docs/doc/GLI.html +1 -1
  46. data/docs/doc/Hash.html +1 -1
  47. data/docs/doc/Numeric.html +279 -0
  48. data/docs/doc/PhraseParser/Operator.html +1 -1
  49. data/docs/doc/PhraseParser/PhraseClause.html +1 -1
  50. data/docs/doc/PhraseParser/Query.html +1 -1
  51. data/docs/doc/PhraseParser/QueryParser.html +1 -1
  52. data/docs/doc/PhraseParser/QueryTransformer.html +1 -1
  53. data/docs/doc/PhraseParser/TermClause.html +1 -1
  54. data/docs/doc/PhraseParser.html +1 -1
  55. data/docs/doc/Status.html +1 -1
  56. data/docs/doc/String.html +997 -118
  57. data/docs/doc/Symbol.html +1 -1
  58. data/docs/doc/Time.html +1 -1
  59. data/docs/doc/_index.html +14 -9
  60. data/docs/doc/class_list.html +1 -1
  61. data/docs/doc/file.README.html +41 -15
  62. data/docs/doc/index.html +41 -15
  63. data/docs/doc/method_list.html +449 -305
  64. data/docs/doc/top-level-namespace.html +2 -2
  65. data/docs/index.md +56 -19
  66. data/doing.gemspec +2 -0
  67. data/doing.rdoc +76 -9
  68. data/example_plugin.rb +2 -4
  69. data/lib/completion/_doing.zsh +17 -17
  70. data/lib/completion/doing.bash +25 -25
  71. data/lib/completion/doing.fish +18 -6
  72. data/lib/doing/array_chronify.rb +57 -0
  73. data/lib/doing/colors.rb +4 -0
  74. data/lib/doing/configuration.rb +6 -2
  75. data/lib/doing/item.rb +108 -0
  76. data/lib/doing/log_adapter.rb +3 -3
  77. data/lib/doing/numeric_chronify.rb +40 -0
  78. data/lib/doing/plugins/export/dayone_export.rb +1 -1
  79. data/lib/doing/plugins/export/json_export.rb +2 -2
  80. data/lib/doing/plugins/export/template_export.rb +49 -90
  81. data/lib/doing/plugins/import/calendar_import.rb +13 -1
  82. data/lib/doing/plugins/import/doing_import.rb +12 -1
  83. data/lib/doing/plugins/import/timing_import.rb +13 -1
  84. data/lib/doing/prompt.rb +65 -1
  85. data/lib/doing/string.rb +137 -33
  86. data/lib/doing/string_chronify.rb +112 -14
  87. data/lib/doing/template_string.rb +1 -1
  88. data/lib/doing/time.rb +6 -6
  89. data/lib/doing/util_backup.rb +1 -1
  90. data/lib/doing/version.rb +1 -1
  91. data/lib/doing/wwid.rb +117 -106
  92. data/lib/doing.rb +36 -31
  93. data/lib/examples/plugins/say_export.rb +1 -4
  94. metadata +46 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c12d0846431cd0468f217f3e1e9b80bcb9a86038fbee7ff057c1db8ad6c56bb3
4
- data.tar.gz: a144f25b2798825ad042d690e21c1a798b83e06e49480c92be7acea752d37e48
3
+ metadata.gz: e904ebbd440b847f32f6d2cf8b323b662c974c485453400c058a1c7df08e0cd5
4
+ data.tar.gz: 38077937c8cb1616a83a965f0f4f004812a2c6333bf40a2d7f96832e575369ae
5
5
  SHA512:
6
- metadata.gz: 66f76cd0588f4dca848c94313051bcb39bc776c4679b8bd9a648887dd764dcc3232d45e18bb260edb7500e3c398aef8a02216a11ce5a593b8822f89267c92214
7
- data.tar.gz: bc852708998d6e670fe72c882f2e254f64bbec487cd56b659e75220bdd5a5c75b5495d1a9b4a734d56825a00563b1b3052bdcd2c4a93761479a2bbe9a2eb397d
6
+ metadata.gz: 1981ea1841ac4bf1d0efb5c16a31cfdfc249e102c8d9dc9b006eecdfb501e229ba811c5764389efcde99e7d5b967801dd321a9254f9ed823b307c8ce1e885a44
7
+ data.tar.gz: b6d28943f49011a44970b96aa3f7ddf7e44aef9d4089c6a1cf232d4bebd7021e7b6a7da4cfccdcd89aef5a1dbb45b2f8a05acb1e6c1ec424a742293c0d90d7d5
data/.irbrc ADDED
@@ -0,0 +1 @@
1
+ require_relative 'lib/doing'
data/.yardoc/checksums CHANGED
@@ -1,28 +1,30 @@
1
1
  lib/doing/hash.rb c2960de9603dcf90be85ce423d9430de27f4f893
2
- lib/doing/item.rb 54cea2275eaa19a9285e358c51f8630a558730ee
2
+ lib/doing/item.rb 276880933fef8a4e1ef7a80e92f0f2b029f8a6e7
3
3
  lib/doing/note.rb bbadd9e34e6dc43a2af1110a5107f46c39d2547f
4
- lib/doing/time.rb 4411af636082d3abf6f6402a7d6c9038d96a9ead
4
+ lib/doing/time.rb 60183c3c31532ffea1440c766de0f90042e0fd10
5
5
  lib/doing/util.rb 33ad79455893213a0f2993edec0e158526657f09
6
- lib/doing/wwid.rb a6e14548e14219d46a6fdc1c9c9accb5f4277654
6
+ lib/doing/wwid.rb 58998ec0fccfa8450f7c065e1994acc6f314e819
7
7
  lib/doing/array.rb a17004c4811d239932254f9ed94a6eb10456c8e8
8
8
  lib/doing/hooks.rb acf6e0615ccf1949f84915c979297845242c1205
9
9
  lib/doing/items.rb 8cda7caaef10645893267262f5eee681e35046ce
10
10
  lib/doing/pager.rb b58e478b0cb8d400ddb97988ba741e3a127b53c3
11
- lib/doing/colors.rb 9a628d48c821313c502deedc5b61a046a2bf79ef
11
+ lib/doing/colors.rb b7239a69e10c5df9378a5843441af5b93c1872f8
12
12
  lib/doing/errors.rb af07e482a5389924edc2337749c81cda501098f0
13
- lib/doing/prompt.rb a78b6f4488fe58b5653ce541a88d24559661459c
14
- lib/doing/string.rb 7cbe3e0bd136c52f7b12d4d6133afe20fe204be2
13
+ lib/doing/prompt.rb 1c48923fc61d8714e3fc1f24b52fb8f358a8cc24
14
+ lib/doing/string.rb f5327c42aa2563d95f93d4c77a099b7076c3ea5f
15
15
  lib/doing/symbol.rb 309799458a1bc715c2707307c9a62ab26086275e
16
16
  lib/doing/section.rb 206e119cf818f1e76798753e611180fe77bc299a
17
- lib/doing/version.rb d2b8ae34e7fd7354adae5386fe3ed84c88e5dc88
17
+ lib/doing/version.rb c8b901ea8187c93194d977cb05924c4a6d6ccc7e
18
18
  lib/doing/cli_status.rb dbedd454c4cbbd0fed9ef30120f6ec85d18b9356
19
19
  lib/doing/completion.rb c658e7dc7898fb022a21b2bd77bedb958ca3b067
20
- lib/doing/log_adapter.rb 6cf0c9a405d17449643e54d35a04897b1da44eaf
21
- lib/doing/util_backup.rb c1bda6ee3acc9a5f649df47590e67ff8b1e90c50
22
- lib/doing/configuration.rb fc72d4343740a551988a7f56c426a62d51f85e65
20
+ lib/doing/log_adapter.rb 57d831259f48d0757307244d35b87e9ffa9099d9
21
+ lib/doing/util_backup.rb c13f71072581b1f0d2269853611ba09273261bf9
22
+ lib/doing/configuration.rb b8667ff80c7c8830108e5089a5d309356af64151
23
23
  lib/doing/phrase_parser.rb 8f1789d7cf8326d8cc231b4a21505a93f8de20d2
24
+ lib/doing/array_chronify.rb 5852b38643aef2e7e796aaf19b2c052a52ee5e2b
24
25
  lib/doing/plugin_manager.rb cb16a82c3182ef7008359670ab96ff6b39270ccc
25
- lib/doing/string_chronify.rb ccbb08389d2139c7121203f8585864e3026d1526
26
- lib/doing/template_string.rb 6dfb28b922059189b072e6d9fe1fcba8aad6c6fe
26
+ lib/doing/string_chronify.rb 62635041c94482927fb661ac0caa2eb9bdd1c17c
27
+ lib/doing/template_string.rb 5f6ef0495082339f2aa1b085ac4c1bdbfeb25be5
28
+ lib/doing/numeric_chronify.rb bedeff62a95f8a8ff116e1bf0cc1d9eb2707a900
27
29
  lib/doing/boolean_term_parser.rb 075977892ac5c6e3435cb8877d8b8b68eb1962e3
28
30
  lib/doing/markdown_document_listener.rb 45485f225068a34951ec818a345f642323e5ba35
data/.yardoc/object_types CHANGED
Binary file
Binary file
data/CHANGELOG.md CHANGED
@@ -1,3 +1,79 @@
1
+ ### 2.1.17
2
+
3
+ 2022-01-18 07:26
4
+
5
+ #### NEW
6
+
7
+ - `--hilite` option for `doing search` to highlight matches in search results (terminal output only)
8
+ - `--hilite` flag for `show` and `view` to highlight results when used with `--search`
9
+
10
+ #### IMPROVED
11
+
12
+ - Show preview of up to 5 items when confirming a delete operation so you actually know what you're deleting
13
+ - Allow `--ask` when creating new entry via STDIN pipe
14
+ - Tab completion for known tags when creating an entry interactively
15
+ - Add purple as an alias for magenta in template colors
16
+
17
+ #### FIXED
18
+
19
+ - Clear STDIN before requesting input
20
+
21
+ ### 2.1.16
22
+
23
+ 2022-01-18 02:45
24
+
25
+ #### NEW
26
+
27
+ - `doing done --from "3pm to 3:15pm"` to set start and end times with natural language string
28
+
29
+ #### IMPROVED
30
+
31
+ - Running `doing tag` without arguments takes command line input
32
+ - If `doing now` or `doing later` are run without arguments, interactively request necessary information (you can still use --editor to edit in your preferred editor)
33
+ - Tab completion for tags when entering at prompt
34
+ - Use readline when requesting input text, better editing features
35
+ - `doing done --at` no longer overrides `--back`
36
+
37
+ #### FIXED
38
+
39
+ - `doing select` -> output formatted empty output
40
+ - Sort items by date when using `doing select --editor` (was loading in selection order instead)
41
+ - Ruby 2.7 error in template output (.empty? on FalseClass)
42
+ - Don't add empty entry when cancelling --editor
43
+ - Batch editing bugs
44
+
45
+ ### 2.1.15
46
+
47
+ 2022-01-17 07:25
48
+
49
+ #### NEW
50
+
51
+ - When completing an entry, if the elapsed time would be greater than a (configurable) amount, doing will now ask for confirmation and allow you to enter a new duration before setting the @done date
52
+
53
+ #### IMPROVED
54
+
55
+ - When entering intervals, you can now use 1h30m in addition to 1.5h or 90m
56
+ - Date expansion works in more circumstances
57
+ - You can include date tags with natural language values when adding tags via `doing select`
58
+
59
+ #### FIXED
60
+
61
+ - Tags containing values with spaces no longer cause errors
62
+
63
+ ### 2.1.14
64
+
65
+ #### NEW
66
+
67
+ - All commands that accept --note now accept --ask, which requests input via readline after creating the note. Multiple lines are allowed, hit return twice to end editing. Works alongside --note and --editor
68
+
69
+ #### IMPROVED
70
+
71
+ - Implement --search and --from filtering for import plugins
72
+ - UTC format date strings in select menus for consistency (was relative date formatting)
73
+ - Don't populate the fzf search with --search, it's already filtered. Separated --query from --search if you do want to populate the query string in addition to --search filtering
74
+ - When showing relative dates, don't include the year if the date is the previous year but a later month than the current month (less than a year old)
75
+ - When using --editor while adding an entry, include any note specified on the command line or via --ask for further editing
76
+
1
77
  ### 2.1.13
2
78
 
3
79
  #### NEW
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- doing (2.1.13)
4
+ doing (2.1.17)
5
5
  chronic (~> 0.10, >= 0.10.2)
6
6
  deep_merge (~> 1.2, >= 1.2.1)
7
7
  gli (~> 2.19, >= 2.19.2)
@@ -12,6 +12,8 @@ PATH
12
12
  tty-link (~> 0.1, >= 0.1.1)
13
13
  tty-markdown (~> 0.7, >= 0.7.0)
14
14
  tty-progressbar (~> 0.18, >= 0.18.2)
15
+ tty-reader (~> 0.9, >= 0.9.0)
16
+ tty-screen (~> 0.8, >= 0.8.1)
15
17
  tty-which (~> 0.5, >= 0.5.0)
16
18
 
17
19
  GEM
@@ -65,7 +67,7 @@ GEM
65
67
  cucumber-core (~> 8.0, >= 8.0.1)
66
68
  cucumber-cucumber-expressions (~> 10.3, >= 10.3.0)
67
69
  cucumber-messages (~> 13.0, >= 13.0.1)
68
- deep_merge (1.2.1)
70
+ deep_merge (1.2.2)
69
71
  diff-lcs (1.4.4)
70
72
  ffi (1.15.4)
71
73
  github-markup (4.0.0)
@@ -131,6 +133,10 @@ GEM
131
133
  tty-cursor (~> 0.7)
132
134
  tty-screen (~> 0.8)
133
135
  unicode-display_width (>= 1.6, < 3.0)
136
+ tty-reader (0.9.0)
137
+ tty-cursor (~> 0.7)
138
+ tty-screen (~> 0.8)
139
+ wisper (~> 2.0)
134
140
  tty-screen (0.8.1)
135
141
  tty-spinner (0.9.3)
136
142
  tty-cursor (~> 0.7)
@@ -139,6 +145,7 @@ GEM
139
145
  concurrent-ruby (~> 1.0)
140
146
  unicode-display_width (2.1.0)
141
147
  unicode_utils (1.4.0)
148
+ wisper (2.0.1)
142
149
  yard (0.9.26)
143
150
  zeitwerk (2.5.1)
144
151
 
data/README.md CHANGED
@@ -1,55 +1,92 @@
1
1
  # doing
2
2
 
3
- **A command line tool for remembering what you were doing and tracking what you've done.**
3
+ **A command line tool for remembering what you were doing and tracking what
4
+ you've done.**
4
5
 
5
- _If you're one of the rare people like me who find this useful, feel free to [buy me some coffee](http://brettterpstra.com/donate/)._
6
+ _If you're one of the rare people like me who find this useful, feel free to
7
+ [buy me some coffee][donate]._
6
8
 
7
9
  <!--README-->
8
10
 
9
- The current version of `doing` is <!--VER-->2.1.12<!--END VER-->.
11
+ The current version of `doing` is <!--VER-->2.1.16<!--END VER-->.
10
12
 
11
- Find all of the documentation in the [doing wiki](https://github.com/ttscoff/doing/wiki).
13
+ Find all of the documentation in the [doing wiki][wiki].
12
14
 
13
- See [what's new in Doing 2.0](https://brettterpstra.com/2021/11/20/doing-2-dot-0/).
15
+ See [what's new in Doing 2.0][doing 2].
14
16
 
15
- Check out some craziness with Doing in the [iTerm status bar](https://brettterpstra.com/2021/10/15/see-what-youre-doing-in-the-iterm-status-bar/) and the [Mac Touch Bar/menu bar](https://brettterpstra.com/2021/07/21/crazy-bettertouchtool-touch-bar-simulator/).
17
+ Check out some craziness with Doing in the [iTerm status bar][status bar] and
18
+ the [Mac Touch Bar/menu bar][touch bar].
16
19
 
17
20
  ## What and why
18
21
 
19
- `doing` is a basic CLI for adding and listing "what was I doing" reminders in a [TaskPaper-formatted](https://www.taskpaper.com) text file. It allows for multiple sections/categories and flexible output formatting.
22
+ `doing` is a basic CLI for adding and listing "what was I doing" reminders in a
23
+ [TaskPaper-formatted](https://www.taskpaper.com) text file. It allows for
24
+ multiple sections/categories and flexible output formatting.
20
25
 
21
- While I'm working, I have hourly reminders to record what I'm working on, and I try to remember to punch in quick notes if I'm unexpectedly called away from a project. I can do this just by typing `doing now tracking down the CG bug`.
26
+ While I'm working, I have hourly reminders to record what I'm working on, and I
27
+ try to remember to punch in quick notes if I'm unexpectedly called away from a
28
+ project. I can do this just by typing `doing now tracking down the CG bug`.
22
29
 
23
- If there's something I want to look at later but doesn't need to be added to a task list or tracker, I can type `doing later check out the pinboard bookmarks from macdrifter`. When I get back to my computer --- or just need a refresher after a distraction --- I can type `doing last` to see what the last thing on my plate was. I can also type `doing recent` (or just `doing`) to get a list of the last few entries. `doing today` gives me everything since midnight for the current day, making it easy to see what I've accomplished over a sleepless night.
30
+ If there's something I want to look at later but doesn't need to be added to a
31
+ task list or tracker, I can type `doing later check out the pinboard bookmarks
32
+ from macdrifter`. When I get back to my computer --- or just need a refresher
33
+ after a distraction --- I can type `doing last` to see what the last thing on
34
+ my plate was. I can also type `doing recent` (or just `doing`) to get a list of
35
+ the last few entries. `doing today` gives me everything since midnight for the
36
+ current day, making it easy to see what I've accomplished over a sleepless
37
+ night.
24
38
 
25
- Doing has over 30 commands for tracking your status, recording your time, and analyzing the results.
39
+ Doing has over 30 commands for tracking your status, recording your time, and
40
+ analyzing the results.
26
41
 
27
- See [the wiki](https://github.com/ttscoff/doing/wiki) for installation and usage instructions.
42
+ See [the wiki][wiki] for installation and usage instructions.
28
43
 
29
44
  ## Launchbar/Alfred
30
45
 
31
- The LaunchBar action requires that `doing` be available in `/usr/local/bin/doing`. If it's not (because you're using RVM or similar), you'll need to symlink it there. Running the action with Return will show the latest 9 items from Currently, along with any time intervals recorded, and includes a submenu of Timers for each tag.
46
+ The LaunchBar action requires that `doing` be available in
47
+ `/usr/local/bin/doing`. If it's not (because you're using RVM or similar),
48
+ you'll need to symlink it there. Running the action with Return will show the
49
+ latest 9 items from Currently, along with any time intervals recorded, and
50
+ includes a submenu of Timers for each tag.
32
51
 
33
- Pressing Spacebar and typing allows you to add a new entry to currently. You an also trigger a custom show command by typing "show [section/tag]" and hitting return. Include any command line flags at the end of the string, and if you add text in parenthesis, it will be processed as a note on the entry.
52
+ Pressing Spacebar and typing allows you to add a new entry to currently. You an
53
+ also trigger a custom show command by typing "show [section/tag]" and hitting
54
+ return. Include any command line flags at the end of the string, and if you add
55
+ text in parenthesis, it will be processed as a note on the entry.
34
56
 
35
- Point of interest, the LaunchBar Action makes use of the `-o json` flag for outputting JSON to the action's script for parsing.
57
+ Point of interest, the LaunchBar Action makes use of the `-o json` flag for
58
+ outputting JSON to the action's script for parsing.
36
59
 
37
60
  <!--GITHUB-->
38
61
 
39
- See the [doing project on BrettTerpstra.com](https://brettterpstra.com/projects/doing/) for the download.
62
+ See the [doing project on BrettTerpstra.com][bt doing] for the download.
40
63
 
41
64
  <!--END GITHUB-->
42
65
  <!--JEKYLL
43
66
  {% download 117 %}
44
67
  -->
45
68
 
46
- Evan Lovely has [created an Alfred workflow as well](http://www.evanlovely.com/blog/technology/alfred-for-terpstras-doing/).
69
+ Evan Lovely has created an [Alfred workflow][] as well.
47
70
 
48
71
  ## Contributing
49
72
 
50
- If you [create a plugin](https://github.com/ttscoff/doing/wiki/Creating-Plugins), custom command, or hook you can share, please [let me know](https://brettterpstra.com/contact/). If I get a few plugin contributions, I'll set up a second repository for them.
51
-
52
- Feel free to fork [the repository](https://github.com/ttscoff/doing/) on GitHub and make pull requests with changes. Please target the `develop` branch with pull requests.
73
+ If you [create a plugin][], custom command, or hook you can share, please
74
+ [let me know][contact]. If I get a few plugin contributions, I'll set up a
75
+ second repository for them.
76
+
77
+ Feel free to fork [the repository][github] on GitHub and make pull requests
78
+ with changes. Please target the `develop` branch with pull requests.
79
+
80
+ [bt doing]: https://brettterpstra.com/projects/doing/
81
+ [donate]: http://brettterpstra.com/donate/
82
+ [github]: https://github.com/ttscoff/doing/
83
+ [wiki]: https://github.com/ttscoff/doing/wiki
84
+ [doing 2]: https://brettterpstra.com/2021/11/20/doing-2-dot-0/
85
+ [status bar]: https://brettterpstra.com/2021/10/15/see-what-youre-doing-in-the-iterm-status-bar/
86
+ [touch bar]: https://brettterpstra.com/2021/07/21/crazy-bettertouchtool-touch-bar-simulator/
87
+ [create a plugin]: https://github.com/ttscoff/doing/wiki/Creating-Plugins
88
+ [contact]: https://brettterpstra.com/contact/
89
+ [alfred workflow]: http://www.evanlovely.com/blog/technology/alfred-for-terpstras-doing/
53
90
 
54
91
  <!--END README-->
55
92