markdown_exec 1.0.0 → 1.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 9b40d575297112f5a4bb934475b84251aeeab8f43de5dae963c8d3b1711c3edc
4
- data.tar.gz: 9e3d3273dc3e3a0deb326fe30e3ff70b15e73f4fd9cea06c42f099f184903fad
3
+ metadata.gz: 160eb660362db62302a05b8b46398c6d85357c917ee55eeb89a8ce0f739eec8a
4
+ data.tar.gz: 706e575c290ec56d34ad58f06ca9e30127b2c0bdacf431a4c9e3f69bc30e80dc
5
5
  SHA512:
6
- metadata.gz: 65654b5af78419591c41e3b50e0697b503ddf429c83312311335dd1b16d0d645c98b4e0c19d6c69446c42823861ca8f384788aeb4c1b5664804e4feecc39a45a
7
- data.tar.gz: 866360b40733e8925c173582f3c59799e241bf48f52faffa4bfb03cd4c1a11c93f5b27305344b01c4b44a1518ef1c49961c7fbfbdb713638ed8261c8d87401c0
6
+ metadata.gz: f540464a21a3ca2b654d89b3bc32f2172a3e610066bc64b9eae1bc29d99b8006ed3581998a50ae2327052c944656584375df55e64ffeeb77864ae05e45325e1c
7
+ data.tar.gz: a22c5ff757a2b5173725786bdbc399cae29f63eda891a0741149286391cb413abbcccd3799bd15ec769230ed44245b49664d434c77c12610bc2cfc138a9d3ddb
data/.reek ADDED
@@ -0,0 +1,24 @@
1
+ ---
2
+ detectors:
3
+ DataClump:
4
+ enabled: false
5
+ NilCheck:
6
+ enabled: false
7
+ TooManyStatements:
8
+ enabled: false
9
+ UtilityFunction:
10
+ public_methods_only: true
11
+ ControlParameter:
12
+ enabled: true
13
+ DuplicateMethodCall:
14
+ enabled: true
15
+ FeatureEnvy:
16
+ enabled: false # too strict
17
+ InstanceVariableAssumption:
18
+ enabled: true
19
+ IrresponsibleModule:
20
+ enabled: true
21
+ LongParameterList:
22
+ enabled: true
23
+ LongYieldList:
24
+ enabled: true
data/CHANGELOG.md CHANGED
@@ -1,29 +1,93 @@
1
1
  # Changelog
2
2
 
3
3
  ## [ToDo]
4
+ `reek lib/markdown_exec.rb --config .reek`
4
5
 
5
- - pipe stdin to script
6
- - present timestamp, result of last exec for each command
7
6
  - user settings
8
7
  - hidden w , w/o () in names
9
8
  - fix regexp in pathnames
10
- - tab completion from md file
11
- - read file once to allow for tempdoc stream
12
- - include md or blocks file
9
+
10
+ - [ ] read file once to allow for tempdoc stream
13
11
 
14
12
  - tree display
15
13
 
16
- - mde options in md file or included file
14
+ - [ ] mde options, user prompt, in md file or included file
15
+
16
+ - [ ] include blocks from local md file
17
+
18
+ - execute? yes/no/save/clipboard + record/edit/history
19
+
20
+ - [ ] list, view saved output
21
+
22
+ - completion
23
+ - [ ] include blocks in md file
24
+
25
+ - [ ] ruby gem data model
26
+
27
+ - [ ] extract yaml block into stdout
28
+ - [ ] extract json block into stdout
17
29
 
18
- - include blocks from local md file
30
+ - [ ] import yaml, json data into environment
19
31
 
20
- - chmod a+x logged script
32
+ - [ ] yq filter with imported or named yaml, json data
21
33
 
