curses编程初步--超简单的文本编辑器
来源:互联网 发布:装修客户资源软件 编辑:程序博客网 时间:2024/06/10 09:47
程序实现了一个超简单的文本编辑器,没做保存,以后扩充,主要体验一下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); }}
- curses编程初步--超简单的文本编辑器
- 超简单文本编辑器:nano
- 简单的文本编辑器 - wxWindows编程事例
- Linux超简单文本编辑器:nano
- curses编程初步--汉诺塔游戏
- 简单的文本编辑器
- 简单的文本编辑器
- QT编程实例1--简单的文本编辑器(上)
- QT编程实例1--简单的文本编辑器(中)
- QT编程实例1--简单的文本编辑器(下)
- curses库的编程
- 简单的文本编辑器做法
- 一个简单的文本编辑器
- js简单的文本编辑器
- 一个简单的文本编辑器
- 一个简单的文本编辑器
- 超漂亮的Bootstrap 富文本编辑器summernote
- 超漂亮的Bootstrap 富文本编辑器summernote
- GCC 命令详解
- 有一种力量叫复原力
- 任务很重
- [转常用javascript表单验证
- java数字时钟
- curses编程初步--超简单的文本编辑器
- Z39.50
- 多线程在Visual C#网络编程中的应用
- 非常沉默非常骄傲 从不依靠从不寻找
- 开门篇
- 对软件开发的思考
- 表空间创建相关
- 蔡学墉
- [C#]一步一步开发自己的自动代码生成工具之一:获取SQL2005的数据库表结构