bool route(int ch) { /* Keys available in both ESCAPE and REPLACE modes. */ switch (ch) { case CTRL('c'): case CTRL('q'): return false; break; case KEY_SUSPEND: case CTRL('z'): suspend(); break; case CTRL('w'): buf_write(); break; case CTRL('r'): buf_revert(); break; case CTRL('['): set_state(ESCAPE); break; case KEY_LEFT: move_col(-1); break; case KEY_UP: move_line(-1); break; case KEY_RIGHT: move_col(+1); break; case KEY_DOWN: move_line(+1); break; case '\t': toggle_mode(); break; default: if (buf.state == REPLACE) { replace_char(ch); return true; } break; } /* Keys available in only ESCAPE mode. */ switch (ch) { case 'R': set_state(REPLACE); break; case 'h': move_col(-1); break; case 'k': move_line(-1); break; case 'l': move_col(+1); break; case 'j': move_line(+1); break; case 'w': goto_grp_next(); break; case 'b': goto_grp_prev(); break; case 'g': goto_buffer_beg(); break; case 'G': goto_buffer_end(); break; case '^': goto_line_beg(); break; case '$': goto_line_end(); break; case 'd': goto_half_next(); break; case 'u': goto_half_prev(); break; case '?': view.help = !view.help; break; default: break; } return true; }
int normal_mode_process(int key_down) { #ifdef __VIC_POSIX int second_key_down = 0; #endif char t[100]; sprintf(t, "%x", key_down); print_log(t); switch (key_down) { case '\x1b': //Esc #ifdef __VIC_POSIX second_key_down = getchar(); switch (second_key_down) //double stroke Esc to return to normal mode. { case '\x5b': second_key_down = getchar(); switch (second_key_down) { case '\x41': //up cursor_up(); break; case '\x42': //down cursor_down(); break; case '\x43': //right cursor_right(); break; case '\x44': //left cursor_left(); break; default: break; } break; default: break; } #endif #ifdef __VIC_WIN #endif break; #ifdef __VIC_WIN /* case '\xe0': //first(or last maybe?) ascii of arrow keys. case '\x00': switch (getch()) { case '\x48': //up cursor_up(); break; case '\x50': //down cursor_down(); break; case '\x4b': //left cursor_left(); break; case '\x4d': //right cursor_right(); break; default: break; } break; */ case '\x48': //up cursor_up(); break; case '\x50': //down cursor_down(); break; case '\x4b': //left cursor_left(); break; case '\x4d': //right cursor_right(); break; #endif case '!': //quit directly. enable_display_back(); set_cursor_pos(console_columns, console_lines); exit(0); break; case '1': //New File. case 'n': if (changed_flag == UNCHANGED || changed_flag == UNSAVED) { enable_display_back(); set_cursor_pos(console_columns, console_lines); } else { changed_flag = UNSAVED; } break; case 'q': //quit, is saved should be checked. if (changed_flag == UNCHANGED || changed_flag == UNSAVED) { enable_display_back(); set_cursor_pos(console_columns, console_lines); exit(0); } else { changed_flag = UNSAVED; } break; //belows hjkl for cursor moving. //aiming to disable moving cursor outside the file part. case 'h': cursor_left(); break; case 'l': cursor_right(); break; case 'j': cursor_down(); break; case 'k': cursor_up(); break; case 'w': //word forward. { int position = cur_left + cur_column - 1; int counter = 0; char *cur = get_line(cur_file, cur_top + cur_line - 1)->text; cur += cur_left + cur_column - 2; //to be checked. if (is_word_start(cur)) { position++; counter++; cur++; } for (; position < get_length(get_line(cur_file, cur_line + cur_top - 1)); position++, counter++) { if (is_word_start(cur++)) { break; } } for (; counter > 0; counter--) { cursor_right(); } } break; case 'b': //word backward. { int position = cur_left + cur_column - 1; int counter = 0; char *cur = get_line(cur_file, cur_top + cur_line - 1)->text; cur += cur_left + cur_column - 2; //to be checked. if (is_word_start(cur)) { position--; counter++; cur--; } for (; position > 0; position--, counter++) { if (is_word_start(cur--)) { break; } } for (; counter > 0; counter--) { cursor_left(); } } break; case 'e': //word-end forward. { int position = cur_left + cur_column - 1; int counter = 0; char *cur = get_line(cur_file, cur_top + cur_line - 1)->text; cur += cur_left + cur_column - 2; //to be checked. if (is_word_end(cur)) { position++; counter++; cur++; } for (; position < get_length(get_line(cur_file, cur_line + cur_top - 1)); position++, counter++) { if (is_word_end(cur++)) { break; } } for (; counter > 0; counter--) { cursor_right(); } } break; case 'i': //insert. mode_flag = INSERT_MODE; break; case 'a': //append. cursor_right(); mode_flag = INSERT_MODE; break; case 'd': //delete a word. { v_line *this_line = get_line(cur_file, cur_top + cur_line - 1); unsigned int word_len = 0; unsigned int start_index = cur_left + cur_column - 2; unsigned int end_index = judge_word(this_line, start_index + 1); word_len = end_index - start_index + 1; for (int i = 0; i < end_index - start_index + 1; i++) { del_char(this_line, cur_left + cur_column - 2); } if (word_len != 0) { changed_flag = CHANGED; } } break; case 'x': //delete a single char. del_char(get_line(cur_file, cur_top + cur_line - 1), cur_left + cur_column - 2); changed_flag = CHANGED; break; case 'o': //open new line. insert_empty_line(cur_file, cur_top + cur_line - 1); cursor_down(); mode_flag = INSERT_MODE; break; case '$': goto_line_end(); break; case '^': //goto first char of line. goto_line_actual_start(); break; case '0': //goto fixed first column. goto_line_start(); break; case '3': case ':': //bottom line command mode. //Now I wanna use this as open file command. if (changed_flag == CHANGED) { changed_flag = UNSAVED; break; } mode_flag = BOTTOMLINE_MODE; bottomline_sub_mode = BOTTOM_LINE_FILENAME_OPEN; break; case '/': //bottom line and search. break; case '2': case 's': if (strlen(cur_file_name) == 0) { mode_flag = BOTTOMLINE_MODE; bottomline_sub_mode = BOTTOM_LINE_FILENAME_SAVE; } else { v_save_file(cur_file_name, cur_file); changed_flag = UNCHANGED; } break; #ifdef __VIC_WIN case '\x00': case '\xe0': #endif default: break; } return 0; }