22
- - add shebang to saved script
34
+ - [ ] yaml dump of options w/ detail
35
+
36
+ - [ ] re-exec last script v re-run named block in last script
37
+ - [ ] repeat to reload last doc and block
38
+ - [ ] option to log blended, timeline; stdin, stdout, stderr; labels: prefix and blocks
39
+ - [ ] ren logged_stdout_filename_prefix to saved_stdout_filename_prefix
40
+ - [ ] ignore '#' in fenced code blocks
41
+
42
+ ## [1.2.0] - 2022-06-11
43
+
44
+ ### Added
45
+
46
+ - Options
47
+ - Display document name in block selection menu
48
+ - Display headings (levels 1,2,3) in block selection menu
49
+ - Trap Ctrl-C (SIGTERM) while script is executing.
50
+ Completes MDE processes such as saving output and reporting results.
51
+
52
+ ### Changed
23
53
 
24
- - yes/no/write/clipboard/record/edit/history
54
+ - Refactoring
55
+
56
+ ## [1.1.1] - 2022-05-25
57
+
58
+ ### Added
59
+
60
+ - Post-install instructions to add tab completions permanently to the shell.
61
+
62
+ ### Changed
63
+
64
+ - Improve handling of threads ending while executing scripts.
65
+
66
+ ## [1.1.0] - 2022-05-21
67
+
68
+ ### Added
69
+
70
+ - Display administrative output (command, save files) for executed blocks.
71
+ - Select base, administrative output as hierarchical output (MDE_DISPLAY_LEVEL).
72
+ - The user may select Exit, the first option, to quit the program.
73
+ - The block-selection menu is re-displayed after an approved script is exectued.
74
+ - Pause for and pass through standard input in scripts executed by the tool.
75
+ - Options
76
+ - chmod for saved scripts
77
+ - shebang for saved scripts
78
+ - shell for executed and saved scripts
79
+
80
+ ### Changed
25
81
 
26
- - list, view saved output
82
+ - Exit option is at top of each menu.
83
+ - Single-stage tab completion, default
84
+ - Presents matching options when current word starts with `-`
85
+ - Presents directories and files otherwise.
86
+ - Two-stage tab completion for option arguments.
87
+ - When prior word is an option and current word is empty
88
+ - Presents option type on first tab, eg `.BOOL.` for a boolean option.
89
+ - Presents option default value on second tab, eg `0` for false.
90
+ - Write STDOUT, STDERR, STDIN in sections to saved output file.
27
91
 
28
92
  ## [1.0.0] - 2022-04-26
29
93
 
data/Gemfile CHANGED
@@ -2,13 +2,15 @@
2
2
 
3
3
  source 'https://rubygems.org'
4
4
 
5
- # Specify your gem's dependencies in markdown_exec.gemspec
6
5
  gemspec
7
-
8
- gem 'rake', '~> 13.0'
9
-
6
+ gem 'clipboard'
7
+ gem 'erb'
10
8
  gem 'minitest', '~> 5.0'
11
-
9
+ gem 'rake', '~> 13.0'
10
+ gem 'reek'
12
11
  gem 'rubocop', '~> 1.21'
13
12
  gem 'rubocop-minitest', require: false
14
13
  gem 'rubocop-rake', require: false
14
+ gem 'shellwords'
15
+ gem 'uri'
16
+ gem 'yaml'
data/Gemfile.lock CHANGED
@@ -1,7 +1,8 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- markdown_exec (1.0.0)
4
+ markdown_exec (1.2.0)
5
+ clipboard (~> 1.3.6)
5
6
  open3 (~> 0.1.1)
6
7
  optparse (~> 0.1.1)
7
8
  tty-prompt (~> 0.23.1)
@@ -11,6 +12,11 @@ GEM
11
12
  remote: https://rubygems.org/
12
13
  specs:
13
14
  ast (2.4.2)
15
+ cgi (0.3.2)
16
+ clipboard (1.3.6)
17
+ erb (2.2.3)
18
+ cgi
19
+ kwalify (0.7.2)
14
20
  minitest (5.15.0)
15
21
  open3 (0.1.1)
16
22
  optparse (0.1.1)
@@ -21,6 +27,10 @@ GEM
21
27
  tty-color (~> 0.5)
