/* Handles backspace. */ static void cmd_ctrl_h(key_info_t key_info, keys_info_t *keys_info) { input_stat.history_search = HIST_NONE; stop_completion(); if(should_quit_on_backspace()) { cmd_ctrl_c(key_info, keys_info); return; } if(input_stat.index == 0) { return; } input_stat.index--; input_stat.len--; input_stat.curs_pos -= vifm_wcwidth(input_stat.line[input_stat.index]); if(input_stat.index == input_stat.len) { input_stat.line[input_stat.index] = L'\0'; } else { wcsdel(input_stat.line, input_stat.index + 1, 1); } update_cmdline_text(); }
static void cmd_ctrl_h(key_info_t key_info, keys_info_t *keys_info) { input_stat.history_search = HIST_NONE; stop_completion(); if(input_stat.index == 0 && input_stat.len == 0 && sub_mode != PROMPT_SUBMODE) { cmd_ctrl_c(key_info, keys_info); return; } if(input_stat.index == 0) return; if(input_stat.index == input_stat.len) { input_stat.index--; input_stat.len--; input_stat.curs_pos -= wcwidth(input_stat.line[input_stat.index]); input_stat.line[input_stat.index] = L'\0'; } else { input_stat.index--; input_stat.len--; input_stat.curs_pos -= wcwidth(input_stat.line[input_stat.index]); wcsdel(input_stat.line, input_stat.index + 1, 1); } update_cmdline_text(); }
static void cmd_delete(key_info_t key_info, keys_info_t *keys_info) { input_stat.history_search = HIST_NONE; stop_completion(); if(input_stat.index == input_stat.len) return; wcsdel(input_stat.line, input_stat.index+1, 1); input_stat.len--; update_cmdline_text(); }
/* Handler of Ctrl-W shortcut, which remove all to the left until beginning of * the word is found (i.e. until first delimiter character). */ static void cmd_ctrl_w(key_info_t key_info, keys_info_t *keys_info) { int old; input_stat.history_search = HIST_NONE; stop_completion(); old = input_stat.index; while(input_stat.index > 0 && iswspace(input_stat.line[input_stat.index - 1])) { input_stat.curs_pos -= vifm_wcwidth(input_stat.line[input_stat.index - 1]); input_stat.index--; } if(iswalnum(input_stat.line[input_stat.index - 1])) { while(input_stat.index > 0 && iswalnum(input_stat.line[input_stat.index - 1])) { const wchar_t curr_wchar = input_stat.line[input_stat.index - 1]; input_stat.curs_pos -= vifm_wcwidth(curr_wchar); input_stat.index--; } } else { while(input_stat.index > 0 && !iswalnum(input_stat.line[input_stat.index - 1]) && !iswspace(input_stat.line[input_stat.index - 1])) { const wchar_t curr_wchar = input_stat.line[input_stat.index - 1]; input_stat.curs_pos -= vifm_wcwidth(curr_wchar); input_stat.index--; } } if(input_stat.index != old) { wcsdel(input_stat.line, input_stat.index + 1, old - input_stat.index); input_stat.len -= old - input_stat.index; } update_cmdline_text(); }
static void do_completion(void) { if(input_stat.complete == NULL) return; if(input_stat.line == NULL) { input_stat.line = my_wcsdup(L""); if(input_stat.line == NULL) return; } line_completion(&input_stat); update_cmdline_size(); update_cmdline_text(); }
static int def_handler(wchar_t key) { void *p; wchar_t buf[2] = {key, L'\0'}; input_stat.history_search = HIST_NONE; if(input_stat.complete_continue && input_stat.line[input_stat.index - 1] == L'/' && key == '/') { stop_completion(); return 0; } stop_completion(); if(key != L'\r' && !iswprint(key)) return 0; p = realloc(input_stat.line, (input_stat.len + 2) * sizeof(wchar_t)); if(p == NULL) { leave_cmdline_mode(); return 0; } input_stat.line = (wchar_t *) p; if(input_stat.len == 0) input_stat.line[0] = L'\0'; input_stat.index++; wcsins(input_stat.line, buf, input_stat.index); input_stat.len++; input_stat.curs_pos += wcwidth(key); update_cmdline_size(); update_cmdline_text(); return 0; }
static void cmd_meta_d(key_info_t key_info, keys_info_t *keys_info) { int old_i, old_c; old_i = input_stat.index; old_c = input_stat.curs_pos; find_next_word(); if(input_stat.index == old_i) { return; } wcsdel(input_stat.line, old_i + 1, input_stat.index - old_i); input_stat.len -= input_stat.index - old_i; input_stat.index = old_i; input_stat.curs_pos = old_c; update_cmdline_text(); }
/* Inserts last part of previous command to current cursor position. Each next * call will insert last part of older command. */ static void cmd_meta_dot(key_info_t key_info, keys_info_t *keys_info) { wchar_t *wide; if(sub_mode != CMD_SUBMODE) { return; } stop_history_completion(); if(hist_is_empty(&cfg.cmd_hist)) { return; } if(input_stat.dot_pos < 0) { input_stat.dot_pos = input_stat.cmd_pos + 1; } else { remove_previous_dot_completion(); } wide = next_dot_completion(); if(insert_dot_completion(wide) == 0) { update_cmdline_text(); } else { stop_dot_completion(); } free(wide); }
static void cmd_ctrl_u(key_info_t key_info, keys_info_t *keys_info) { input_stat.history_search = HIST_NONE; stop_completion(); if(input_stat.index == 0) return; input_stat.len -= input_stat.index; input_stat.curs_pos = input_stat.prompt_wid; wcsdel(input_stat.line, 1, input_stat.index); input_stat.index = 0; werase(status_bar); mvwaddwstr(status_bar, 0, 0, input_stat.prompt); mvwaddwstr(status_bar, 0, input_stat.prompt_wid, input_stat.line); update_cmdline_text(); }
void redraw_cmdline(void) { if(prev_mode == MENU_MODE) { menu_redraw(); } else { redraw_window(); if(prev_mode == SORT_MODE) redraw_sort_dialog(); else if(prev_mode == ATTR_MODE) redraw_attr_dialog(); } line_width = getmaxx(stdscr); curs_set(TRUE); update_cmdline_size(); update_cmdline_text(); if(cfg.wild_menu) draw_wild_menu(-1); }
void redraw_cmdline(void) { if(prev_mode == MENU_MODE) { menu_redraw(); } else { update_screen(UT_FULL); if(prev_mode == SORT_MODE) redraw_sort_dialog(); else if(prev_mode == ATTR_MODE) redraw_attr_dialog(); } line_width = getmaxx(stdscr); curs_set(TRUE); update_cmdline_size(); update_cmdline_text(); if(input_stat.complete_continue && cfg.wild_menu) draw_wild_menu(-1); }
static void prepare_cmdline_mode(const wchar_t *prompt, const wchar_t *cmd, complete_cmd_func complete) { line_width = getmaxx(stdscr); prev_mode = *mode; *mode = CMDLINE_MODE; input_stat.line = NULL; input_stat.index = wcslen(cmd); input_stat.curs_pos = 0; input_stat.len = input_stat.index; input_stat.cmd_pos = -1; input_stat.complete_continue = 0; input_stat.history_search = HIST_NONE; input_stat.line_buf = NULL; input_stat.reverse_completion = 0; input_stat.complete = complete; input_stat.search_mode = 0; if(sub_mode == SEARCH_FORWARD_SUBMODE || sub_mode == VSEARCH_FORWARD_SUBMODE || sub_mode == MENU_SEARCH_FORWARD_SUBMODE || sub_mode == SEARCH_BACKWARD_SUBMODE || sub_mode == VSEARCH_BACKWARD_SUBMODE || sub_mode == MENU_SEARCH_BACKWARD_SUBMODE) { input_stat.search_mode = 1; if(prev_mode != MENU_MODE) { input_stat.old_top = curr_view->top_line; input_stat.old_pos = curr_view->list_pos; } else { save_menu_pos(); } } wcsncpy(input_stat.prompt, prompt, ARRAY_LEN(input_stat.prompt)); input_stat.prompt_wid = input_stat.curs_pos = wcslen(input_stat.prompt); if(input_stat.len != 0) { input_stat.line = malloc(sizeof(wchar_t)*(input_stat.len + 1)); if(input_stat.line == NULL) { input_stat.index = 0; input_stat.len = 0; } else { wcscpy(input_stat.line, cmd); input_stat.curs_pos += input_stat.len; } } curs_set(TRUE); update_cmdline_size(); update_cmdline_text(); curr_stats.save_msg = 1; if(prev_mode == NORMAL_MODE) init_commands(); }