completion options for system commands
This commit is contained in:
parent
a570bcaf88
commit
1c1da8fdfe
74
src/main.c
74
src/main.c
@ -102,6 +102,28 @@ static bool isCmd(char* s, char** e, const char* cmd) {
|
|||||||
static bool cfg_enableKeyboard = true;
|
static bool cfg_enableKeyboard = true;
|
||||||
static B cfg_path;
|
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) {
|
NOINLINE void cfg_changed(void) {
|
||||||
B s = emptyCVec();
|
B s = emptyCVec();
|
||||||
AFMT("theme=%i\nkeyboard=%i\n", cfg_theme, cfg_enableKeyboard);
|
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)
|
CATCH_OOM(return)
|
||||||
B inpB = toC32Any(utf8Decode0(inp));
|
B inpB = toC32Any(utf8Decode0(inp));
|
||||||
u32* chars = c32any_ptr(inpB);
|
u32* chars = c32any_ptr(inpB);
|
||||||
u32* we = chars+IA(inpB);
|
u32* ws;
|
||||||
u32* ws = rskip_name(chars, we);
|
u32* we;
|
||||||
bool sysval = ws>chars && U'•' == *(ws-1);
|
i32 mode; // 0:var 1:sys 2:ns 3:cmd
|
||||||
bool nsField = ws>chars && '.' == *(ws-1);
|
if (chars[0] == ')') {
|
||||||
if (nsField) {
|
ws = chars;
|
||||||
u32* ws2 = rskip_name(chars, ws-1);
|
we = chars+IA(inpB);
|
||||||
if (ws2>chars && U'•' == *(ws2-1)) { ws=ws2; sysval=true; nsField=false; }
|
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;
|
usz wl = *dist = we-ws;
|
||||||
if (wl>0) {
|
if (wl>0) {
|
||||||
usz wo = ws-chars;
|
usz wo = ws-chars;
|
||||||
bool doUpper;
|
bool doUpper = false;
|
||||||
B norm = str_norm(ws, wl, &doUpper);
|
B norm = mode==3? incG(inpB) : str_norm(ws, wl, &doUpper);
|
||||||
B reg = sysval? vec_slice(inpB, wo, wl) : bi_N;
|
B reg = mode==1? vec_slice(inpB, wo, wl) : bi_N;
|
||||||
usz normLen = IA(norm);
|
usz normLen = IA(norm);
|
||||||
if (normLen>0) {
|
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;
|
if (q_N(vars)) goto noVars;
|
||||||
usz via=IA(vars); SGetU(vars)
|
usz via=IA(vars); SGetU(vars)
|
||||||
for (usz i = 0; i < via; i++) {
|
for (usz i = 0; i < via; i++) {
|
||||||
i32 matchState=0; B match=bi_N; usz matchLen=0, skip=0;
|
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);
|
match = j? harr_ptr(sysvalNamesNorm)[i] : GetU(vars,i);
|
||||||
bool doNorm = sysval? j : true;
|
bool doNorm = mode==1? j : true;
|
||||||
matchLen = IA(match);
|
matchLen = IA(match);
|
||||||
usz wlen = doNorm? normLen : wl;
|
usz wlen = doNorm? normLen : wl;
|
||||||
if (wlen>=matchLen) continue;
|
if (wlen>=matchLen) continue;
|
||||||
@ -289,7 +333,7 @@ static bool isCmd(char* s, char** e, const char* cmd) {
|
|||||||
noVars:;
|
noVars:;
|
||||||
}
|
}
|
||||||
decG(norm);
|
decG(norm);
|
||||||
if (sysval) decG(reg);
|
if (mode==1) decG(reg);
|
||||||
}
|
}
|
||||||
|
|
||||||
dec(inpB);
|
dec(inpB);
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user