diff options
| author | Felix Fietkau | 2025-02-24 20:22:52 +0000 |
|---|---|---|
| committer | Felix Fietkau | 2025-02-28 16:36:01 +0000 |
| commit | 895b4e7cafc8282d7a617fd3e898ad3415f5b6b0 (patch) | |
| tree | e87bf577bae22feb3bd5f1d235d5c92b852ecda1 | |
| parent | 04ecccf3e93badb4304a0c4caf843869e1e8e551 (diff) | |
| download | openwrt-895b4e7cafc8282d7a617fd3e898ad3415f5b6b0.tar.gz | |
cli: add support for partial completion with separator character
Useful for completing long lists of possible values with common prefix
Signed-off-by: Felix Fietkau <nbd@nbd.name>
| -rwxr-xr-x | package/utils/cli/files/usr/sbin/cli | 5 | ||||
| -rw-r--r-- | package/utils/cli/files/usr/share/ucode/cli/context.uc | 31 |
2 files changed, 34 insertions, 2 deletions
diff --git a/package/utils/cli/files/usr/sbin/cli b/package/utils/cli/files/usr/sbin/cli index 0a763f2fdb..7d950e6adc 100755 --- a/package/utils/cli/files/usr/sbin/cli +++ b/package/utils/cli/files/usr/sbin/cli @@ -311,7 +311,10 @@ function completion(count) { add = " "; cat = ""; - add += sprintf("%-"+len+"s", entry.name); + let name = entry.name; + if (entry.incomplete) + name += "..."; + add += sprintf("%-"+len+"s", name); str += add; x += length(add); diff --git a/package/utils/cli/files/usr/share/ucode/cli/context.uc b/package/utils/cli/files/usr/share/ucode/cli/context.uc index b3f24f77a8..53b5f57047 100644 --- a/package/utils/cli/files/usr/share/ucode/cli/context.uc +++ b/package/utils/cli/files/usr/share/ucode/cli/context.uc @@ -355,7 +355,36 @@ function complete_arg_list(e, ctx, arg_info, args, base_args, named_args) for (let i = 0; i <= cur_idx; i++) val = shift(args); - return complete_param(e, ctx, cur, val, base_args, named_args); + let ret = complete_param(e, ctx, cur, val, base_args, named_args); + if (!cur.prefix_separator) + return ret; + + let prefix_len = length(val); + let vals = []; + let match_prefix; + for (let cur_val in ret.value) { + let cur_str = cur_val.name; + let cur_suffix = substr(cur_str, prefix_len); + let idx = index(cur_suffix, cur.prefix_separator); + if (idx < 0) { + push(vals, cur_val); + continue; + } + + let cur_prefix = substr(cur_str, 0, prefix_len + idx + 1); + if (cur_prefix == match_prefix) + continue; + + match_prefix = cur_prefix; + push(vals, { + ...cur_val, + name: cur_prefix, + incomplete: true + }); + } + ret.value = vals; + + return ret; } function handle_empty_param(entry, spec, name, argv, named_args) |