diff --git a/readme.md b/readme.md index e78c221..9f427d3 100644 --- a/readme.md +++ b/readme.md @@ -116,6 +116,7 @@ Two interpreted languages for flexibility. * tmux * get unresolved path for new panes & windows * source code + * bash completion * doc parsing algorithm * install commands * remove existing before diff --git a/sh/code.awk b/sh/code.awk index dd4423b..995174f 100644 --- a/sh/code.awk +++ b/sh/code.awk @@ -5,6 +5,10 @@ function append(line) { doc = doc line } +function eval(alias, target) { + print alias "() { " target " \"${@}\"; }" +} + function output(name, type) { print "↙ " type print name @@ -20,13 +24,14 @@ function reset() { BEGIN { RE_ANY = "(.*)" + RE_BEGIN = "^" RE_CONST = "([_A-Z][_0-9A-Z]*)" RE_SET = "=.*" RE_SPACE = "[[:space:]]" - RE_SPACES = RE_SPACE "*" RE_VAR = "([_a-z][_0-9a-z]*)" - RE_BEGIN = "^" + RE_SPACES = RE_SPACE "*" + RE_END = RE_SPACES "$" RE_FUNC = RE_SPACES "\\(" RE_SPACES "\\)" RE_SPACES "{" @@ -41,11 +46,11 @@ BEGIN { RE_SHEBANG = RE_BEGIN "#!" RE_SPACES RE_ANY RE_END RE_VARIABLE = RE_BEGIN RE_VAR RE_SET RE_END - alias = 0 - command = 0 f = "" + match_alias = 0 + match_command = 0 + match_module = 0 reset() - module = 0 } { @@ -79,7 +84,7 @@ BEGIN { } else if (match($0, RE_FUNCTION, m)) { split(doc, array, "\n") for (item in array) { - print array[item] " " m[1] + eval(array[item], m[1]) } reset() } else { @@ -91,7 +96,22 @@ BEGIN { } else if (match($0, RE_FUNCTION, m)) { split(doc, array, "\n") for (item in array) { - print array[item] " " m[1] + eval(array[item], m[1]) + } + reset() + } else { + reset() + } + } else if (action == "command function") { + if (match($0, RE_COMMAND, m)) { + append(m[1]) + } else if (match($0, RE_FUNCTION, m)) { + split(doc, array, "\n") + for (item in array) { + if (array[item] == target) { + print m[1] + exit + } } reset() } else { @@ -110,12 +130,12 @@ BEGIN { } else if (match($0, RE_ALIAS, m)) { append("= " m[1]) if (m[1] == target) { - alias = 1 + match_alias = 1 } } else if (match($0, RE_COMMAND, m)) { append("/ " m[1]) if (m[1] == target) { - command = 1 + match_command = 1 } # set } else if (match($0, RE_CONSTANT, m)) { @@ -134,15 +154,15 @@ BEGIN { } else if (match($0, RE_MODULE, m)) { reset() if (m[1] == target) { - module = 1 + match_module = 1 } } else if (match($0, RE_FUNCTION, m)) { f = m[1] } else if (match($0, RE_CLOSE, m)) { - if (alias) { + if (match_alias) { print "= " target output(f, "function") - } else if (command) { + } else if (match_command) { print "/ " target output(f, "function") } else if (f == target) { @@ -152,7 +172,7 @@ BEGIN { reset() } } else { - if (module) { + if (match_module) { output(target, "module") } else { reset() diff --git a/sh/code.sh b/sh/code.sh index d046dbb..5a67869 100644 --- a/sh/code.sh +++ b/sh/code.sh @@ -103,34 +103,15 @@ rwx_code_aliases() { echo "${_rwx_code_aliases}" } -# find alias function -rwx_code_alias_function() { - local target="${1}" - local line name - while IFS= read -r line; do - name="$(echo "${line}" | awk "{print \$1}")" - if [ "${name}" = "${target}" ]; then - echo "${line}" | - awk "{print \$2}" - fi - done <