22
28
  rainbow (3.1.1)
23
29
  rake (13.0.6)
30
+ reek (6.1.1)
31
+ kwalify (~> 0.7.0)
32
+ parser (~> 3.1.0)
33
+ rainbow (>= 2.0, < 4.0)
24
34
  regexp_parser (2.2.1)
25
35
  rexml (3.2.5)
26
36
  rubocop (1.26.0)
@@ -39,6 +49,7 @@ GEM
39
49
  rubocop-rake (0.6.0)
40
50
  rubocop (~> 1.0)
41
51
  ruby-progressbar (1.11.0)
52
+ shellwords (0.1.0)
42
53
  tty-color (0.6.0)
43
54
  tty-cursor (0.7.1)
44
55
  tty-prompt (0.23.1)
@@ -50,6 +61,7 @@ GEM
50
61
  wisper (~> 2.0)
51
62
  tty-screen (0.8.1)
52
63
  unicode-display_width (2.1.0)
64
+ uri (0.11.0)
53
65
  wisper (2.0.1)
54
66
  yaml (0.2.0)
55
67
 
@@ -57,12 +69,18 @@ PLATFORMS
57
69
  arm64-darwin-21
58
70
 
59
71
  DEPENDENCIES
72
+ clipboard
73
+ erb
60
74
  markdown_exec!
61
75
  minitest (~> 5.0)
62
76
  rake (~> 13.0)
77
+ reek
63
78
  rubocop (~> 1.21)
64
79
  rubocop-minitest
65
80
  rubocop-rake
81
+ shellwords
82
+ uri
83
+ yaml
66
84
 
67
85
  BUNDLED WITH
68
86
  2.2.32
data/README.md CHANGED
@@ -150,21 +150,34 @@ Boolean options configured with environment variables:
150
150
 
151
151
  ### Install tab completion
152
152
 
153
- Append a command to load the completion script to your shell configuration file:
153
+ Append a command to load the completion script to your shell configuration file. `mde` must be executable for the command to be composed correctly.
154
154
 
155
155
  ```bash :()
156
156
  echo "source $(mde --pwd)/bin/tab_completion.sh" >> ~/.bash_profile
157
157
  ```
158
158
 
159
+ ### Behavior
160
+
161
+ Press tab for completions appropriate to the current input.
162
+ `mde <...> <prior word> <current word>`
163
+
164
+ Completions are calculated based on the current word and the prior word.
165
+ 1. If the current word starts with `-`, present matching options, eg `--version` for the current word `--v`.
166
+ 2. Else, if the current word is empty and the prior word is an option that takes an argument, present the type of the argument, eg `.BOOL.` for the option `--user-must-approve`.
167
+ 3. Else, if the current word is the type of argument, from the rule above, present the default value for the option. e.g. `1` for the type `.BOOL.` for the option `--user-must-approve`.
168
+ 4. Else, if the current word is non-empty, list matching files and folders.
169
+
159
170
  ### Example Completions
160
171
 
161
- Type tab at end of any of the following commands to see the options.
162
- - `mde `
163
- - `mde -`
164
- - `mde --`
165
- - `mde --o`
166
- - `mde --filename my.md -`
167
- - `mde --filename my.md --`
172
+ In the table below, tab is indicated by `!`
173
+ | Input | Completions |
174
+ | :---: | :---: |
175
+ | `mde !` | local files and folders |
176
+ | `mde -!` | all options |
177
+ | `mde --!` | all options |
178
+ | `mde --v!` | `mde --version` |
179
+ | `mde --user-must-approve !` | `mde --user-must-approve .BOOL.`|
180
+ | `mde --user-must-approve .BOOL.!` | `mde --user-must-approve 1` |
168
181
 
169
182
  ## Example Blocks
170
183
 
@@ -190,6 +203,10 @@ export ACTIVITY=asleep
190
203
  echo "$TIME -> $ACTIVITY"
