📄 edit.cc
字号:
#include <stdio.h>
#include <stdlib.h>
#include <curses.h>
#include <iostream.h>
#include <panel.h>
#include <string.h>
#include <ctype.h>
#define CNTRL_O 15
#define CNTRL_N 14
#define CNTRL_S 19
#define CNTRL_W 23
#define CNTRL_Y 25
class node
{
public :
int data,row,col;
node *next,*prev,*up,*down;
node()
{
row = 1;
col = 0;
next = prev = up = down = NULL;
}
};
class list
{
private :
node *head,*last,*end;
public :
list()
{
head = last = end = NULL;
}
void enter();
node* crow();
void alpha(int c);
void alins(int c);
void ins_word(WINDOW *);
void ins_line(WINDOW *);
void line_in(WINDOW *);
void word_in(WINDOW *);
void init();
WINDOW * init_main(WINDOW * main);
void main_win(WINDOW *main);
void inwin(WINDOW *win);
void ref_sub(WINDOW *);
void forcolor(WINDOW *);
void backcolor(WINDOW *);
void open_win(WINDOW *);
void open_help(WINDOW *);
int help_menu(WINDOW *,int);
int open_file(WINDOW *,int);
int open_edit(WINDOW *);
int open_page(WINDOW *);
void del_file(WINDOW *);
void open_about(WINDOW *);
int checkc(int);
node* find(int,int);
void disp(WINDOW *win);
void fsave(WINDOW *);
void nsave(WINDOW *);
void leftm(WINDOW *);
void rightm(WINDOW *);
void topm(WINDOW *);
void botm(WINDOW *);
void arrow_up();
void arrow_down();
void arrow_right();
void arrow_left();
void upa();
void dwna();
void home();
void enda();
void back();
void d_word();
void d_char();
void delc(int,int);
void dell();
void d_lin();
void delw();
void ad_delc(int,int,int);
void d_tab(node *);
void b_tab(node *);
void begin();
void endp();
WINDOW* mainc(WINDOW *);
void blockwin(WINDOW *,char st[20][50],int,int);
};
int ins = 1, save = 1, tab = 5;
int lm = 0, rm = 0, tm = 0, bm = 0;
int x = 0, x1 = 0, k = 1, y = 1,z = 0;
int colour[] = {0,1,2,3,4,5,6,7}, fore = 7, bac = 4;
char name[50] = "noname";
void list :: enter()
{
save = 0;
node *p,*q,*r,*s,*t;
int i,j;
p = new node;
p -> data = '\n';
p -> row = k;
p -> col = x1;
for (q = head;q != NULL && q -> row != k;q = q -> down);
for (r = q;r != NULL && r -> col != x1 - 1;r = r -> next);
last = r;
if(last != NULL) r = last -> next;
p -> next = NULL;
if (last != NULL) last -> next = p;
p -> prev = last;
s = crow();
s -> next = r;
if (r != NULL) r -> prev = s;
x1 = 1;
for (t = s -> next;t != NULL;t = t -> next)
{
t -> col = x1++;
t -> row = k + 1;
}
}
node* list :: crow()
{
node *p,*q,*r;
p = new node;
p -> row = k + 1;
for (q = head;q != NULL && q -> row != k;q = q -> down);
if (q -> down == NULL)
{
end -> down = p;
p -> up = end;
end = p;
}
else
{
r = q -> down;
p -> up = q;
p -> down = r;
if (r != NULL) r -> up = p;
q -> down = p;
}
for (q = p -> down;q != NULL;q = q -> down)
for (r = q;r != NULL;r = r -> next)
r -> row++;
return p;
}
void list :: alpha(int c)
{
save = 0;
node *p,*q,*r;
p = new node;
p -> row = k;
p -> col = x1;
p -> data = c;
for (q = head;q != NULL && q -> row != k;q = q -> down);
for (r = q;r != NULL && r -> col != x1 - 1;r = r -> next);
last = r;
if(last != NULL) r = last -> next;
p -> next = r;
p -> prev = last;
if (r != NULL) r -> prev = p;
if(last != NULL) last -> next = p;
for (q = p -> next;q != NULL;q = q -> next)
q -> col++;
x1++;
}
void list :: init()
{
head = new node;
end = head;
last = head;
}
void list :: disp(WINDOW *win)
{
node *p,*q,*r,*t;
int i,j,flag = 0,d,e,n = z;
int l = 1,m = lm + 1;
werase(win);
p = head;
e = 0;
while(1)
{
if (n == 0) break;
e = checkc(p -> row);
i = (e % (78 - rm - lm));
e = e / (78 - rm - lm);
e++;
if (i == 0) e--;
q = p;
if (e <= n)
{
n = n - e;
p = p -> down;
}
else
{
for (d = 0;d < ((78 - lm - rm) * (n));d++) p = p -> next;
flag = 1;
break;
}
}
l = tm + 1;
m = 1;
i = tm + 1;
for (r = p;r != NULL;r = r -> down)
{
m = lm + 1;
for (t = r -> next;t != NULL;t = t -> next)
{
if (m == 79 - rm)
{
m = lm + 1;
l++;
i++;
if (i >= 22 - bm) return;
}
wmove(win,l,m++);
if(t -> data == '\v') waddch(win,' ');
else waddch(win,t -> data);
}
if (flag == 1)
{
r = q;
flag = 0;
}
l++;
i++;
if (i >= 22 - bm) break;
}
}
int list :: checkc(int a)
{
node *p,*q;
for (p = head;p -> row != a;p = p -> down);
if (p -> next == NULL) return(0);
for (q = p -> next;q -> next != NULL;q = q -> next);
return(q -> col);
}
void list :: alins(int c)
{
save = 0;
node *p,*q,*r;
for (q = head;q != NULL && q -> row != k;q = q -> down);
for (r = q;r != NULL && r -> col != x1;r = r -> next);
r -> data = c;
x1++;
}
node *list :: find(int a,int b)
{
node *p,*q,*r;
for(p = head;p != NULL && p -> row != a;p = p -> down);
for(q = p;q != NULL && q -> col != b;q = q -> next);
if (q != NULL) return q;
return NULL;
}
void list :: d_tab(node *p)
{
save = 0;
int i;
node *q,*r;
r = p -> prev;
for (i = 0;i <= 4;i++) p = p -> next;
for (q = p;q != NULL;q = q -> next) q -> col -= 5;
if (r != NULL) r -> next = p;
if (p != NULL) p -> prev = r;
}
void list :: b_tab(node *p)
{
save = 0;
int i;
node *q,*r;
r = p -> next;
for (i = 0;i <= 4;i++) p = p -> prev;
for (q = r;q != NULL;q = q -> next) q -> col -= 5;
if (r != NULL) r -> prev = p;
if (p != NULL) p -> next = r;
}
void list :: delw()
{
node *p,*q,*r;
int i;
p = find(k,x1);
if (p == NULL)
{
x1--;
p = find(k,x1);
x--;
}
if (p -> data == '\t')
{
d_tab(p);
return;
}
r = p;
while(p -> data != ' ' && p -> col != 0 && p -> prev -> data != '\t') p = p -> prev;
if (r != NULL && r -> next != NULL){
while(r -> data != ' ' && r -> next -> data != '\n' && r -> next -> data != '\t' && r != NULL)
{
r = r -> next;
if (r == NULL || r -> next == NULL) break;
}}
if (r != NULL) q = r -> next;
p -> next = q;
if (q != NULL) q -> prev = p;
i = p -> col;
for (r = p -> next;r != NULL;r = r -> next) r -> col = ++i;
i = checkc(k);
if (i == 0) i = 1;
while (x1 > i)
{
x1--;
x--;
if (x <= lm)
{
x = 78 - rm;
y--;
if(y <= tm)
{
y = tm + 1;
z--;
}
}
}
}
void list :: back()
{
save = 0;
node *p;
if (x1 == 1)
{
if (k != 1)
{
x = checkc(k - 1);
x1 = x;
while (x > (78 - rm - lm)) x -= (78 - lm - rm);
x = x + lm;
ad_delc(k - 1,y,checkc(k - 1));
k--;
y--;
if (y == tm)
{
z--;
y = tm + 1;
}
}
else beep();
}
else
{
p = find(k,x1 - 1);
if (p -> data == '\v')
{
b_tab(p);
for (int i = 0;i < 5;i++)
{
x --;
if (x <= lm)
{
x = 78 - rm - lm + x;
y--;
if (y == tm)
{
y++;
z--;
}
}
x1 --;
}
}
else
{
delc(k,x1 - 1);
x1--;
if (x != lm + 1) x--;
else
{
x = 78 - rm;
y--;
if (y == tm)
{
y++;
z--;
}
}
}
}
}
void list :: d_word()
{
node *p;
if (head -> next == NULL) beep();
else
{
save = 0;
p = find(k,x1);
if (x1 == checkc(k) && p -> data == '\n') ad_delc(k,y,x1);
else
{
save = 0;
delw();
}
}
}
void list :: d_char()
{
save = 0;
node *p;
if (x1 >= checkc(k))
{
if (k != end -> row && x1 == checkc(k))
ad_delc(k,y,x1);
else beep();
}
else
{
p = find(k,x1);
if (p -> data == '\t') d_tab(p);
else
delc(k,x1);
}
}
void list :: ins_word(WINDOW *main)
{
save = 0;
curs_set(1);
ins = 1;
char ch[100],c;
WINDOW *ws;
ws = subwin(main,3,80,22,0);
werase(ws);
init_pair(5,COLOR_BLACK,COLOR_WHITE);
wbkgd(ws,COLOR_PAIR(5));
wrefresh(ws);
waddstr(ws,"Enter the word to be inserted : ");
mvwprintw(ws,1,1,"-");
echo();
mvwgetstr(ws,1,2,ch);
noecho();
for (int i = 0;i < strlen(ch);i++)
{
alpha(ch[i]);
x++;
if (x > 78 - rm)
{
y++;
if (y == 22 - bm)
{
z++;
y = 21 - bm;
}
x = lm + 1;
}
}
}
void list :: ins_line(WINDOW *main)
{
save = 0;
curs_set(1);
ins = 1;
char ch[100],c;
WINDOW *ws;
ws = subwin(main,3,80,22,0);
werase(ws);
init_pair(5,COLOR_BLACK,COLOR_WHITE);
wbkgd(ws,COLOR_PAIR(5));
wrefresh(ws);
waddstr(ws,"Enter the line to be inserted : ");
mvwprintw(ws,1,1,"-");
echo();
mvwgetstr(ws,1,2,ch);
noecho();
for (int i = 0;i < strlen(ch);i++)
{
alpha(ch[i]);
x++;
if (x > 78 - rm)
{
y++;
if (y == 22 - bm)
{
z++;
y = 21 - bm;
}
x = lm + 1;
}
}
}
void list :: line_in(WINDOW *main)
{
}
void list :: word_in(WINDOW *main)
{
}
void list :: inwin(WINDOW *main)
{
WINDOW *win,*sub;
FILE *fp;
node *p,*q,*r;
int c,i,a,b,flag = 0;
y = tm + 1,x = lm + 1,z = 0,k = 1,x1 = 1;
char cl[] = "clear";
init();
curs_set(1);
win = mainc(main);
werase(win);
box(win,0,0);
sub = subwin(main,1,80,24,0);
ref_sub(sub);
fp = fopen(name,"r+");
if (fp == NULL) fp = fopen(name,"w+");
while((c = getc(fp)) != EOF)
{
save = 1;
wmove(win,k,x1);
if (k == 21)
{
disp(win);
box(win,0,0);
}
switch(c)
{
case '\t':
alpha(c);
for (i = 0;i < tab - 1;i++)
alpha('\v');
break;
case (KEY_ENTER) :
case 10:
enter();
k++;
break;
default :
alpha(c);
}
}
disp(win);
box(win,0,0);
wrefresh(win);
fclose(fp);
save = 1;
keypad(win,TRUE);
wrefresh(win);
x1 = k = 1;
x = lm + 1;
y = tm + 1;
while(1)
{
box(win,0,0);
wmove(win,y,x);
wrefresh(win);
c = wgetch(win);
switch(c)
{
case 27 :
c = wgetch(win);
switch(c)
{
case 'f' :
i = open_file(main,1);
while(1)
{
main = init_main(main);
win = mainc(main);
disp(win);
ref_sub(sub);
box(win,0,0);
wrefresh(win);
if(i == 0) break;
else if(i == 1) i = open_file(main,1);
else if(i == 2) i = open_edit(main);
else if(i == 3) i = open_page(main);
else if(i == 4) i = help_menu(main,1);
}
break;
case 'e' :
i = open_edit(main);
while(1)
{
main = init_main(main);
win = mainc(main);
disp(win);
ref_sub(sub);
box(win,0,0);
wrefresh(win);
main = init_main(main);
if(i == 0) break;
else if(i == 1) i = open_file(main,1);
else if(i == 2) i = open_edit(main);
else if(i == 3) i = open_page(main);
else if(i == 4) i = help_menu(main,1);
}
break;
case 'p' :
i = open_page(main);
while(1)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -