コード例 #1
0
/* Determines what kind of processing should be applied to the command pointed
 * to by the cmd.  Returns the kind. */
static CmdArgsType
get_cmd_args_type(const char cmd[])
{
	const int cmd_id = get_cmd_id(cmd);
	switch(cmd_id)
	{
		case COMMAND_CMD_ID:
		case COM_AUTOCMD:
		case COM_EXECUTE:
		case COM_CMAP:
		case COM_CNOREMAP:
		case COM_COMMAND:
		case COM_DMAP:
		case COM_DNOREMAP:
		case COM_FILETYPE:
		case COM_FILEVIEWER:
		case COM_FILEXTYPE:
		case COM_MAP:
		case COM_MMAP:
		case COM_MNOREMAP:
		case COM_NMAP:
		case COM_NNOREMAP:
		case COM_NORMAL:
		case COM_QMAP:
		case COM_QNOREMAP:
		case COM_VMAP:
		case COM_VNOREMAP:
		case COM_NOREMAP:
		case COM_WINCMD:
		case COM_WINDO:
		case COM_WINRUN:
			return CAT_UNTIL_THE_END;

		default:
			return command_accepts_expr(cmd_id) ? CAT_EXPR : CAT_REGULAR;
	}
}
コード例 #2
0
ファイル: commands_completion.c プロジェクト: sshilovsky/vifm
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;
}