📄 motion.c
字号:
/* | motion.c | | $Header: /home/hugh/sources/aee/RCS/motion.c,v 1.16 1996/04/25 23:44:41 hugh Exp hugh $ *//* | Copyright (c) 1986 - 1988, 1991 - 1996 Hugh Mahon. */#include "aee.h"void bottom() /* go to bottom of file */{ struct text *temp_line; int num_lines; num_lines = 0; if (curr_buff->position > 1) adv_line(); temp_line = curr_buff->curr_line; while (temp_line->next_line != NULL) { num_lines++; temp_line = temp_line->next_line; } move_rel("d", num_lines);}void top() /* go to top of file */{ struct text *temp_line; int num_lines; temp_line = curr_buff->curr_line; num_lines = 0; if (curr_buff->position > 1) bol(); while (temp_line->prev_line != NULL) { num_lines++; temp_line = temp_line->prev_line; } move_rel("u", num_lines);}void nextline() /* move pointers to start of next line */{ int n; int nn; int nvert; char *npoint; n = curr_buff->curr_line->vert_len - (curr_buff->scr_pos / COLS); curr_buff->curr_line = curr_buff->curr_line->next_line; curr_buff->pointer = curr_buff->curr_line->line; curr_buff->position = 1; curr_buff->abs_pos = curr_buff->scr_pos = curr_buff->scr_horz = 0; if ((curr_buff->scr_vert + n) > curr_buff->last_line) { n = (curr_buff->scr_vert + n) - curr_buff->last_line; if (n < curr_buff->last_line) { wmove(curr_buff->win, 0, 0); for (value = 0; value < n; value++) wdeleteln(curr_buff->win); nvert = curr_buff->last_line - curr_buff->curr_line->prev_line->vert_len; nn = 0; npoint = curr_buff->curr_line->prev_line->line; curr_buff->scr_vert = curr_buff->last_line; if ((!mark_text) && ((n > 1) || (curr_buff->curr_line->prev_line->vert_len > 1))) draw_line(nvert, nn, npoint, 1, curr_buff->curr_line->prev_line); draw_line(curr_buff->scr_vert, curr_buff->scr_pos, curr_buff->pointer, 1, curr_buff->curr_line); } else midscreen(curr_buff->last_line, curr_buff->position); } else curr_buff->scr_vert += n;}void prevline() /* move pointers to end of previous line */{ int temp_mark; /* if mark_text must be set to FALSE, store original value here */ int p; int pvert; int ppos; char *pchar; p = curr_buff->curr_line->prev_line->vert_len + (curr_buff->scr_pos / COLS); curr_buff->curr_line = curr_buff->curr_line->prev_line; curr_buff->pointer = curr_buff->curr_line->line; curr_buff->position = 1; curr_buff->scr_pos = 0; if ((curr_buff->scr_vert - p) < 0) { wmove(curr_buff->win, 0, 0); if (p < curr_buff->last_line) { p = p - curr_buff->scr_vert; for (value = 0; value < p; value++) winsertln(curr_buff->win); draw_line(0, 0, curr_buff->pointer, 1, curr_buff->curr_line); curr_buff->scr_vert = 0; if ((mark_text) && (cpste_line->prev_line != NULL)) {/* wrefresh(curr_buff->win);*/ pvert = 0; ppos = curr_buff->position; p = 0; pchar = curr_buff->pointer; if (cpste_line->prev_line->line_length != curr_buff->curr_line->line_length) { ppos += curr_buff->curr_line->line_length - cpste_line->prev_line->line_length; p = scanline(curr_buff->curr_line, ppos); pvert = p / COLS; p %= COLS; for (value = 1; value < ppos; value++) pchar++; } temp_mark = mark_text; mark_text = FALSE; wstandout(curr_buff->win); draw_line(pvert, p, pchar, ppos, curr_buff->curr_line); mark_text = temp_mark; } else if (((p - curr_buff->curr_line->vert_len) > 0) && (mark_text)) { curr_buff->pointer = curr_buff->curr_line->next_line->line; draw_line(curr_buff->curr_line->vert_len, 0, curr_buff->curr_line->next_line->line, 1, curr_buff->curr_line->next_line); curr_buff->pointer = curr_buff->curr_line->line; } else if ((p - curr_buff->curr_line->vert_len) > 0) draw_line(curr_buff->curr_line->vert_len, 0, curr_buff->curr_line->next_line->line, 1, curr_buff->curr_line->next_line); } else midscreen(curr_buff->last_line/2, curr_buff->position); } else curr_buff->scr_vert -= p; while (curr_buff->position < curr_buff->curr_line->line_length) { curr_buff->position++; curr_buff->pointer++; } curr_buff->abs_pos = curr_buff->scr_pos = scanline(curr_buff->curr_line, curr_buff->position);}void left(disp) /* move cursor left one character */int disp;{ int l; int ll; char *lpoint; if (curr_buff->position != 1) /* if not at begin of line */ { ll = curr_buff->scr_pos; curr_buff->pointer--; curr_buff->position--; if (*curr_buff->pointer == '\t') l = scanline(curr_buff->curr_line, curr_buff->position); else l = curr_buff->scr_pos - len_char(*curr_buff->pointer, curr_buff->scr_pos); if ((l / COLS) < (ll / COLS)) { curr_buff->scr_vert--; if (curr_buff->scr_vert < 0) { wmove(curr_buff->win, 0, 0); winsertln(curr_buff->win); lpoint = curr_buff->curr_line->line; curr_buff->scr_vert = 0; curr_buff->scr_vert -= l / COLS; draw_line(curr_buff->scr_vert, 0, lpoint, 1, curr_buff->curr_line); curr_buff->scr_vert = 0; } } curr_buff->abs_pos = curr_buff->scr_pos = l; curr_buff->scr_horz = curr_buff->scr_pos % COLS; wmove(curr_buff->win, curr_buff->scr_vert, curr_buff->scr_horz); if (mark_text) slct_left(); } else if (curr_buff->curr_line->prev_line != NULL) { curr_buff->position = 1; if (curr_buff->curr_line->changed && curr_buff->journalling) write_journal(curr_buff, curr_buff->curr_line); if (disp) { prevline(); curr_buff->scr_horz = curr_buff->scr_pos % COLS; curr_buff->scr_vert += curr_buff->scr_pos / COLS; if (curr_buff->scr_vert > curr_buff->last_line) { l = curr_buff->scr_vert - curr_buff->last_line; if (l < curr_buff->last_line) { curr_buff->scr_vert -= l; wmove(curr_buff->win, 0, 0); while (l > 0) { wdeleteln(curr_buff->win); l--; } l = 1 + curr_buff->scr_vert - curr_buff->curr_line->vert_len; draw_line(l, 0, curr_buff->curr_line->line, 1, curr_buff->curr_line); } else midscreen((curr_buff->last_line / 2), curr_buff->position); } wmove(curr_buff->win, curr_buff->scr_vert, curr_buff->scr_horz); if (mark_text) slct_line("u"); } else { curr_buff->curr_line = curr_buff->curr_line->prev_line; curr_buff->pointer = curr_buff->curr_line->line; while (curr_buff->position < curr_buff->curr_line->line_length) { curr_buff->pointer++; curr_buff->position++; } curr_buff->abs_pos = curr_buff->scr_pos = scanline(curr_buff->curr_line, curr_buff->position); } curr_buff->absolute_lin--; } else if (curr_buff->curr_line->prev_line == NULL) { wmove(com_win, 0,0); werase(com_win); wprintw(com_win, left_err_msg); wrefresh(com_win); clr_cmd_line = TRUE; }}int right(disp) /* move cursor right one character */int disp;{ int r1; int r; char temp; int successful = FALSE; temp = *curr_buff->pointer; if (curr_buff->position < curr_buff->curr_line->line_length) { successful = TRUE; if (mark_text) slct_right(); r1 = curr_buff->scr_pos; r = r1 + len_char(*curr_buff->pointer, curr_buff->scr_pos); curr_buff->pointer++; curr_buff->position++; if ((r / COLS) > (r1 / COLS)) { curr_buff->scr_vert++; if (curr_buff->scr_vert > curr_buff->last_line) { curr_buff->scr_vert--; r1 = curr_buff->scr_vert - (r / COLS); wmove(curr_buff->win, 0, 0); wdeleteln(curr_buff->win); wmove(curr_buff->win, (curr_buff->last_line-1), curr_buff->scr_horz); if (mark_text) wstandout(curr_buff->win); if ((temp > 31) && (temp < 127)) waddch(curr_buff->win, temp); else value = out_char(curr_buff->win, temp, r, (curr_buff->last_line-1), 0); if (mark_text) wstandend(curr_buff->win); curr_buff->scr_horz = r % COLS; draw_line(curr_buff->scr_vert, r, curr_buff->pointer, curr_buff->position, curr_buff->curr_line); } } curr_buff->abs_pos = curr_buff->scr_pos = r; curr_buff->scr_horz = curr_buff->scr_pos % COLS; wmove(curr_buff->win, curr_buff->scr_vert, curr_buff->scr_horz); } else if (curr_buff->curr_line->next_line != NULL) { if (curr_buff->curr_line->changed && curr_buff->journalling) write_journal(curr_buff, curr_buff->curr_line); successful = TRUE; if (disp) { if (mark_text) slct_line("d"); nextline(); wmove(curr_buff->win, curr_buff->scr_vert, curr_buff->scr_horz); } else { curr_buff->curr_line = curr_buff->curr_line->next_line; curr_buff->pointer = curr_buff->curr_line->line; curr_buff->abs_pos = curr_buff->scr_pos = 0; } curr_buff->position = 1; 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; } return(successful);}void find_pos() /* move to the same column as on line previously occupied */{ curr_buff->scr_horz = 0; curr_buff->position = 1; while ((curr_buff->scr_horz < curr_buff->abs_pos) && (curr_buff->position < curr_buff->curr_line->line_length)) { curr_buff->scr_horz += len_char(*curr_buff->pointer, curr_buff->scr_horz); curr_buff->position++; curr_buff->pointer++; }}void up() /* move cursor up one line in the same column */{ int tscr_pos; tscr_pos = curr_buff->abs_pos; if (curr_buff->curr_line->prev_line != NULL) { if (curr_buff->curr_line->changed && curr_buff->journalling) write_journal(curr_buff, curr_buff->curr_line); if (mark_text) { while (curr_buff->position > 1) left(TRUE); left(TRUE); while (curr_buff->scr_pos > tscr_pos) left(TRUE); if ((curr_buff->scr_pos < tscr_pos) && (curr_buff->position < curr_buff->curr_line->line_length)) right(TRUE); } else { prevline(); curr_buff->pointer = curr_buff->curr_line->line; curr_buff->position = 1; curr_buff->scr_horz = 0; curr_buff->abs_pos = tscr_pos; find_pos(); curr_buff->scr_pos = curr_buff->scr_horz; curr_buff->scr_horz = curr_buff->scr_pos % COLS; if (((curr_buff->scr_pos / COLS) + curr_buff->scr_vert) > curr_buff->last_line) midscreen(curr_buff->last_line/2, curr_buff->position); else curr_buff->scr_vert += (curr_buff->scr_pos / COLS); curr_buff->absolute_lin--; } } else if (curr_buff->curr_line->prev_line == NULL) { wmove(com_win, 0,0); werase(com_win); wprintw(com_win, left_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 down() /* move cursor down one line in the same column */{ int d; int tscr_pos; tscr_pos = curr_buff->abs_pos; if (curr_buff->curr_line->next_line != NULL) { if (curr_buff->curr_line->changed && curr_buff->journalling) write_journal(curr_buff, curr_buff->curr_line); if (mark_text) { d = curr_buff->scr_vert + (curr_buff->curr_line->vert_len - (curr_buff->scr_pos / COLS)); while (curr_buff->position < curr_buff->curr_line->line_length) right(TRUE); right(TRUE); while ((curr_buff->scr_pos < tscr_pos) && (curr_buff->position < curr_buff->curr_line->line_length)) right(TRUE); } else { nextline(); curr_buff->abs_pos = tscr_pos; find_pos(); curr_buff->scr_pos = curr_buff->scr_horz; curr_buff->scr_horz = curr_buff->scr_pos % COLS; if (((curr_buff->scr_pos / COLS)+curr_buff->scr_vert) > curr_buff->last_line) { d = (curr_buff->scr_vert + (curr_buff->scr_pos / COLS)) - curr_buff->last_line; if (d > curr_buff->last_line) midscreen(curr_buff->last_line/2, curr_buff->position); else { curr_buff->scr_vert += (curr_buff->scr_pos / COLS) - d; wmove(curr_buff->win, 0,0); while (d > 0) { wdeleteln(curr_buff->win); d--; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -