程序实现了一个超简单的文本编辑器,没做保存,以后扩充,主要体验一下curses编程。
自设环境变量EDITLNS、EDITCLS表示编辑器的尺寸,可以在运行前设置。
此程序只有基本的输入显示功能。
参考资料:http://unix-cd.com/unixcd12/article_6194.html
#include <curses.h> /* 引进 curses.h , 并自动引进 stdio.h */
#include <stdlib.h>
#define StartX 1 /* 决定游标初始位置 */
#define StartY 1
void initial();
void SetSize();
void limitXY(int *x,int *y);
main()
{
int x=StartX; /* 定义 x,y 并设定其初值 */
int y=StartY;
int ch; /* 定义 ch 为整数,配合 getch() 使用 */
int old_x,old_y;
char testBuf[50];
int n_testBufUsed=0;
memset(testBuf,'/0',n_testBufUsed);
initial(); /* 调用 initial(), 启动 curses 模式, */
/* 并完成其它设定 */
box(stdscr,'|','-'); /* 画方框 */
attron(A_REVERSE); /* 开启反白模式 */
mvaddstr(0,20,"Curses Program"); /* 在 (20,0) 处输出反白字元 */
attroff(A_REVERSE); /* 关闭反白模式 */
move(x,y); /* 将游标移至初始位置 */
do { /* 以无限回圈不断等待输入 */
old_x = x;
old_y = y;
ch=getch(); /* 等待自键盘输入字元 */
switch(ch) { /* 判断输入字元为何 */
case KEY_UP: --y; /* 判断是否"↑"键被按下 */
break;
case KEY_DOWN: ++y; /* 判断是否"↓"键被按下 */
break;
case KEY_RIGHT: ++x; /* 判断是否"→"键被按下 */
break;
case KEY_LEFT: --x; /* 判断是否"←"键被按下 */
break;
case '/r': /* 判断是否 ENTER 键被按下 */
++y;
x=0;
break;
case '/t': /* 判断是否 TAB 键被按下 */
x+=7;
break;
case 127: /* 判断是否 BACKSPACE 键被按下 */
mvaddch(y,--x,' ');/* delete 一个字元 */
break;
case 27: endwin(); /* 判断是否[ESC]键被按下 */
exit(1); /* 结束 curses 模式 */
/* 结束此程式 */
default:
addch(ch); /* 如果不是特殊字元, 将此字元印 出 */
x++;
break;
}
limitXY(&x,&y);
mvprintw(0,40,testBuf);
//move(y,x); /* 移动游标至现在位置 */
sprintf(testBuf,"coordinates:(%d,%d)",x,y);
n_testBufUsed = strlen(testBuf);
attron(A_REVERSE);
mvprintw(0,40,testBuf);
attroff(A_REVERSE);
memset(testBuf,' ',n_testBufUsed);
testBuf[n_testBufUsed]='/0';
move(y,x);
} while (1);
}
void initial() /* 自定开启 curses 函式 */
{
initscr();
cbreak();
nonl();
noecho();
intrflush(stdscr,FALSE);
keypad(stdscr,TRUE);
refresh();
}
void limitXY(int *x,int *y)
{
int tx,ty;
int b_wd; /* border width */
b_wd = 1;
tx=StartX;
ty=StartY;
if(*x<tx)
{
*x=tx;
}
if(*y<ty)
{
*y=ty;
}
SetSize(&tx,&ty);
tx-=1;
ty-=1;
if(*x>tx-b_wd)
{
*x=tx-b_wd;
}
if(*y>ty-b_wd)
{
*y=ty-b_wd;
}
}
#define EDITCLS "EDITCLS"
#define EDITLNS "EDITLNS"
void SetSize(int *pWd,int *pHt)
{
char *pLines,*pCOLs;
char tBuf[20];
if(!pWd || !pHt)
{
return;
}
pCOLs = getenv(EDITCLS);
pLines = getenv(EDITLNS);
if(pLines)
{
sscanf(pLines,"%d",pHt);
}
else
{
*pHt = LINES;
sprintf(tBuf,"%d",*pHt);
setenv(EDITLNS,tBuf,1);
beep();
}
if(pCOLs)
{
sscanf(pCOLs,"%d",pWd);
}
else
{
*pWd = COLS;
sprintf(tBuf,"%d",*pWd);
setenv(EDITCLS,tBuf,1);
}
}