/* Repeats last command of the specified type. Returns 0 on success if no * message should be saved in the status bar, > 0 to save message on successful * execution and < 0 in case of error with error message. */ static int repeat_command(FileView *view, CmdInputType type) { int backward = 0; switch(type) { case CIT_BSEARCH_PATTERN: backward = 1; /* Fall through. */ case CIT_FSEARCH_PATTERN: return find_npattern(view, cfg_get_last_search_pattern(), backward, 1); case CIT_VBSEARCH_PATTERN: backward = 1; /* Fall through. */ case CIT_VFSEARCH_PATTERN: return find_vpattern(view, cfg_get_last_search_pattern(), backward, 1); case CIT_VWBSEARCH_PATTERN: backward = 1; /* Fall through. */ case CIT_VWFSEARCH_PATTERN: return find_vwpattern(NULL, backward); case CIT_COMMAND: return execute_command(view, NULL, 0); case CIT_FILTER_PATTERN: local_filter_apply(view, ""); return 0; default: assert(0 && "Command repetition request of unexpected type."); return 0; } }
int exec_command(const char cmd[], FileView *view, CmdInputType type) { int menu; int backward; if(cmd == NULL) { return repeat_command(view, type); } menu = 0; backward = 0; switch(type) { case CIT_BSEARCH_PATTERN: backward = 1; /* Fall through. */ case CIT_FSEARCH_PATTERN: return find_npattern(view, cmd, backward, 1); case CIT_VBSEARCH_PATTERN: backward = 1; /* Fall through. */ case CIT_VFSEARCH_PATTERN: return find_vpattern(view, cmd, backward, 1); case CIT_VWBSEARCH_PATTERN: backward = 1; /* Fall through. */ case CIT_VWFSEARCH_PATTERN: return find_vwpattern(cmd, backward); case CIT_MENU_COMMAND: menu = 1; /* Fall through. */ case CIT_COMMAND: return execute_command(view, cmd, menu); case CIT_FILTER_PATTERN: if(view->custom.type != CV_DIFF) { local_filter_apply(view, cmd); } else { show_error_msg("Filtering", "No local filter for diff views"); } return 0; default: assert(0 && "Command execution request of unknown/unexpected type."); return 0; } }
static void cmd_ctrl_m(key_info_t key_info, keys_info_t *keys_info) { /* TODO: refactor this cmd_ctrl_m() function. */ char* p; stop_completion(); werase(status_bar); wnoutrefresh(status_bar); if((!input_stat.line || !input_stat.line[0]) && sub_mode == MENU_CMD_SUBMODE) { leave_cmdline_mode(); return; } p = input_stat.line ? to_multibyte(input_stat.line) : NULL; leave_cmdline_mode(); if(prev_mode == VISUAL_MODE && sub_mode != VSEARCH_FORWARD_SUBMODE && sub_mode != VSEARCH_BACKWARD_SUBMODE) leave_visual_mode(curr_stats.save_msg, 1, 0); save_input_to_history(keys_info, p); if(sub_mode == CMD_SUBMODE || sub_mode == MENU_CMD_SUBMODE) { char* s = (p != NULL) ? p : ""; while(*s == ' ' || *s == ':') s++; if(sub_mode == CMD_SUBMODE) curr_stats.save_msg = exec_commands(s, curr_view, GET_COMMAND); else curr_stats.save_msg = exec_commands(s, curr_view, GET_MENU_COMMAND); } else if(sub_mode == PROMPT_SUBMODE) { finish_prompt_submode(p); } else if(sub_mode == FILTER_SUBMODE) { if(cfg.inc_search) { local_filter_accept(curr_view); } else { local_filter_apply(curr_view, p); load_saving_pos(curr_view, 1); } } else if(!cfg.inc_search || prev_mode == VIEW_MODE) { switch(sub_mode) { case SEARCH_FORWARD_SUBMODE: curr_stats.save_msg = exec_command(p, curr_view, GET_FSEARCH_PATTERN); break; case SEARCH_BACKWARD_SUBMODE: curr_stats.save_msg = exec_command(p, curr_view, GET_BSEARCH_PATTERN); break; case VSEARCH_FORWARD_SUBMODE: curr_stats.save_msg = exec_command(p, curr_view, GET_VFSEARCH_PATTERN); break; case VSEARCH_BACKWARD_SUBMODE: curr_stats.save_msg = exec_command(p, curr_view, GET_VBSEARCH_PATTERN); break; case VIEW_SEARCH_FORWARD_SUBMODE: curr_stats.save_msg = exec_command(p, curr_view, GET_VWFSEARCH_PATTERN); break; case VIEW_SEARCH_BACKWARD_SUBMODE: curr_stats.save_msg = exec_command(p, curr_view, GET_VWBSEARCH_PATTERN); break; case MENU_SEARCH_FORWARD_SUBMODE: case MENU_SEARCH_BACKWARD_SUBMODE: curr_stats.need_update = UT_FULL; search_menu_list(p, sub_mode_ptr); break; default: assert(0 && "Unknown command line submode."); break; } } else if(cfg.inc_search && input_stat.search_mode) { /* In case of successful search and 'hlsearch' option set, a message like * "n files selected" is printed automatically. */ if(curr_view->matches == 0 || !cfg.hl_search) { print_search_msg(curr_view, is_backward_search(sub_mode)); curr_stats.save_msg = 1; } } free(p); }