static void test_envvars_completion(void) { char buf[] = "$VAR_"; const char *start; char *completed; complete_variables(buf, &start); assert_true(&buf[1] == start); completed = next_completion(); assert_string_equal("VAR_A", completed); free(completed); completed = next_completion(); assert_string_equal("VAR_B", completed); free(completed); completed = next_completion(); assert_string_equal("VAR_C", completed); free(completed); completed = next_completion(); assert_string_equal("VAR_", completed); free(completed); }
static void test_vars_empty_completion(void) { char buf[] = ""; const char *start; char *completed; complete_variables(buf, &start); assert_true(&buf[0] == start); completed = next_completion(); assert_string_equal("", completed); free(completed); }
static void test_do_not_complete_removed_variables(void) { char buf[] = "$VAR_"; const char *start; char *completed; assert_int_equal(0, unlet_variables("$VAR_B")); complete_variables(buf, &start); assert_true(&buf[1] == start); completed = next_completion(); assert_string_equal("VAR_A", completed); free(completed); completed = next_completion(); assert_string_equal("VAR_C", completed); free(completed); completed = next_completion(); assert_string_equal("VAR_", completed); free(completed); }
int complete_args(int id, const char args[], int argc, char *argv[], int arg_pos, void *extra_arg) { /* TODO: Refactor this function complete_args() */ const char *arg; const char *start; const char *slash; const char *dollar; const char *ampersand; arg = after_last(args, ' '); start = arg; slash = strrchr(args + arg_pos, '/'); dollar = strrchr(arg, '$'); ampersand = strrchr(arg, '&'); if(id == COM_SET) complete_options(args, &start); else if(command_accepts_expr(id)) { if(ampersand > dollar) { start = ampersand + 1; complete_real_option_names(ampersand + 1); } else { complete_variables((dollar > arg) ? dollar : arg, &start); } } else if(id == COM_UNLET) complete_variables(arg, &start); else if(id == COM_HELP) complete_help(args); else if(id == COM_HISTORY) { complete_history(args); start = args; } else if(id == COM_INVERT) { complete_invert(args); start = args; } else if(id == COM_CHOWN) start += complete_chown(args); else if(id == COM_FILE) complete_filetype(args); else if(id == COM_HIGHLIGHT) { if(argc == 0 || (argc == 1 && !cmd_ends_with_space(args))) complete_highlight_groups(args); else start += complete_highlight_arg(arg); } else if((id == COM_CD || id == COM_PUSHD || id == COM_EXECUTE || id == COM_SOURCE) && dollar != NULL && dollar > slash) { start = dollar + 1; complete_envvar(start); } else if(id == COM_WINDO) ; else if(id == COM_WINRUN) { if(argc == 0) complete_winrun(args); } else { char *free_me = NULL; size_t arg_num = argc; start = slash; if(start == NULL) start = args + arg_pos; else start++; if(argc > 0 && !cmd_ends_with_space(args)) { if(ends_with(args, "\"")) { return start - args; } if(ends_with(args, "'")) { return start - args; } arg_num = argc - 1; arg = argv[arg_num]; } switch((CompletionPreProcessing)extra_arg) { case CPP_NONE: /* Do nothing. */ break; case CPP_SQUOTES_UNESCAPE: arg = args + arg_pos + 1; start = (slash == NULL) ? arg : (slash + 1); free_me = strdup(arg); expand_squotes_escaping(free_me); arg = free_me; break; case CPP_DQUOTES_UNESCAPE: arg = args + arg_pos + 1; start = (slash == NULL) ? arg : (slash + 1); free_me = strdup(arg); expand_dquotes_escaping(free_me); arg = free_me; break; }; if(id == COM_COLORSCHEME) { complete_colorscheme(arg, arg_num); } else if(id == COM_CD || id == COM_PUSHD || id == COM_SYNC || id == COM_MKDIR) { filename_completion(arg, CT_DIRONLY); } else if(id == COM_COPY || id == COM_MOVE || id == COM_ALINK || id == COM_RLINK) { filename_completion_in_dir(other_view->curr_dir, arg, CT_ALL); } else if(id == COM_SPLIT || id == COM_VSPLIT) { filename_completion_in_dir(curr_view->curr_dir, arg, CT_DIRONLY); } else if(id == COM_FIND) { if(argc == 1 && !cmd_ends_with_space(args)) filename_completion(arg, CT_DIRONLY); } else if(id == COM_EXECUTE) { if(argc == 0 || (argc == 1 && !cmd_ends_with_space(args))) { if(*arg == '.') filename_completion(arg, CT_DIREXEC); else complete_command_name(arg); } else filename_completion(arg, CT_ALL); } else if(id == COM_TOUCH || id == COM_RENAME) { filename_completion(arg, CT_ALL_WOS); } else { filename_completion(arg, CT_ALL); } free(free_me); } return start - args; }