markdown_exec 0.2.6 → 1.1.1
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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +77 -11
- data/Gemfile +7 -5
- data/Gemfile.lock +16 -1
- data/README.md +38 -12
- data/Rakefile +35 -1
- data/assets/approve_code.png +0 -0
- data/assets/output_of_execution.png +0 -0
- data/assets/select_a_block.png +0 -0
- data/assets/select_a_file.png +0 -0
- data/bin/tab_completion.sh +143 -0
- data/bin/tab_completion.sh.erb +85 -0
- data/lib/markdown_exec/version.rb +3 -2
- data/lib/markdown_exec.rb +809 -262
- data/lib/shared.rb +121 -0
- metadata +43 -11
- data/fixtures/bash1.md +0 -12
- data/fixtures/bash2.md +0 -15
- data/fixtures/exclude1.md +0 -6
- data/fixtures/exclude2.md +0 -9
- data/fixtures/exec1.md +0 -8
- data/fixtures/heading1.md +0 -19
- data/fixtures/sample1.md +0 -9
- data/fixtures/title1.md +0 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0f8bb9f8a7a903a6b221ed8d04a5acb445e294be4c134202b9a71ba9e9f7c7ac
|
4
|
+
data.tar.gz: d26a89ae33f1aeaac70b40f3e31b3090fb50c6eb48874eeba435ce89825123fc
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f177057c231ef950012abc922b6c3d9611e0b423df57cee07e6ac0e68864c18ce9b6a7cf640e165dbd8409d6ecefb199a3bb31643a7c5e31d5c241f17682545e
|
7
|
+
data.tar.gz: 9fb1a5d4274d2443e1ed9680978cfb12c76b46416a3ba76483addd19b61238446dce86793a039cfede131bdd11a4436ae693640ad279add82e24415a544b7b53
|
data/CHANGELOG.md
CHANGED
@@ -2,31 +2,97 @@
|
|
2
2
|
|
3
3
|
## [ToDo]
|
4
4
|
|
5
|
-
- pipe stdin to script
|
6
|
-
- yes/no/write/clipboard/record/edit/history
|
7
|
-
- present timestamp, result of last exec for each command
|
8
5
|
- user settings
|
9
6
|
- hidden w , w/o () in names
|
10
7
|
- fix regexp in pathnames
|
11
|
-
|
12
|
-
- read file once to allow for tempdoc stream
|
13
|
-
- include md or blocks file
|
8
|
+
|
9
|
+
- [ ] read file once to allow for tempdoc stream
|
14
10
|
|
15
11
|
- tree display
|
16
12
|
|
17
|
-
- mde options in md file or included file
|
13
|
+
- [ ] mde options, user prompt, in md file or included file
|
14
|
+
|
15
|
+
- [ ] include blocks from local md file
|
16
|
+
|
17
|
+
- execute? yes/no/save/clipboard + record/edit/history
|
18
|
+
|
19
|
+
- [ ] list, view saved output
|
20
|
+
|
21
|
+
- completion
|
22
|
+
- [ ] include blocks in md file
|
23
|
+
|
24
|
+
- [ ] ruby gem data model
|
25
|
+
|
26
|
+
- [ ] extract yaml block into stdout
|
27
|
+
- [ ] extract json block into stdout
|
28
|
+
|
29
|
+
- [ ] import yaml, json data into environment
|
18
30
|
|
19
|
-
-
|
31
|
+
- [ ] yq filter with imported or named yaml, json data
|
20
32
|
|
21
|
-
-
|
33
|
+
- [ ] yaml dump of options w/ detail
|
34
|
+
|
35
|
+
- [ ] re-exec last script v re-run named block in last script
|
36
|
+
- [ ] repeat to reload last doc and block
|
37
|
+
- [ ] option to log blended, timeline; stdin, stdout, stderr; labels: prefix and blocks
|
38
|
+
- [ ] ren logged_stdout_filename_prefix to saved_stdout_filename_prefix
|
39
|
+
|
40
|
+
## [1.1.1] - 2022-05-25
|
41
|
+
|
42
|
+
### Added
|
43
|
+
|
44
|
+
- Post-install instructions to add tab completions permanently to the shell.
|
45
|
+
|
46
|
+
### Changed
|
47
|
+
|
48
|
+
- Improve handling of threads ending while executing scripts.
|
49
|
+
|
50
|
+
## [1.1.0] - 2022-05-21
|
51
|
+
|
52
|
+
### Added
|
53
|
+
|
54
|
+
- Display administrative output (command, save files) for executed blocks.
|
55
|
+
- Select base, administrative output as hierarchical output (MDE_DISPLAY_LEVEL).
|
56
|
+
- The user may select Exit, the first option, to quit the program.
|
57
|
+
- The block-selection menu is re-displayed after an approved script is exectued.
|
58
|
+
- Pause for and pass through standard input in scripts executed by the tool.
|
59
|
+
- Options
|
60
|
+
- chmod for saved scripts
|
61
|
+
- shebang for saved scripts
|
62
|
+
- shell for executed and saved scripts
|
63
|
+
|
64
|
+
### Changed
|
65
|
+
|
66
|
+
- Exit option is at top of each menu.
|
67
|
+
- Single-stage tab completion, default
|
68
|
+
- Presents matching options when current word starts with `-`
|
69
|
+
- Presents directories and files otherwise.
|
70
|
+
- Two-stage tab completion for option arguments.
|
71
|
+
- When prior word is an option and current word is empty
|
72
|
+
- Presents option type on first tab, eg `.BOOL.` for a boolean option.
|
73
|
+
- Presents option default value on second tab, eg `0` for false.
|
74
|
+
- Write STDOUT, STDERR, STDIN in sections to saved output file.
|
75
|
+
|
76
|
+
## [1.0.0] - 2022-04-26
|
77
|
+
|
78
|
+
### Added
|
79
|
+
|
80
|
+
- Command `--pwd` to print the gem's home folder.
|
81
|
+
- Command `--select-recent-output` to select and open a recent output log file.
|
82
|
+
e.g. `MDE_OUTPUT_VIEWER_OPTIONS="-a '/Applications/Sublime Text.app'" mde --select-recent-output`
|
83
|
+
- Command `--tab-completions` to list the application options.
|
84
|
+
- Tab completion script for Bash shell.
|
85
|
+
|
86
|
+
### Changed
|
22
87
|
|
23
|
-
-
|
88
|
+
- File names for saved scripts.
|
89
|
+
- Hide blocks with empty names, e.g. `:()`.
|
24
90
|
|
25
91
|
## [0.2.6] - 2022-04-07
|
26
92
|
|
27
93
|
### Changed
|
28
94
|
|
29
|
-
-
|
95
|
+
- Default values for command line options.
|
30
96
|
|
31
97
|
## [0.2.5] - 2022-04-03
|
32
98
|
|
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 '
|
9
|
-
|
6
|
+
gem 'clipboard'
|
7
|
+
gem 'erb'
|
10
8
|
gem 'minitest', '~> 5.0'
|
11
|
-
|
9
|
+
gem 'mrdialog', '~> 1.0.3'
|
10
|
+
gem 'rake', '~> 13.0'
|
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,9 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
markdown_exec (
|
4
|
+
markdown_exec (1.1.1)
|
5
|
+
clipboard (~> 1.3.6)
|
6
|
+
mrdialog (~> 1.0.3)
|
5
7
|
open3 (~> 0.1.1)
|
6
8
|
optparse (~> 0.1.1)
|
7
9
|
tty-prompt (~> 0.23.1)
|
@@ -11,7 +13,12 @@ GEM
|
|
11
13
|
remote: https://rubygems.org/
|
12
14
|
specs:
|
13
15
|
ast (2.4.2)
|
16
|
+
cgi (0.3.2)
|
17
|
+
clipboard (1.3.6)
|
18
|
+
erb (2.2.3)
|
19
|
+
cgi
|
14
20
|
minitest (5.15.0)
|
21
|
+
mrdialog (1.0.3)
|
15
22
|
open3 (0.1.1)
|
16
23
|
optparse (0.1.1)
|
17
24
|
parallel (1.21.0)
|
@@ -39,6 +46,7 @@ GEM
|
|
39
46
|
rubocop-rake (0.6.0)
|
40
47
|
rubocop (~> 1.0)
|
41
48
|
ruby-progressbar (1.11.0)
|
49
|
+
shellwords (0.1.0)
|
42
50
|
tty-color (0.6.0)
|
43
51
|
tty-cursor (0.7.1)
|
44
52
|
tty-prompt (0.23.1)
|
@@ -50,6 +58,7 @@ GEM
|
|
50
58
|
wisper (~> 2.0)
|
51
59
|
tty-screen (0.8.1)
|
52
60
|
unicode-display_width (2.1.0)
|
61
|
+
uri (0.11.0)
|
53
62
|
wisper (2.0.1)
|
54
63
|
yaml (0.2.0)
|
55
64
|
|
@@ -57,12 +66,18 @@ PLATFORMS
|
|
57
66
|
arm64-darwin-21
|
58
67
|
|
59
68
|
DEPENDENCIES
|
69
|
+
clipboard
|
70
|
+
erb
|
60
71
|
markdown_exec!
|
61
72
|
minitest (~> 5.0)
|
73
|
+
mrdialog (~> 1.0.3)
|
62
74
|
rake (~> 13.0)
|
63
75
|
rubocop (~> 1.21)
|
64
76
|
rubocop-minitest
|
65
77
|
rubocop-rake
|
78
|
+
shellwords
|
79
|
+
uri
|
80
|
+
yaml
|
66
81
|
|
67
82
|
BUNDLED WITH
|
68
83
|
2.2.32
|
data/README.md
CHANGED
@@ -55,6 +55,10 @@ Process `README.md` file in the current folder. Displays all the blocks in the f
|
|
55
55
|
|
56
56
|
Select a block to execute from `my.md`.
|
57
57
|
|
58
|
+
#### `mde my.md myblock`
|
59
|
+
|
60
|
+
Execute the block named `myblock` from `my.md`.
|
61
|
+
|
58
62
|
#### `mde .` or `mde -p .`
|
59
63
|
|
60
64
|
Select a markdown file in the current folder. Select a block to execute from that file.
|
@@ -142,7 +146,40 @@ Boolean options configured with environment variables:
|
|
142
146
|
- Specify variable on command line.
|
143
147
|
e.g. `MDE_SAVE_EXECUTED_SCRIPT=1 mde`
|
144
148
|
|
145
|
-
|
149
|
+
## Tab Completion
|
150
|
+
|
151
|
+
### Install tab completion
|
152
|
+
|
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
|
+
|
155
|
+
```bash :()
|
156
|
+
echo "source $(mde --pwd)/bin/tab_completion.sh" >> ~/.bash_profile
|
157
|
+
```
|
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
|
+
|
170
|
+
### Example Completions
|
171
|
+
|
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` |
|
181
|
+
|
182
|
+
## Example Blocks
|
146
183
|
|
147
184
|
When prompted, select either the `awake` or `asleep` block.
|
148
185
|
|
@@ -166,17 +203,6 @@ export ACTIVITY=asleep
|
|
166
203
|
echo "$TIME -> $ACTIVITY"
|
167
204
|
```
|
168
205
|
|
169
|
-
``` :missing_command
|
170
|
-
fail
|
171
|
-
```
|
172
|
-
|
173
|
-
``` :exit_value
|
174
|
-
echo "a"
|
175
|
-
echo "b"
|
176
|
-
echo "c" >>/dev/stderr
|
177
|
-
grep nx Gemfile
|
178
|
-
```
|
179
|
-
|
180
206
|
# License
|
181
207
|
|
182
208
|
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,10 @@
|
|
2
2
|
|
3
3
|
require 'bundler/gem_tasks'
|
4
4
|
require 'rake/testtask'
|
5
|
+
require 'erb'
|
6
|
+
require 'yaml'
|
7
|
+
|
8
|
+
require_relative 'lib/shared'
|
5
9
|
|
6
10
|
Rake::TestTask.new(:test) do |task|
|
7
11
|
task.libs << 'test'
|
@@ -12,7 +16,7 @@ end
|
|
12
16
|
require 'rubocop/rake_task'
|
13
17
|
|
14
18
|
RuboCop::RakeTask.new do |task|
|
15
|
-
|
19
|
+
task.requires << 'rubocop-minitest'
|
16
20
|
end
|
17
21
|
|
18
22
|
desc 'named task because minitest not included in rubocop tests'
|
@@ -50,3 +54,33 @@ desc 'gem build clean'
|
|
50
54
|
task :clean do
|
51
55
|
system 'rm *.gem'
|
52
56
|
end
|
57
|
+
|
58
|
+
private
|
59
|
+
|
60
|
+
BF = 'bin'
|
61
|
+
|
62
|
+
def update_tab_completion(target)
|
63
|
+
words = `#{File.join BF, MarkdownExec::BIN_NAME} --tab-completions`.split("\n")
|
64
|
+
mde_tab_completions = '(' + (words.map { |s| "\"#{s}\"" }).join(' ') + ')'
|
65
|
+
mde_help = `#{File.join BF, MarkdownExec::BIN_NAME} --help`.split("\n")
|
66
|
+
menu_export_yaml = `#{File.join BF, MarkdownExec::BIN_NAME} --menu-export`
|
67
|
+
|
68
|
+
svhs = YAML.load menu_export_yaml # rubocop:disable Security/YAMLLoad
|
69
|
+
svhs.each do |svh|
|
70
|
+
svh[:compreply] = value_for_cli(svh[:default]) if svh[:compreply].nil?
|
71
|
+
end.tap_inspect name: :svhs, format: :yaml
|
72
|
+
|
73
|
+
File.write target, ERB.new(File.read(File.join(BF, 'tab_completion.sh.erb'))).result(binding)
|
74
|
+
end
|
75
|
+
|
76
|
+
desc 'update tab_completion.sh'
|
77
|
+
task :update_tab_completion do
|
78
|
+
update_tab_completion File.join(BF, 'tab_completion.sh')
|
79
|
+
end
|
80
|
+
|
81
|
+
desc 'update tab_completion.sh'
|
82
|
+
task :update_installed_tab_completion do
|
83
|
+
update_tab_completion(fs = File.join(`mde --pwd`.chomp, BF, 'tab_completion.sh'))
|
84
|
+
|
85
|
+
puts `cat #{fs}` ###
|
86
|
+
end
|
data/assets/approve_code.png
CHANGED
Binary file
|
Binary file
|
data/assets/select_a_block.png
CHANGED
Binary file
|
data/assets/select_a_file.png
CHANGED
Binary file
|
@@ -0,0 +1,143 @@
|
|
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 "1.1.1"
|
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
|
+
|
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
|
+
--output-execution-summary) COMPREPLY="0"; return 0 ;;
|
46
|
+
|
47
|
+
--output-script) COMPREPLY="0"; return 0 ;;
|
48
|
+
|
49
|
+
--output-stdout) COMPREPLY="1"; return 0 ;;
|
50
|
+
|
51
|
+
--path) COMPREPLY="."; return 0 ;;
|
52
|
+
|
53
|
+
--save-executed-script) COMPREPLY="0"; return 0 ;;
|
54
|
+
|
55
|
+
--save-execution-output) COMPREPLY="0"; return 0 ;;
|
56
|
+
|
57
|
+
--saved-script-chmod) COMPREPLY="493"; return 0 ;;
|
58
|
+
|
59
|
+
--saved-script-filename-prefix) COMPREPLY="mde"; return 0 ;;
|
60
|
+
|
61
|
+
--saved-script-folder) COMPREPLY="logs"; return 0 ;;
|
62
|
+
|
63
|
+
--saved-script-glob) COMPREPLY="mde_\*.sh"; return 0 ;;
|
64
|
+
|
65
|
+
--saved-stdout-folder) COMPREPLY="logs"; return 0 ;;
|
66
|
+
|
67
|
+
--saved-stdout-glob) COMPREPLY="mde_\*.out.txt"; return 0 ;;
|
68
|
+
|
69
|
+
--user-must-approve) COMPREPLY="1"; return 0 ;;
|
70
|
+
|
71
|
+
esac
|
72
|
+
fi
|
73
|
+
fi
|
74
|
+
|
75
|
+
# current word is an option name or start of
|
76
|
+
# present matching option names
|
77
|
+
#
|
78
|
+
if [[ ${cur} == -* ]] ; then
|
79
|
+
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" "--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")
|
80
|
+
COMPREPLY=( $(compgen -W "$(printf "'%s' " "${opts[@]}")" -- "${cur}") )
|
81
|
+
|
82
|
+
return 0
|
83
|
+
fi
|
84
|
+
|
85
|
+
# no current word
|
86
|
+
# if previous word is an option name
|
87
|
+
# stage 1: present option type
|
88
|
+
#
|
89
|
+
if [[ -z ${cur} ]] ; then
|
90
|
+
case $prev in
|
91
|
+
|
92
|
+
--config) COMPREPLY=".PATH."; return 0 ;;
|
93
|
+
|
94
|
+
--debug) COMPREPLY=".BOOL."; return 0 ;;
|
95
|
+
|
96
|
+
--display-level) COMPREPLY=".INT.0-2."; return 0 ;;
|
97
|
+
|
98
|
+
--block-name) COMPREPLY=".NAME."; return 0 ;;
|
99
|
+
|
100
|
+
--filename) COMPREPLY=".RELATIVE_PATH."; return 0 ;;
|
101
|
+
|
102
|
+
--list-count) COMPREPLY=".INT.1-."; return 0 ;;
|
103
|
+
|
104
|
+
--logged-stdout-filename-prefix) COMPREPLY=".PREFIX."; return 0 ;;
|
105
|
+
|
106
|
+
--output-execution-summary) COMPREPLY=".BOOL."; return 0 ;;
|
107
|
+
|
108
|
+
--output-script) COMPREPLY=".BOOL."; return 0 ;;
|
109
|
+
|
110
|
+
--output-stdout) COMPREPLY=".BOOL."; return 0 ;;
|
111
|
+
|
112
|
+
--path) COMPREPLY=".RELATIVE_PATH."; return 0 ;;
|
113
|
+
|
114
|
+
--save-executed-script) COMPREPLY=".BOOL."; return 0 ;;
|
115
|
+
|
116
|
+
--save-execution-output) COMPREPLY=".BOOL."; return 0 ;;
|
117
|
+
|
118
|
+
--saved-script-chmod) COMPREPLY=".INT."; return 0 ;;
|
119
|
+
|
120
|
+
--saved-script-filename-prefix) COMPREPLY=".PREFIX."; return 0 ;;
|
121
|
+
|
122
|
+
--saved-script-folder) COMPREPLY=".RELATIVE_PATH."; return 0 ;;
|
123
|
+
|
124
|
+
--saved-script-glob) COMPREPLY=".GLOB."; return 0 ;;
|
125
|
+
|
126
|
+
--saved-stdout-folder) COMPREPLY=".RELATIVE_PATH."; return 0 ;;
|
127
|
+
|
128
|
+
--saved-stdout-glob) COMPREPLY=".GLOB."; return 0 ;;
|
129
|
+
|
130
|
+
--user-must-approve) COMPREPLY=".BOOL."; return 0 ;;
|
131
|
+
|
132
|
+
esac
|
133
|
+
fi
|
134
|
+
|
135
|
+
# current word is unrecognized
|
136
|
+
# present matching directory or file names
|
137
|
+
#
|
138
|
+
__filedirs
|
139
|
+
}
|
140
|
+
|
141
|
+
complete -o filenames -o nospace -F _mde mde
|
142
|
+
# _mde_echo_version
|
143
|
+
# echo "Updated: 2022-05-26 01:40:10 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 %>"
|