191
204
  ```
192
205
 
206
+ ``` :sleep
207
+ sleep 10
208
+ ```
209
+
193
210
  # License
194
211
 
195
212
  The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
data/Rakefile CHANGED
@@ -2,6 +2,8 @@
2
2
 
3
3
  require 'bundler/gem_tasks'
4
4
  require 'rake/testtask'
5
+ require 'erb'
6
+ require 'yaml'
5
7
 
6
8
  Rake::TestTask.new(:test) do |task|
7
9
  task.libs << 'test'
@@ -11,8 +13,13 @@ end
11
13
 
12
14
  require 'rubocop/rake_task'
13
15
 
16
+ require_relative 'lib/shared'
17
+ require_relative 'lib/tap'
18
+
19
+ include Tap # rubocop:disable Style/MixinUsage
20
+
14
21
  RuboCop::RakeTask.new do |task|
15
- # task.requires << 'rubocop-minitest'
22
+ task.requires << 'rubocop-minitest'
16
23
  end
17
24
 
18
25
  desc 'named task because minitest not included in rubocop tests'
@@ -22,12 +29,13 @@ end
22
29
 
23
30
  require_relative 'lib/markdown_exec/version'
24
31
 
25
- task default: %i[test rubocop rubocopminitest]
32
+ task default: %i[test reek rubocop rubocopminitest]
26
33
 
27
34
  # task :default => :build
28
35
 
29
36
  desc 'gem build'
30
37
  task :build do
38
+ Rake::Task['update_tab_completion'].execute
31
39
  system "gem build #{MarkdownExec::GEM_NAME}.gemspec"
32
40
  end
33
41
 
@@ -50,3 +58,49 @@ desc 'gem build clean'
50
58
  task :clean do
51
59
  system 'rm *.gem'
52
60
  end
61
+
62
+ desc 'reek'
63
+ task :reek do
64
+ `reek --config .reek .`
65
+ end
66
+
67
+ private
68
+
69
+ BF = 'bin'
70
+
71
+ # format for use in array in bash script
72
+ # `opts=<%= mde_tab_completions %>`
73
+ #
74
+ def words_list(words)
75
+ words.map do |word|
76
+ %("#{word}")
77
+ end.join ' '
78
+ end
79
+
80
+ # write tab_completion.sh with erb
81
+ #
82
+ def update_tab_completion(target)
83
+ words = `#{File.join BF, MarkdownExec::BIN_NAME} --tab-completions`.split("\n")
84
+ mde_tab_completions = "(#{words_list(words)})"
85
+ mde_help = `#{File.join BF, MarkdownExec::BIN_NAME} --help`.split("\n")
86
+ menu_export_yaml = `#{File.join BF, MarkdownExec::BIN_NAME} --menu-export`
87
+
88
+ svhs = YAML.load menu_export_yaml # rubocop:disable Security/YAMLLoad
89
+ svhs.each do |svh|
90
+ svh[:compreply] = value_for_cli(svh[:default]) if svh[:compreply].nil?
91
+ end.tap_inspect name: :svhs, format: :yaml
92
+
93
+ File.write target, ERB.new(File.read(File.join(BF, 'tab_completion.sh.erb'))).result(binding)
94
+ end
95
+
96
+ desc 'update tab_completion.sh'
97
+ task :update_tab_completion do
98
+ update_tab_completion File.join(BF, 'tab_completion.sh')
99
+ end
100
+
101
+ desc 'update tab_completion.sh'
102
+ task :update_installed_tab_completion do
103
+ update_tab_completion(fs = File.join(`mde --pwd`.chomp, BF, 'tab_completion.sh'))
104
+
105
+ puts `cat #{fs}` ###
106
+ end
@@ -4,20 +4,148 @@ __filedirs()
4
4
  {
5
5
  local IFS=$'\n'
6
6
  COMPREPLY=( $(compgen -o plusdirs -f -- "${cur}") )
7
+ # COMPREPLY=( $(compgen -d) $(compgen -f -- "${cur}") )
8
+ }
9
+
10
+ __filedirs_all()
11
+ {
12
+ COMPREPLY='.'
13
+ }
14
+
15
+ _mde_echo_version() {
16
+ echo "1.2.0"
7
17
  }
8
18
 
9
19
  _mde() {
10
20
  local cur prev opts
11
21
  cur="${COMP_WORDS[COMP_CWORD]}"
12
22
  prev="${COMP_WORDS[COMP_CWORD-1]}"
13
- opts="$(mde --tab-completions)"
23
+ # printf '%s' "-;${prev}-:${cur}-"
14
24
 
25
+ # current word is an option type
26
+ # if previous word is an option name
27
+ # stage 2: replace with option default value
28
+ #
29
+ if [[ "${cur}" =~ ^\..+\.$ ]] ; then
30
+ if [[ ${prev} == -* ]] ; then
31
+ case $prev in
32
+
33
+ --config) COMPREPLY="."; return 0 ;;
34
+
35
+ --debug) COMPREPLY="0"; return 0 ;;
36
+
37
+ --display-level) COMPREPLY="1"; return 0 ;;
38
+
39
+ --filename) COMPREPLY="."; return 0 ;;
40
+
41
+ --list-count) COMPREPLY="32"; return 0 ;;
42
+
43
+ --logged-stdout-filename-prefix) COMPREPLY="mde"; return 0 ;;
44
+
45
+ --menu-blocks-with-docname) COMPREPLY="0"; return 0 ;;
46
+
47
+ --menu-blocks-with-headings) COMPREPLY="0"; return 0 ;;
48
+
49
+ --output-execution-summary) COMPREPLY="0"; return 0 ;;
50
+
51
+ --output-script) COMPREPLY="0"; return 0 ;;
52
+
53
+ --output-stdout) COMPREPLY="1"; return 0 ;;
54
+
55
+ --path) COMPREPLY="."; return 0 ;;
56
+
57
+ --save-executed-script) COMPREPLY="0"; return 0 ;;
58
+
59
+ --save-execution-output) COMPREPLY="0"; return 0 ;;
60
+
61
+ --saved-script-chmod) COMPREPLY="493"; return 0 ;;
62
+
63
+ --saved-script-filename-prefix) COMPREPLY="mde"; return 0 ;;
64
+
65
+ --saved-script-folder) COMPREPLY="logs"; return 0 ;;
66
+
67
+ --saved-script-glob) COMPREPLY="mde_\*.sh"; return 0 ;;
68
+
69
+ --saved-stdout-folder) COMPREPLY="logs"; return 0 ;;
70
+
71
+ --saved-stdout-glob) COMPREPLY="mde_\*.out.txt"; return 0 ;;
72
+
73
+ --user-must-approve) COMPREPLY="1"; return 0 ;;
74
+
75
+ esac
76
+ fi
77
+ fi
78
+
79
+ # current word is an option name or start of
80
+ # present matching option names
81
+ #
15
82
  if [[ ${cur} == -* ]] ; then
16
- COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") )
83
+ opts=("--list-blocks" "--list-default-env" "--list-default-yaml" "--list-docs" "--list-recent-output" "--list-recent-scripts" "--pwd" "--run-last-script" "--select-recent-output" "--select-recent-script" "--menu-export" "--tab-completions" "--help" "--version" "--exit" "--config" "--debug" "--display-level" "--block-name" "--filename" "--list-count" "--logged-stdout-filename-prefix" "--menu-blocks-with-docname" "--menu-blocks-with-headings" "--output-execution-summary" "--output-script" "--output-stdout" "--path" "--save-executed-script" "--save-execution-output" "--saved-script-chmod" "--saved-script-filename-prefix" "--saved-script-folder" "--saved-script-glob" "--saved-stdout-folder" "--saved-stdout-glob" "--user-must-approve")
84
+ COMPREPLY=( $(compgen -W "$(printf "'%s' " "${opts[@]}")" -- "${cur}") )
85
+
17
86
  return 0
