📄 motion.c
字号:
draw_line((curr_buff->scr_vert-(curr_buff->scr_pos/COLS)), 0, curr_buff->curr_line->line, 1, curr_buff->curr_line); } } else curr_buff->scr_vert += curr_buff->scr_pos / COLS; curr_buff->absolute_lin++; } } else if (curr_buff->curr_line->next_line == NULL) { wmove(com_win, 0,0); werase(com_win); wprintw(com_win, right_err_msg); wrefresh(com_win); clr_cmd_line = TRUE; } curr_buff->abs_pos = tscr_pos; wmove(curr_buff->win, curr_buff->scr_vert, curr_buff->scr_horz);}void adv_word() /* advance to next word in text */{ if (curr_buff->position != curr_buff->curr_line->line_length) { while ((curr_buff->position < curr_buff->curr_line->line_length) && ((*curr_buff->pointer != ' ') && (*curr_buff->pointer != '\t'))) right(TRUE); while ((curr_buff->position < curr_buff->curr_line->line_length) && ((*curr_buff->pointer == ' ') || (*curr_buff->pointer == '\t'))) right(TRUE); } else right(TRUE);}void prev_word() /* move to start of previous word in text */{ if (curr_buff->position != 1) { if ((curr_buff->position != 1) && ((curr_buff->pointer[-1] == ' ') || (curr_buff->pointer[-1] == '\t'))) { /* if at the start of a word */ while ((curr_buff->position != 1) && ((*curr_buff->pointer != ' ') && (*curr_buff->pointer != '\t'))) left(TRUE); } while ((curr_buff->position != 1) && ((*curr_buff->pointer == ' ') || (*curr_buff->pointer == '\t'))) left(TRUE); while ((curr_buff->position != 1) && ((*curr_buff->pointer != ' ') && (*curr_buff->pointer != '\t'))) left(TRUE); if ((curr_buff->position != 1) && ((*curr_buff->pointer == ' ') || (*curr_buff->pointer == '\t'))) right(TRUE); } else left(TRUE);}void move_rel(direction, lines) /* move relative # of lines to current line */char *direction;int lines;{ struct text *tmp_paste; struct text *tmp_line; int i; int j; int m; int slct_flag; char *tmp; if ((lines > curr_buff->last_line) && (mark_text)) { if (*direction == 'u') { i = 0; while ((i<lines) && (curr_buff->curr_line->prev_line != NULL)) { fast_line("u"); i++; } while (curr_buff->position > 1) fast_left(); } else { for (i=0; (i < lines) && (curr_buff->curr_line->next_line != NULL); i++) fast_line("d"); } curr_buff->pointer = curr_buff->curr_line->line; curr_buff->abs_pos = curr_buff->scr_pos = curr_buff->scr_horz = 0; curr_buff->position = 1; if (curr_buff->curr_line->next_line == NULL) midscreen(curr_buff->last_line, curr_buff->position); else midscreen(curr_buff->last_line/2, curr_buff->position); } else if ((lines > curr_buff->last_line) && (!mark_text)) { if (*direction == 'u') { i = 0; if (curr_buff->curr_line->changed && curr_buff->journalling) write_journal(curr_buff, curr_buff->curr_line); while ((i<lines) && (curr_buff->curr_line->prev_line != NULL)) { curr_buff->curr_line = curr_buff->curr_line->prev_line; i++; } curr_buff->absolute_lin -= i; } else { i = 0; if (curr_buff->curr_line->changed && curr_buff->journalling) write_journal(curr_buff, curr_buff->curr_line); while ((i<lines) && (curr_buff->curr_line->next_line != NULL)) { curr_buff->curr_line = curr_buff->curr_line->next_line; i++; } curr_buff->absolute_lin += i; } curr_buff->pointer = curr_buff->curr_line->line; curr_buff->abs_pos = curr_buff->scr_pos = curr_buff->scr_horz = 0; curr_buff->position = 1; if (curr_buff->curr_line->next_line == NULL) midscreen(curr_buff->last_line, curr_buff->position); else midscreen(curr_buff->last_line/2, curr_buff->position); } else { if (*direction == 'u') { while (curr_buff->position != 1) left(TRUE); curr_buff->abs_pos = curr_buff->scr_pos = curr_buff->scr_horz; for (i = 0; (i < lines) && (curr_buff->curr_line->prev_line != NULL); i++) up(); if ((curr_buff->last_line > 5) && ( curr_buff->scr_vert < 4)) { tmp = curr_buff->pointer; tmp_line = curr_buff->curr_line; slct_flag = mark_text; mark_text = FALSE; tmp_paste = cpste_line; i = j = 0; m = curr_buff->scr_vert; while ((i < 5) && (tmp_line->prev_line != NULL)) { tmp_line = tmp_line->prev_line; i += tmp_line->vert_len; j++; m -=tmp_line->vert_len; } if ((curr_buff->scr_vert - m) > 5) m = curr_buff->scr_vert - 5; if (i > 5) curr_buff->scr_vert = 5; else curr_buff->scr_vert = i; i = -m; wmove(curr_buff->win, 0,0); for (value=0; value<i; value++) winsertln(curr_buff->win); i = curr_buff->scr_vert; tmp_line = curr_buff->curr_line; for (value=0; value<j; value++) { curr_buff->curr_line = curr_buff->curr_line->prev_line; curr_buff->pointer = curr_buff->curr_line->line; i -= curr_buff->curr_line->vert_len; m += curr_buff->curr_line->vert_len; if ((slct_flag) && (cpste_line->prev_line != NULL)) { cpste_line = cpste_line->prev_line; wstandout(curr_buff->win); } draw_line(i, 0, curr_buff->pointer, 1, curr_buff->curr_line); wstandend(curr_buff->win); } curr_buff->curr_line = tmp_line; cpste_line = tmp_paste; curr_buff->pointer = tmp; mark_text = slct_flag; curr_buff->scr_horz = scanline(curr_buff->curr_line, curr_buff->position); } } else { adv_line(); for (i = 1; (i < lines) && (curr_buff->curr_line->next_line != NULL); i++) down(); if ((curr_buff->last_line > 10) && (curr_buff->scr_vert > (curr_buff->last_line - 5)) && (curr_buff->curr_line->next_line != NULL)) { tmp = curr_buff->pointer; tmp_line = curr_buff->curr_line; slct_flag = mark_text; mark_text = FALSE; tmp_paste = cpste_line; j = 1; i = curr_buff->curr_line->vert_len - 1; while ((i < 5) && (tmp_line->next_line != NULL)) { tmp_line = tmp_line->next_line; i += tmp_line->vert_len; j++; } if (i > 5) i = 5; m = i; i = (curr_buff->scr_vert + i ) - curr_buff->last_line; if (i > 0) curr_buff->scr_vert = curr_buff->last_line - m; wmove(curr_buff->win, 0, 0); for (value=0; value<i; value++) wdeleteln(curr_buff->win); tmp_line = curr_buff->curr_line; i = curr_buff->scr_vert; for (value=0; value<j; value++) { if ((slct_flag) && (cpste_line->next_line != NULL)) { cpste_line = cpste_line->next_line; wstandout(curr_buff->win); } draw_line(i, 0, curr_buff->pointer, 1, curr_buff->curr_line); i += curr_buff->curr_line->vert_len; wstandend(curr_buff->win); curr_buff->curr_line = curr_buff->curr_line->next_line; if (curr_buff->curr_line != NULL) curr_buff->pointer = curr_buff->curr_line->line; } curr_buff->curr_line = tmp_line; cpste_line = tmp_paste; curr_buff->pointer = tmp; mark_text = slct_flag; curr_buff->scr_horz = 0; } } } wmove(curr_buff->win, curr_buff->scr_vert, curr_buff->scr_horz);} void eol() /* go to end of current line */{ int e; if ((curr_buff->position == curr_buff->curr_line->line_length) && (curr_buff->curr_line->next_line != NULL)) right(TRUE); e = (curr_buff->curr_line->vert_len - (scanline(curr_buff->curr_line, curr_buff->position) / COLS)) - 1; if (mark_text) { while (curr_buff->position != curr_buff->curr_line->line_length) fast_right(); } else { curr_buff->position = curr_buff->curr_line->line_length; curr_buff->abs_pos = curr_buff->scr_pos = scanline(curr_buff->curr_line, curr_buff->position); curr_buff->scr_horz = curr_buff->scr_pos % COLS; } curr_buff->scr_vert += e; if (curr_buff->scr_vert > curr_buff->last_line) { curr_buff->scr_vert = curr_buff->last_line; midscreen(curr_buff->scr_vert, curr_buff->position); } else if (mark_text) midscreen(curr_buff->scr_vert, curr_buff->position); else { curr_buff->pointer = &(curr_buff->curr_line->line[curr_buff->position - 1]); wmove(curr_buff->win, curr_buff->scr_vert, curr_buff->scr_horz); }}void bol() /* move to beginning of current line */{ int b; b = scanline(curr_buff->curr_line, curr_buff->position) / COLS; if (curr_buff->position != 1) { if (mark_text) { while (curr_buff->position != 1) fast_left(); } else { curr_buff->position = 1; curr_buff->scr_horz = curr_buff->scr_pos = 0; curr_buff->pointer = curr_buff->curr_line->line; } curr_buff->abs_pos = 0; if ((curr_buff->scr_vert - b) < 0) { curr_buff->scr_vert = 0; midscreen(0, curr_buff->position); } else { curr_buff->scr_vert -= b; if (mark_text) midscreen(curr_buff->scr_vert, curr_buff->position); else wmove(curr_buff->win, curr_buff->scr_vert, curr_buff->scr_horz); } } else if (curr_buff->curr_line->prev_line != NULL) { curr_buff->abs_pos = 0; up(); }}void adv_line() /* advance to beginning of next line */{ curr_buff->abs_pos = 0; if (curr_buff->position == 1) down(); else { if (curr_buff->position < curr_buff->curr_line->line_length) eol(); right(TRUE); }}/* | move cursor to the next page */void next_page(){ int counter = 0; int vlength; int tmp_vert = curr_buff->scr_vert; struct text *tmp_line; char done = FALSE; if (curr_buff->curr_line->changed && curr_buff->journalling) write_journal(curr_buff, curr_buff->curr_line); vlength = (curr_buff->curr_line->vert_len - (scanline(curr_buff->curr_line, curr_buff->position) / COLS)) - 1; tmp_line = curr_buff->curr_line; while ((curr_buff->curr_line->next_line != NULL) && (counter < curr_buff->last_line) && (!done)) { if ((curr_buff->curr_line->vert_len + counter - vlength) <= curr_buff->last_line) { counter += curr_buff->curr_line->vert_len - vlength; adv_line(); } else done = TRUE; vlength = 0; } if (counter == 0) { if (curr_buff->curr_line->next_line != NULL) adv_line(); } if (curr_buff->curr_line->next_line != NULL) midscreen(tmp_vert, 0);}/* | move the cursor to the previous page */void prev_page(){ int counter = 0; int vlength; int tmp_vert = curr_buff->scr_vert; struct text *tmp_line; char done = FALSE; if (curr_buff->curr_line->changed && curr_buff->journalling) write_journal(curr_buff, curr_buff->curr_line); vlength = (scanline(curr_buff->curr_line, curr_buff->position) / COLS); tmp_line = curr_buff->curr_line; while ((curr_buff->curr_line->prev_line != NULL) && (counter < curr_buff->last_line) && (!done)) { if ((curr_buff->curr_line->vert_len + counter - vlength) <= curr_buff->last_line) { counter += curr_buff->curr_line->vert_len - vlength; if (curr_buff->position != 1) bol(); bol(); } else done = TRUE; vlength = 0; } if (counter == 0) { if (curr_buff->curr_line->prev_line != NULL) { if (curr_buff->position != 1) bol(); bol(); } } midscreen(tmp_vert, 0);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -