Пример #1
0
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);
}
Пример #2
0
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);
}
Пример #3
0
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);
}
Пример #4
0
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;
}