18
87
  fi
19
88
 
89
+ # no current word
90
+ # if previous word is an option name
91
+ # stage 1: present option type
92
+ #
93
+ if [[ -z ${cur} ]] ; then
94
+ case $prev in
95
+
96
+ --config) COMPREPLY=".PATH."; return 0 ;;
97
+
98
+ --debug) COMPREPLY=".BOOL."; return 0 ;;
99
+
100
+ --display-level) COMPREPLY=".INT.0-2."; return 0 ;;
101
+
102
+ --block-name) COMPREPLY=".NAME."; return 0 ;;
103
+
104
+ --filename) COMPREPLY=".RELATIVE_PATH."; return 0 ;;
105
+
106
+ --list-count) COMPREPLY=".INT.1-."; return 0 ;;
107
+
108
+ --logged-stdout-filename-prefix) COMPREPLY=".PREFIX."; return 0 ;;
109
+
110
+ --menu-blocks-with-docname) COMPREPLY=".BOOL."; return 0 ;;
111
+
112
+ --menu-blocks-with-headings) COMPREPLY=".BOOL."; return 0 ;;
113
+
114
+ --output-execution-summary) COMPREPLY=".BOOL."; return 0 ;;
115
+
116
+ --output-script) COMPREPLY=".BOOL."; return 0 ;;
117
+
118
+ --output-stdout) COMPREPLY=".BOOL."; return 0 ;;
119
+
120
+ --path) COMPREPLY=".RELATIVE_PATH."; return 0 ;;
121
+
122
+ --save-executed-script) COMPREPLY=".BOOL."; return 0 ;;
123
+
124
+ --save-execution-output) COMPREPLY=".BOOL."; return 0 ;;
125
+
126
+ --saved-script-chmod) COMPREPLY=".INT."; return 0 ;;
127
+
128
+ --saved-script-filename-prefix) COMPREPLY=".PREFIX."; return 0 ;;
129
+
130
+ --saved-script-folder) COMPREPLY=".RELATIVE_PATH."; return 0 ;;
131
+
132
+ --saved-script-glob) COMPREPLY=".GLOB."; return 0 ;;
133
+
134
+ --saved-stdout-folder) COMPREPLY=".RELATIVE_PATH."; return 0 ;;
135
+
136
+ --saved-stdout-glob) COMPREPLY=".GLOB."; return 0 ;;
137
+
138
+ --user-must-approve) COMPREPLY=".BOOL."; return 0 ;;
139
+
140
+ esac
141
+ fi
142
+
143
+ # current word is unrecognized
144
+ # present matching directory or file names
145
+ #
20
146
  __filedirs
21
147
  }
22
148
 
