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

📄 zped.c

📁 这是我写的一个仿照linux下编辑器vim写的一个简单的全屏文本编辑器
💻 C
📖 第 1 页 / 共 2 页
字号:
			current_y = search_y;
			cursor_y = Scursor_y;
			editTop = searchTop;
			midwinBarUpdate(pathName);
		    	edit_refresh();
		} else {
			wclear(botwin);
			wprintw(botwin,"%s",searchNotFind);
			wrefresh(botwin);
			wrefresh(edit);
		}
	    /*To search a string backwards*/
	} else if(temp[0] == '?') {
		searchInit();
		strcpy(searchTarget,&temp[1]);
		searchCount = charNum-1;
		if(search_up()) {
			current_R = searchRow;
			current_x = search_x;
			current_y = search_y;
			cursor_y = Scursor_y;
			editTop = searchTop;
			midwinBarUpdate(pathName);
			edit_refresh();
		} else {
			wclear(botwin);
			wprintw(botwin,"%s",searchNotFind);
			wrefresh(botwin);
			wrefresh(edit);
		}
	} else if(temp[0] == 'g') {
		sscanf(temp,"g %ld",&gotoline);
		do_go_to_line(gotoline-1);
		edit_refresh();
		midwinBarUpdate(pathName);
	}
	return 1;
}





