curses编程初步--超简单的文本编辑器

程序实现了一个超简单的文本编辑器,没做保存,以后扩充,主要体验一下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);

  }

}



 
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值