23
- complete -o filenames -F _mde mde
149
+ complete -o filenames -o nospace -F _mde mde
150
+ # _mde_echo_version
151
+ # echo "Updated: 2022-06-12 20:31:36 UTC"
@@ -0,0 +1,85 @@
1
+ #!/usr/bin/env bash
2
+
3
+ __filedirs()
4
+ {
5
+ local IFS=$'\n'
6
+ COMPREPLY=( $(compgen -o plusdirs -f -- "${cur}") )
7
+ # COMPREPLY=( $(compgen -d) $(compgen -f -- "${cur}") )
8
+ }
9
+
10
+ __filedirs_all()
11
+ {
12
+ COMPREPLY='.'
13
+ }
14
+
15
+ _mde_echo_version() {
16
+ echo "<%= MarkdownExec::VERSION %>"
17
+ }
18
+
19
+ _mde() {
20
+ local cur prev opts
21
+ cur="${COMP_WORDS[COMP_CWORD]}"
22
+ prev="${COMP_WORDS[COMP_CWORD-1]}"
23
+ # printf '%s' "-;${prev}-:${cur}-"
24
+
25
+ # current word is an option type
26
+ # if previous word is an option name
27
+ # stage 2: replace with option default value
28
+ #
29
+ if [[ "${cur}" =~ ^\..+\.$ ]] ; then
30
+ if [[ ${prev} == -* ]] ; then
31
+ case $prev in
32
+ <% svhs.each do |svh|
33
+ svn = svh[:long_name]
34
+ if svn && svh[:arg_name]
35
+ svn = '--' + svh[:long_name]
36
+ if svh[:compreply] == false
37
+ # nothing
38
+ elsif svh[:compreply].nil? %>
39
+ <%= svn + ') __filedirs_all; return 0 ;;' %>
40
+ <% elsif svh[:compreply].empty?
41
+ # nothing
42
+ else %>
43
+ <%= svn + ') COMPREPLY="' + svh[:compreply] + '"; return 0 ;;' %>
44
+ <% end
45
+ end
46
+ end %>
47
+ esac
48
+ fi
49
+ fi
50
+
51
+ # current word is an option name or start of
52
+ # present matching option names
53
+ #
54
+ if [[ ${cur} == -* ]] ; then
55
+ opts=<%= mde_tab_completions %>
56
+ COMPREPLY=( $(compgen -W "$(printf "'%s' " "${opts[@]}")" -- "${cur}") )
57
+
58
+ return 0
59
+ fi
60
+
61
+ # no current word
62
+ # if previous word is an option name
63
+ # stage 1: present option type
64
+ #
65
+ if [[ -z ${cur} ]] ; then
66
+ case $prev in
67
+ <% svhs.each do |svh|
68
+ svn = svh[:long_name]
69
+ if svn && svh[:arg_name]
70
+ svn = '--' + svh[:long_name] %>
71
+ <%= svn + ') COMPREPLY=".' + svh[:arg_name] + '."; return 0 ;;' %>
72
+ <% end
73
+ end %>
74
+ esac
75
+ fi
76
+
77
+ # current word is unrecognized
78
+ # present matching directory or file names
79
+ #
80
+ __filedirs
81
+ }
82
+
83
+ complete -o filenames -o nospace -F _mde mde
84
+ # _mde_echo_version
85
+ # echo "Updated: <%= Time.now.utc %>"
data/lib/colorize.rb ADDED
@@ -0,0 +1,64 @@
1
+ # frozen_string_literal: true
2
+
3
+ # encoding=utf-8
4
+
5
+ # │0 │ to restore default │
6
+ # │ │ color │
7
+ # ├───┼───────────────────────┤
8
+ # │ │ │
9
+ # │1 │ for brighter colors │
10
+ # ├───┼───────────────────────┤
11
+ # │ │ │
12
+ # │4 │ for underlined text │
13
+ # ├───┼───────────────────────┤
14
+ # │ │ │
15
+ # │5 │ for flashing text
16
+ class String
17
+ def black
18
+ "\033[30m#{self}\033[0m"
19
+ end
20
+
21
+ def red
22
+ "\033[31m#{self}\033[0m"
23
+ end
24
+
25
+ def bred
26
+ "\033[1;31m#{self}\033[0m"
27
+ end
28
+
29
+ def green
30
+ "\033[32m#{self}\033[0m"
31
+ end
32
+
33
+ def bgreen
34
+ "\033[1;32m#{self}\033[0m"
35
+ end
36
+
37
+ def yellow
38
+ "\033[33m#{self}\033[0m"
39
+ end
40
+
41
+ def byellow
42
+ "\033[1;33m#{self}\033[0m"
43
+ end
44
+
45
+ def blue
46
+ "\033[34m#{self}\033[0m"
47
+ end
48
+
49
+ def magenta
50
+ "\033[35m#{self}\033[0m"
51
+ end
52
+
53
+ def cyan
54
+ "\033[36m#{self}\033[0m"
55
+ end
56
+
57
+ def white
58
+ "\033[37m#{self}\033[0m"
59
+ end
60
+
61
+ def bwhite
62
+ "\033[1;37m#{self}\033[0m"
63
+ end
64
+ end