summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFelix Fietkau2025-02-24 20:22:52 +0000
committerFelix Fietkau2025-02-28 16:36:01 +0000
commit895b4e7cafc8282d7a617fd3e898ad3415f5b6b0 (patch)
treee87bf577bae22feb3bd5f1d235d5c92b852ecda1
parent04ecccf3e93badb4304a0c4caf843869e1e8e551 (diff)
downloadopenwrt-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-xpackage/utils/cli/files/usr/sbin/cli5
-rw-r--r--package/utils/cli/files/usr/share/ucode/cli/context.uc31
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)