Shell: Tab completes a path on the SD card (#67)
CI / build (pull_request) Successful in 1m48s
Site / build (pull_request) Successful in 10s

Past the command's name, Tab completes the word being typed as a path: a
folder keeps its slash to go on from, a file completed whole gets a space,
several candidates are listed. Any case typed, the name's own is taken.
After a file command the first slash is understood (`cat no` is /no).
The folder is read on the storage task, bounded to 400 entries looked at
and 24 candidates.

489 host tests (2 new). Checked on the device: a folder, a file inside it,
several candidates, no slash, another case, nothing matching.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EhqxQ49eCju4CzKYNjZzwT
This commit is contained in:
2026-10-07 12:03:44 +02:00
co-authored by Claude Opus 5.5
parent 7b5df713ad
commit d17d10948d
12 changed files with 184 additions and 14 deletions
+6 -2
View File
@@ -27,9 +27,12 @@ class ShellApp : public App {
// What `rm` is pointed at: it decides whether the Shell asks first.
enum class Target { Missing, File, EmptyFolder, FullFolder };
using Probe = std::function<Target(const std::string& path)>;
// A folder's entries that start with `prefix`, whatever their case, a folder's with a slash at its
// end: what Tab completes a path from. `more` when there were too many to give them all.
using List = std::function<std::vector<std::string>(const std::string& folder, const std::string& prefix, bool& more)>;
ShellApp(Run run, Probe probe, const char* helpText, AppManager& apps)
: run_(std::move(run)), probe_(std::move(probe)), helpText_(helpText), apps_(apps) {}
ShellApp(Run run, Probe probe, List list, const char* helpText, AppManager& apps)
: run_(std::move(run)), probe_(std::move(probe)), list_(std::move(list)), helpText_(helpText), apps_(apps) {}
void onEnter() override;
void onExit() override;
@@ -45,6 +48,7 @@ class ShellApp : public App {
Run run_;
Probe probe_;
List list_;
const char* helpText_;
AppManager& apps_;
ShellLog log_;