#include #include #define CTRL(c) ('c'&037) main(argc,argv) char **argv; { int i,n,l,new=0; int c; FILE *fd; if (argc !=2) { fprintf(stderr,"Usage: sedit file\n"); exit(1); } fd=fopen(argv[1],"r"); if (fd == NULL) { fd=fopen(argv[1],"w"); fclose(fd); if ((fd=fopen(argv[1],"r")) == NULL) perror(argv[1]); new=1; } initscr(); cbreak(); nonl(); noecho(); idlok(stdscr,TRUE); keypad(stdscr,TRUE); /*Read file*/ while ((c = getc(fd)) !=EOF) addch(c); fclose(fd); move(0,0); refresh(); edit(); /*Write out the file */ fd=fopen(argv[1],"w"); for(l=0;l< LINES;l++) { n=len(l); for(i=0;i= 0 && mvinch(lineno,linelen) == ' ') linelen--; return linelen+1; } /*Global value of current cursor position */ int row,col; edit() { int c; for(;;) { move(row,col); refresh(); c=getch(); switch(c) { /*Commands*/ /*hjkl&arrow: move cursor */ case 'h': case KEY_LEFT: if (col > 0) col--; break; case 'j': case KEY_DOWN: if (row < LINES-1) row++; break; case 'k': case KEY_UP: if (row > 0) row--; break; case 'l': case KEY_RIGHT: if (col < COLS-1) col++; break; case KEY_IC: case 'i': input(); break; case KEY_DC: case 'x': delch(); break; case KEY_IL: case 'o': move(++row,col=0); insertln(); input(); break; case KEY_DL: case 'd': deleteln(); break; case KEY_CLEAR: case CTRL(L): clearok(curscr); refresh(); break; case 'w': return; case 'q': endwin(); printf("\n"); exit(1); default: flash(); break; } } } /*Insert: End with ^D or EIC */ input() { int c; standout(); mvaddstr(LINES-1, COLS-20, "INPUT MODE"); standend(); move(row,col); refresh(); for(;;) { c = getch(); if (c == CTRL(D) || c == 27) break; insch(c); move(row,++col); refresh(); } move(LINES-1, COLS-20); clrtoeol(); move(row,col); refresh(); }