From 1c1da8fdfe5a1635cb6ecb1d59b074f481575b3e Mon Sep 17 00:00:00 2001 From: dzaima Date: Sun, 26 Feb 2023 18:07:39 +0200 Subject: [PATCH] completion options for system commands --- src/main.c | 74 +++++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 59 insertions(+), 15 deletions(-) diff --git a/src/main.c b/src/main.c index 62c9e01b..f31bec12 100644 --- a/src/main.c +++ b/src/main.c @@ -102,6 +102,28 @@ static bool isCmd(char* s, char** e, const char* cmd) { static bool cfg_enableKeyboard = true; static B cfg_path; + static char* command_completion[] = { + ")ex ", + ")r ", + ")escaped ", + ")profile ", ")profile@", + ")t ", ")t:", ")time ", ")time:", + ")mem ", ")mem t", ")mem s", ")mem f", + ")erase ", + ")clearImportCache", + ")kb", + ")theme dark", ")theme light", ")theme none", + ")exit", + ")off", + ")vars", + ")gc", ")gc off", ")gc on", + ")internalPrint ", +#if NATIVE_COMPILER && !ONLY_NATIVE_COMP + ")switchCompiler", +#endif + ")e ", ")explain ", + }; + NOINLINE void cfg_changed(void) { B s = emptyCVec(); AFMT("theme=%i\nkeyboard=%i\n", cfg_theme, cfg_enableKeyboard); @@ -229,32 +251,54 @@ static bool isCmd(char* s, char** e, const char* cmd) { CATCH_OOM(return) B inpB = toC32Any(utf8Decode0(inp)); u32* chars = c32any_ptr(inpB); - u32* we = chars+IA(inpB); - u32* ws = rskip_name(chars, we); - bool sysval = ws>chars && U'•' == *(ws-1); - bool nsField = ws>chars && '.' == *(ws-1); - if (nsField) { - u32* ws2 = rskip_name(chars, ws-1); - if (ws2>chars && U'•' == *(ws2-1)) { ws=ws2; sysval=true; nsField=false; } + u32* ws; + u32* we; + i32 mode; // 0:var 1:sys 2:ns 3:cmd + if (chars[0] == ')') { + ws = chars; + we = chars+IA(inpB); + mode = 3; + } else { + we = chars+IA(inpB); + ws = rskip_name(chars, we); + u32 last = ws>chars? *(ws-1) : 0; + mode = last=='.'? 2 : last==U'•'? 1 : 0; + if (mode==2) { + u32* ws2 = rskip_name(chars, ws-1); + if (ws2>chars && U'•' == *(ws2-1)) { ws=ws2; mode = 1; } + } + if (mode==1) ws--; } - if (sysval) ws--; usz wl = *dist = we-ws; if (wl>0) { usz wo = ws-chars; - bool doUpper; - B norm = str_norm(ws, wl, &doUpper); - B reg = sysval? vec_slice(inpB, wo, wl) : bi_N; + bool doUpper = false; + B norm = mode==3? incG(inpB) : str_norm(ws, wl, &doUpper); + B reg = mode==1? vec_slice(inpB, wo, wl) : bi_N; usz normLen = IA(norm); if (normLen>0) { - B vars = sysval? incG(sysvalNames) : nsField? allNsFields() : listVars(gsc); + B vars; + + switch (mode) { + case 0: vars = listVars(gsc); break; + case 1: vars = incG(sysvalNames); break; + case 2: vars = allNsFields(); break; + case 3: { + usz n = sizeof(command_completion)/sizeof(char*); + HArr_p vo = m_harr0v(n); + for (ux i = 0; i < n; i++) vo.a[i] = m_c8vec_0(command_completion[i]); + vars = vo.b; + } + } + if (q_N(vars)) goto noVars; usz via=IA(vars); SGetU(vars) for (usz i = 0; i < via; i++) { i32 matchState=0; B match=bi_N; usz matchLen=0, skip=0; - for (usz j = 0; j < (sysval? 2 : 1); j++) { + for (usz j = 0; j < (mode==1? 2 : 1); j++) { match = j? harr_ptr(sysvalNamesNorm)[i] : GetU(vars,i); - bool doNorm = sysval? j : true; + bool doNorm = mode==1? j : true; matchLen = IA(match); usz wlen = doNorm? normLen : wl; if (wlen>=matchLen) continue; @@ -289,7 +333,7 @@ static bool isCmd(char* s, char** e, const char* cmd) { noVars:; } decG(norm); - if (sysval) decG(reg); + if (mode==1) decG(reg); } dec(inpB);