diff options
Diffstat (limited to 'lib/autocomplete.c')
| -rw-r--r-- | lib/autocomplete.c | 24 |
1 files changed, 19 insertions, 5 deletions
diff --git a/lib/autocomplete.c b/lib/autocomplete.c index 12a8cdc..9a33ea3 100644 --- a/lib/autocomplete.c +++ b/lib/autocomplete.c @@ -44,10 +44,24 @@ aplwc_autocomplete(struct aplwc *aplwc, const char *line, int start, int end) memcpy(word, line+start, len); word[len] = 0; - if(start == 0 && word[0] == ')') - completions = generate(aplwc, word, completions_syscmd); + struct aplwc_eval_context *context = aplwc_new_eval_context(aplwc); + aplwc_scan_line(context, line); + struct aplwc_token *tok = NULL; + for(size_t i = 0; (i < context->n_tokens) && (tok == NULL); i++) + if(((size_t)start >= context->tokens[i]->offset_start) && ((size_t)end <= context->tokens[i]->offset_end + 1)) + tok = context->tokens[i]; + + if(tok) + switch(tok->tag) { + case APLWC_TOKEN_SYSCMD: + completions = generate(aplwc, word, completions_syscmd); + break; + default: + break; + } free(word); - + + aplwc_free_eval_context(context); return completions; } @@ -64,7 +78,7 @@ generate(struct aplwc *aplwc, const char *word, char *(*fn)(struct completion_st char *c; int index = 0; - while(c = fn(&state)){ + while((c = fn(&state))){ index++; completions = realloc(completions, sizeof(*completions) * (index + 1)); completions[index-1] = c; @@ -79,7 +93,7 @@ completions_syscmd(struct completion_state *state) { struct aplwc_syscmd *syscmd; - while(syscmd = state->aplwc->syscmds[state->num++]){ + while((syscmd = state->aplwc->syscmds[state->num++])){ const char *name = syscmd->name; if(strncmp(name, state->word+1, state->wordlen-1) == 0){ int len = strlen(name); |