char * fast_run_complete(const char cmd[]) { char *result = NULL; const char *args; char command[NAME_MAX]; char *completed; args = extract_cmd_name(cmd, 0, sizeof(command), command); if(is_path_absolute(command)) { return strdup(cmd); } vle_compl_reset(); complete_command_name(command); vle_compl_unite_groups(); completed = vle_compl_next(); if(vle_compl_get_count() > 2) { int c = vle_compl_get_count() - 1; while(c-- > 0) { if(stroscmp(command, completed) == 0) { result = strdup(cmd); break; } else { free(completed); completed = vle_compl_next(); } } if(result == NULL) { status_bar_error("Command beginning is ambiguous"); } } else { free(completed); completed = vle_compl_next(); result = format_str("%s %s", completed, args); } free(completed); return result; }
/* Picks window to use for suggestion box and prepares it for displaying data. * Sets *height to number of suggestions to display. Returns picked window. */ static WINDOW * prepare_suggestion_box(int *height) { WINDOW *win; const col_attr_t col = cfg.cs.color[SUGGEST_BOX_COLOR]; const int count = vle_compl_get_count(); if((cfg.sug.flags & SF_OTHERPANE) && curr_stats.number_of_windows == 2) { win = other_view->win; *height = MIN(count, getmaxy(win)); } else { const int max_height = getmaxy(stdscr) - getmaxy(status_bar) - ui_stat_job_bar_height() - 2; *height = MIN(count, max_height); wresize(stat_win, *height, getmaxx(stdscr)); ui_stat_reposition(getmaxy(status_bar), 1); win = stat_win; } /* Clear preview before displaying suggestion for the first time for specific * input if active preview needs special cleanup. */ if(!suggestions_are_visible && curr_stats.preview.on && curr_stats.preview.cleanup_cmd != NULL) { qv_cleanup(other_view, curr_stats.preview.cleanup_cmd); } ui_set_bg(win, &col, -1); werase(win); return win; }
/* Picks window to use for suggestion box and prepares it for displaying data. * Sets *height to number of suggestions to display. Returns picked window. */ static WINDOW * prepare_suggestion_box(int *height) { WINDOW *win; const col_attr_t col = cfg.cs.color[SUGGEST_BOX_COLOR]; const int count = vle_compl_get_count(); if((cfg.sug.flags & SF_OTHERPANE) && curr_stats.number_of_windows == 2) { win = other_view->win; *height = MIN(count, getmaxy(win)); } else { const int max_height = getmaxy(stdscr) - getmaxy(status_bar) - ui_stat_job_bar_height() - 2; *height = MIN(count, max_height); wresize(stat_win, *height, getmaxx(stdscr)); ui_stat_reposition(getmaxy(status_bar), 1); win = stat_win; } wbkgdset(win, COLOR_PAIR(colmgr_get_pair(col.fg, col.bg)) | col.attr); werase(win); return win; }
/* Composes and draws suggestion box. */ static void display_suggestion_box(const wchar_t input[]) { size_t prefix; /* Don't do this for ESC because it's prefix for other keys. */ if(!should_display_suggestion_box() || wcscmp(input, L"\033") == 0) { return; } /* Fill completion list with suggestions of keys and marks. */ vle_compl_reset(); vle_keys_suggest(input, &process_suggestion, !(cfg.sug.flags & SF_KEYS), (cfg.sug.flags & SF_FOLDSUBKEYS)); /* Completion grouping removes duplicates. Because user-defined keys are * reported first, this has an effect of leaving only them in the resulting * list, which is correct as they have higher priority. */ vle_compl_finish_group(); /* Handle registers suggestions. */ prefix = wcsspn(input, L"0123456789"); if((cfg.sug.flags & SF_REGISTERS) && input[prefix] == L'"' && input[prefix + 1U] == L'\0') { regs_sync_from_shared_memory(); /* No vle_compl_finish_group() after this to prevent sorting and * deduplication. */ regs_suggest(&process_suggestion, cfg.sug.maxregfiles); } if(vle_compl_get_count() != 0) { draw_suggestion_box(); suggestions_are_visible = 1; } }