case 'n': // 继续向后搜索 if( search(queryinfo) ) // 没找到 beep(); break; case 'x': // 删除cmdtimes个字符 if( len ) { // 该编辑行有内容 if( cmdtimes > len - edit.shinex + 1 )//最多删除至行尾 cmdtimes = len - edit.shinex + 1;
for( i = 0; i < len - edit.shinex + 1 - cmdtimes; i++ ) //数据前移cmdtimes个字符
edit.info[nr][edit.shinex+i-1]=
edit.info[nr][edit.shinex+i+cmdtimes-1];
memset( edit.info[nr] + len - cmdtimes, 0, cmdtimes );// 将行尾置0 display( edit.shiney, edit.info[nr] ); // 显示一行数据 } else // 无字符可删
beep();
break; case 'd':
// dd行删除
in_ch = getch(); if( in_ch == 'd' && edit.allrec > 0 ) { // 有记录行可删
if( cmdtimes >= edit.allrec - edit.shiney - edit.scry + 1 //删除至行尾 cmdtimes = edit.allrec - edit.shiney - edit.scry + 1; for( i = edit.scry + edit.shiney - 1; i < edit.allrec - cmdtimes; i++ )
memcpy(edit.info[i],edit.info[i+cmdtimes], AXCOL+1 ); //移动cmdtimes行
memset( edit.info[i], 0, (MAXCOL+1) * cmdtimes );
// 文件尾清0 if( edit.shiney > 1 ) edit.shiney--; // 光标上移一行 if( edit.scry > 0 )
edit.scry--;
edit.allrec -= cmdtimes; refresh_scr(); // 刷新屏幕 }
else // 无记录行可删
beep(); break; case '0': // 光标移至行首
edit.shinex = 1;
84
break; case '$': // 光标移至行尾 edit.shinex = 1; break; case LEFT: case 'h': // 光标左移cmdtimes格 edit.shinex -= cmdtimes;
if( edit.shinex < 1 ) // 最多移到行首
edit.shinex = 1;
break; case RIGHT: case 'l': // 光标右移cmdtimes格 edit.shinex += cmdtimes;
if( edit.shinex > len ) // 最多移到行尾
edit.shinex = len; break; case DOWN: case 'j': // 光标下移cmdtimes行 rolllines = MAX( 0, edit.shiney + cmdtimes - 24 );
if( rolllines > edit.allrec - 24 - edit.scry ) // 最多下滚到文件尾 rolllines = MAX( 0, edit.allrec - 24 - edit.scry ); if( rolllines ) { // 屏幕下滚rolllines行 edit.scry += rolllines;
refresh_scr();
} edit.shiney = MIN( edit.shiney + cmdtimes, 24 ); break; case UP: case 'k': // 光标上移cmdtimes行 rolllines = MAX( 0, cmdtimes - edit.shiney + 1 ); if( rolllines > edit.scry ) // 最多上滚到文件头 rolllines = edit.scry;
if( rolllines ) { // 屏幕上滚rolllines行 edit.scry -= rolllines;
refresh_scr(); // 刷新屏幕
}
edit.shiney = MAX( edit.shiney - cmdtimes, 1 ); break; case PGDN: case CTRL_F: // 下翻cmdtimes页
85
rolllines = MIN( 24 * cmdtimes, edit.allrec - 24 - edit.scry ); if( rolllines > 0 ) { // 屏幕有滚动 edit.scry += rolllines;
edit.shiney = 1;// 光标移动到行首 refresh_scr(); // 刷新屏幕
}
break; case PGUP: case CTRL_B: // 上翻cmdtimes页
rolllines = MIN( 24 * cmdtimes, edit.scry ); if( rolllines > 0 ) { // 屏幕有滚动 edit.scry -= rolllines; edit.shiney = 1;
refresh_scr(); // 刷新屏幕
} break;
default: // 其他情况不处理
beep();
break;
}
} } }
void beep() // 响铃 { sound( 800 ); // 开扬声器 delay( 100 ); // 延时100毫秒
nosound();
// 关扬声器
}
int write_file( char *filename ) // 将编辑内容写入文件
{ int i;
FILE *fp;
if( ( fp = fopen(filename,\w\ printf( \, filename ); return -1;
}
for( i = 0; i < edit.allrec; i++ )
86
fprintf( fp, \] ); fclose( fp ); return 0; }
void refresh_scr() // 刷新屏幕 { int i;
for( i = 0; i < 24; i++ ) { gotoxy( 1, i + 1 ); // 光标移动到行首
clreol(); // 清一行
if( edit.scry + i < edit.allrec ) printf( \ }
gotoxy( edit.shinex, edit.shiney ); // 移动光标到编辑位置 }
int input_str( int x, int y, char *str, int len ) // 定点输入一定长字符串 { int i; int in_ch; memset( str, 0, len ); for( i = 0; i < len - 1 && (in_ch=getch()) != CR; ) { // 换行表示输入结束 gotoxy( x, y ); if( in_ch == BackSpace ) { // 退格键,表示删除一个字符 if( i == 0 ) // 删除所有输入,表示放弃此次输入 return -1; str[i] = '\\0'; i--; x--; } else { // 其他情况表示输入一个字符 str[i] = (char)in_ch; printf( str + i ); // 显示输入字符 fflush( stdout ); // 刷新标准输出设备(即屏幕输出) i++;
x++;
}
}
return 0; }
87