/*The main function*/
int main(char argc,char *argv[])
{
    int  kbinput = 0;
    char pathName[MAXLENGTH];
    char worryKey[] = "no command match";
    char insertMode[] = "-- INSERT --";
    char visualMode[] = "-- VISUAL --";
    char replaceMode[] = "-- REPLACE --";
    char openFile[MAXLENGTH] = "can not open flie ";
    char writeNeeded[] = " No write since last change.";
    char searchNotFind[] = "The word was not found.";
    int modeState = 1;
    struct termios term;
    pathName[0] = 0;
    /* First back up the old settings so they can be restored, duh */
    tcgetattr(0, &oldterm);
    term = oldterm;
    term.c_cc[VINTR] = _POSIX_VDISABLE;
    term.c_cc[VQUIT] = _POSIX_VDISABLE;
    term.c_lflag &= ~IEXTEN;
    tcsetattr(0, TCSANOW, &term);
    /* now ncurses init stuff*/
    initscr();
    savetty();
    nonl();
    cbreak();
    noecho();
    raw();


    /* Set up some global variables */
    global_ini();
    window_ini();


   /*deal with the preopen*/
  	 if(argc > 1) {
   		strcpy(pathName,argv[1]);
		if(!readOneFile(pathName)) {
			strcat(openFile,pathName);
			wclear(botwin);
			mvwprintw(botwin,0,0,"%s",openFile);
			wrefresh(botwin);
			wrefresh(edit);
		}
		edit_refresh();
	}
	midwinBarUpdate(pathName);
    /*Begin the main loop*/
    while(1) {
	kbinput = wgetch(edit);
	if( modeState == 1) {
	    switch(kbinput) {
		case 'Z':
		    kbinput = wgetch(edit);
		    if(kbinput == 'Z') {
		    	if(change) {
				wclear(botwin);
				wprintw(botwin,"%s",writeNeeded);
				wrefresh(botwin);
				wrefresh(edit);
			} else {
				destroyStruct();
				finish();
			}
		    }
		    break;
		case 'i':
		    modeState = 2;
		    wclear(botwin);
		    mvwprintw(botwin,0,0,"%s",insertMode);
		    wrefresh(botwin);
		    wrefresh(edit);
		    break;
		case FKEY_ESC:
		    wclear(botwin);
		    wrefresh(botwin);
		    wrefresh(edit);
		    break;
		case 'h':
		    do_left();
		    midwinBarUpdate(pathName);
		    update_line(cursor_y,current_R);
		    wrefresh(edit);
		    break;
		case KEY_LEFT:
		    do_left();
		    midwinBarUpdate(pathName);
		    update_line(cursor_y,current_R);
		    wrefresh(edit);
		    break;
		case 'j':
		    do_down();
		    midwinBarUpdate(pathName);
		    edit_refresh();
		    break;
		case KEY_DOWN:
		    do_down();
		    midwinBarUpdate(pathName);
		    edit_refresh();
		    break;
		case 'k':
		    do_up();
		    midwinBarUpdate(pathName);
		    edit_refresh();
		    break;
		case KEY_UP:
		    do_up();
		    midwinBarUpdate(pathName);
		    edit_refresh();
		    break;
		case 'l':
		    do_right();
		    midwinBarUpdate(pathName);
		    update_line(cursor_y,current_R);
		    wrefresh(edit);
		    break;
		case 'N':
		    if(search_pre()) {
			current_R = searchRow;
			current_x = search_x;
			current_y = search_y;
			cursor_y = Scursor_y;
			editTop = searchTop;
			midwinBarUpdate(pathName);
			edit_refresh();
		   } else {
			wclear(botwin);
			wprintw(botwin,"%s",searchNotFind);
			wrefresh(botwin);
		   }
		   break;
		case 'n':
		    if(search_next()) {
			current_R = searchRow;
			current_x = search_x - searchCount;
			current_y = search_y;
			cursor_y = Scursor_y;
			editTop = searchTop;
			midwinBarUpdate(pathName);
			edit_refresh();
		   } else {
			wclear(botwin);
			wprintw(botwin,"%s",searchNotFind);
			wrefresh(botwin);
		   }
		   break;
		case KEY_RIGHT:
		    do_right();
		    midwinBarUpdate(pathName);
		    update_line(cursor_y,current_R);
		    wrefresh(edit);
		    break;
		case KEY_HOME:
		    do_home();
		    update_line(cursor_y,current_R);
		    wrefresh(edit);
		    break;
		case KEY_END:
		    do_end();
		    update_line(cursor_y,current_R);
		    wrefresh(edit);
		    break;
		case KEY_NPAGE:
		    do_pagedown();
		    midwinBarUpdate(pathName);
		    edit_refresh();
		    break;
		case KEY_PPAGE:
		    do_pageup();
		    midwinBarUpdate(pathName);
		    edit_refresh();
		    break;
		case 'x':
		    change = 1;
		    midwinBarUpdate(pathName);
		    dele_char();
		    edit_refresh();
		    break;
		case KEY_IC:
		    modeState = 4;
		    wclear(botwin);
		    wprintw(botwin,"%s",replaceMode);
		    wrefresh(botwin);
		    wrefresh(edit);
		    break;
		case 'v':
		    modeState = 3;
		    selectInit();
		    wclear(botwin);
		    wprintw(botwin,"%s",visualMode);
		    wrefresh(botwin);
		    wrefresh(edit);
		    break;
		case 'p':
		    pasteSelect();
		    change = 1;
		    midwinBarUpdate(pathName);
		    edit_refresh();
		    break;
		case ':':
		case '/':
		case '?':
		case 'g':
		    handleCom(kbinput,pathName);
		    break;
		default:
		    wclear(botwin);
		    mvwprintw(botwin,0,0,"%s",worryKey);
		    wrefresh(botwin);
		    wrefresh(edit);
		    break;
	    }
	}
	else if(modeState == 2){
	    switch(kbinput) {
		case FKEY_ESC:
		    modeState = 1;
		    wclear(botwin);
		    wrefresh(botwin);
		    wrefresh(edit);
		    break;
		case '\t':
		    do_char(' ');
		    do_char(' ');
		    do_char(' ');
		    do_char(' ');
		    change = 1;
		    midwinBarUpdate(pathName);
		    break;
		case KEY_LEFT:
		    do_left();
		    midwinBarUpdate(pathName);
		    update_line(cursor_y,current_R);
		    wrefresh(edit);
		    break;
		case KEY_RIGHT:
		    do_right();
		    midwinBarUpdate(pathName);
		    update_line(cursor_y,current_R);
		    wrefresh(edit);
		    break;wrefresh(edit);
		case KEY_UP:
		    do_up();
		    midwinBarUpdate(pathName);
		    edit_refresh();
		    break;
		case KEY_DOWN:
		    do_down();
		    midwinBarUpdate(pathName);
		    edit_refresh();
		    break;
		case KEY_BACKSPACE:
		    change = 1;
		    midwinBarUpdate(pathName);
		    dele_char();
		    edit_refresh();
		    break;	    
		case KEY_HOME:
		    do_home();
		    update_line(cursor_y,current_R);
		    wrefresh(edit);
		    break;
		case KEY_END:
		    do_end();
		    update_line(cursor_y,current_R);
		    wrefresh(edit);
		    break;
		case KEY_NPAGE:
		    do_pagedown();
		    midwinBarUpdate(pathName);
		    edit_refresh();
		    break;
		case KEY_PPAGE:
		    do_pageup();
		    midwinBarUpdate(pathName);
		    edit_refresh();
		    break;

		default:
		    if(allow_input(kbinput)) {
			    do_char(kbinput);
			    change = 1;
			    midwinBarUpdate(pathName);
			    edit_refresh();
		    }
		    break;
	    }
	}
	else if(modeState == 3) {

	    switch(kbinput) {
	    	case FKEY_ESC:
		    modeState = 1;
		    edit_refresh();
		    break;
	        case 'h':
		case KEY_LEFT:
		    select_left();
		    edit_refresh();
		    selectUpdate();	
		    wrefresh(edit);
		    break;
		case 'l':
		case KEY_RIGHT:
		    select_right();
		    edit_refresh();
		    selectUpdate();
		    wrefresh(edit);
		    break;
		case 'j':
		case KEY_DOWN:
		    select_down();
		    edit_refresh();
		    selectUpdate();
		    wrefresh(edit);
		    break;
		case 'k':
		case KEY_UP:
		    select_up();
		    edit_refresh();
		    selectUpdate();
		    wrefresh(edit);
		    break;
		case 'x':
		    cutSelect();
		    edit_refresh();
		    change = 1;
		    midwinBarUpdate(pathName);
		    modeState = 1;
		    break;
		case 'd':
		    deleSelect();
		    edit_refresh();
		    change = 1;
		    midwinBarUpdate(pathName);
		    modeState = 1;
		    break;
		case 'y':
		    copySelect();
		    modeState = 1;
		    break;
		case 'v':
		    modeState = 1;
		    wclear(botwin);
		    wrefresh(botwin);
		    edit_refresh();
		    break;
		default:
		    break;
	    }
	} else if (modeState == 4) {
	    switch(kbinput) {
		case FKEY_ESC:
		    modeState = 1;
		    wclear(botwin);
		    wrefresh(botwin);
		    wrefresh(edit);
		    break;
		case '\t':
		    insert_add_one(' ');
		    insert_add_one(' ');
		    insert_add_one(' ');
		    insert_add_one(' ');
		    change = 1;
		    midwinBarUpdate(pathName);
		    break;
		case KEY_LEFT:
		    do_left();
		    midwinBarUpdate(pathName);
		    update_line(cursor_y,current_R);
		    wrefresh(edit);
		    break;
		case KEY_RIGHT:
		    do_right();
		    midwinBarUpdate(pathName);
		    update_line(cursor_y,current_R);
		    wrefresh(edit);
		    break;wrefresh(edit);
		case KEY_UP:
		    do_up();
		    midwinBarUpdate(pathName);
		    edit_refresh();
		    break;
		case KEY_DOWN:
		    do_down();
		    midwinBarUpdate(pathName);
		    edit_refresh();
		    break;
		case KEY_BACKSPACE:
		    change = 1;
		    midwinBarUpdate(pathName);
		    insert_dele_one();
		    edit_refresh();
		    break;	    
		case KEY_HOME:
		    do_home();
		    update_line(cursor_y,current_R);
		    wrefresh(edit);
		    break;
		case KEY_END:
		    do_end();
		    update_line(cursor_y,current_R);
		    wrefresh(edit);
		    break;
		case KEY_NPAGE:
		    do_pagedown();
		    midwinBarUpdate(pathName);
		    edit_refresh();
		    break;
		case KEY_PPAGE:
		    do_pageup();
		    midwinBarUpdate(pathName);
		    edit_refresh();
		    break;

		default:
		    if(allow_input(kbinput)) {
			    insert_add_one(kbinput);
			    change = 1;
			    midwinBarUpdate(pathName);
			    edit_refresh();
		    }
		    break;
	    }
	}	
    }
    finish();
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -