⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 edit.cc

📁 linux/unix下的txt浏览器
💻 CC
📖 第 1 页 / 共 3 页
字号:
#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 + -