📄 全屏幕编辑软件的编写.txt
字号:
disp(ss_x,x); /* 显示当前行 */
}
break; /* 跳出开关语句 */
}
}
int delc() /* 删字,如在行首,将本行接在上行尾 */
{
int i,g,k=0;
for(;;) { /* 为全角字符设的循环 */
if(y>0) { /* 如不在本屏行首 */
if(xx==ksx && yy<=ksy) ksy--; /* 如在块首行,并在块首前,计算块首列号 */
if(xx==kwx && yy<=kwy) kwy--; /* 如在块尾行,并在块尾前,计算块尾列号 */
dks(); /* 如块首、块尾重合, 块标志置 1 */
strcpy(ss[ss_x]+yy-1,ss[ss_x]+yy);
/* 光标处起字符串前移一格,覆盖光标前一字符 */
y--; yy--; /* 前移一字节 */
ser--; /* 字序号减 1 */
if(vs(yy-1)==0) { /* 如不在全角前半字 */
if(!k) return 0; /* 如在屏幕最左列,返回 0 */
else return 1; /* 否则返回 1 */
}
}
else { /* 如在屏幕最左列 */
if(m) { /* 如不为 0 屏 */
m--; /* 退到前一屏 */
y=yy-m*BP; /* 光标到屏中,并前移一字 */
k=1; /* 标志置 1 */
}
else { /* 如为 0 屏 */
if(ss_x+(i=H3-x)>=ss_max && xx+i<ttl_x)
tj(); /* 如屏幕最下行超出数组,但未到文末,从fp2或fp读入Q3行 */
if(xx) { /* 如不在文首行 */
g=strlen(ss[ss_x]); /* 测行长 */
ss_x--; /* 至上一行 */
yy=string_lingth(); /* 定光标于上行尾处 */
if(g+yy>HC-4) { /* 如两行相接后超长 */
write_prompt(3); /* 提示超长 */
yy=0; /* 恢复原行列号 */
ss_x++; /* 回原行 */
return -1; /* 退出,返回 -1 */
}
if(xx<=ksx) { /* 如在块首行或之前 */
if(xx==ksx) ksy+=yy; /* 如在块首行 */
ksx--; /* 块首行行号减 1 */
}
if(xx<=kwx) { /* 如在块尾行或之前 */
if(xx==kwx) kwy+=yy; /* 如在块尾行 */
kwx--; /* 块尾行行号减 1 */
}
dks(); /* 如块首、块尾重合, 块标志置 1 */
xx--; /* 文本当前行改为上行 */
strcpy(ss[ss_x]+yy,ss[ss_x+1]); /* 将下行拷至本行尾回车符前 */
ser-=2; /* 字序数减少回车符的两位 */
movbk(ss_x+1,1); /* 数组后续各行前移,覆盖原行 */
ttl_x--; /* 文末行行号减 1 */
fp_rd--; /* fp 已读出行最大行号减 1 */
ss_max--; /* 数组实用最大行号减 1 */
return 2; /* 返回 2 */
}
else return 0; /* 如在文首行,返回 0 */
}
}
}
}
int vs(int a) /* 计算行首至 a 列全角字节数,返回奇偶值 */
{
int i,j;
j=0; /* 全角字节数,初值为 0 */
for(i=0;i<=a;i++)
if(ss[ss_x][i]>0xA0) j++; /* 统计全角字节数 */
return(j%2); /* 返回奇偶值 */
}
orien() /* 重定光标列号 */
{
int g;
g=string_lingth(); /* 测当前列长(不包括回车换行符) */
if(yy>g) yy=g; /* 如光标在字符串尾后,定光标于串尾 */
if(vs(yy-1)) yy--; /* 如光标在后半汉字,前移一字节 */
y=yy-m*BP; /* 计算屏幕 y 坐标 */
if(y<0) comput(); /* 如 y 为负数,重算各参数 */
}
Ctrl_N() /* 插入一空行 */
{
chg=1; /* 文件已修改标志置为真 */
fp_rd++; /* fp 已读出最大行号加 1 */
ttl_x++; /* 文末行行号加 1 */
if(xx<=ksx) { /* 如插入行在块首行或之前 */
ksx++; kwx++; /* 块首、块尾行号加 1 */
}
else { /* 如插入行在块首行后 */
if(xx>ksx && xx<=kwx) kwx++; /* 如插入行在字块中,块尾行号加 1 */
}
ser-=yy; /* 计算字序数 */
if(ss_max>=QB-1) { /* 如超出缓冲区数组可容行数 */
ss_x>Q1 ? wfp1() : wfp2(); /* 数组行数在 Q1 后时,上部 Q3 行存入 fp1,
行数小于 Q1 时,下部 Q3 行存入 fp2 */
}
ss_max++; /* 编辑数组实用最大行号加 1 */
mov(ss_x,1); /* 当前行起各行后移 */
strcpy(ss[ss_x],da); /* 插入行加硬回车换行符 */
if(m) { /* 如不在 0 屏,显示 0 屏 */
m=0;
disp_t();
}
else roll_scr_down(x,H3); /* 如在 0 屏,当前行以下各行下滚 */
yy=0; /* 光标至行首 */
}
Ctrl_E(int a) /* 删至行首,a=1 显示,a=0 不显示 */
{
int g;
chg=1; /* 文件已修改标志置为真 */
g=m; /* 保存原屏号 */
if(xx==ksx) { /* 如在块首行 */
if(yy<=ksy) ksy-=yy; /* 如在块首前, 计算块首列号 */
else ksy=0; /* 如在块首后,块首列号置 0 */
}
if(xx==kwx) { /* 如在块尾行 */
if(yy<=kwy) kwy-=yy; /* 如在块尾前,计算块尾列号 */
else kwy=0; /* 如在块尾后,块尾列号置 0 */
}
dks(); /* 如块首、块尾重合, 块标志置 1 */
strcpy(ss[ss_x],ss[ss_x]+yy); /* 光标后字符前移至行首起 */
ser-=yy; /* 计算字序数 */
m=0; /* 至 0 屏 */
yy=0; /* 至行首 */
if(a) { /* 如为按 Ctrl+E 键时,重显屏幕 */
if(!g) disp(ss_x,x); /* 如原在 0 屏,重显当前行 */
else disp_t(); /* 否则显示 0 屏 */
}
}
Ctrl_Y(int a) /* 删行,a=1 显示,a=0 不显示 */
{
int g,i;
chg=1; /* 文件已修改标志置为真 */
g=m; /* 保存原屏号 */
if((ss_x+(i=H3-x))>=ss_max && xx+i<ttl_x) tj();
/* 如屏幕最下行超出数组,但在总行数内,从fp2或fp读入Q3行 */
if(xx<ksx) ksx--; /* 如被删行在块首行前,块首行号减 1 */
else if(xx==ksx) ksy=0; /* 如被删行为块首行,块首列号置 0 */
if(xx<kwx) kwx--; /* 如被删行在块尾行前,块尾行号减 1 */
else if(xx==kwx) kwy=0; /* 如被删行为块尾行,块尾列号置 0 */
dks(); /* 如块首、块尾重合,块标志 blck 置 1 */
ser-=yy; /* 计算字序数 */
if(xx<ttl_x) { /* 当删除最后一行时 */
fp_rd--; /* fp 已读出最大行行号减 1 */
ttl_x--; /* 文末行行号减 1 */
ss_max--; /* 编辑数组实用最大行号减 1 */
}
movbk(ss_x,1); /* ss_x 后各行前移一行 */
m=0; /* 至 0 屏 */
yy=0; /* 至行首 */
if(a) { /* 如参数 a 为真 */
if(!g) { /* 如原在 0 屏 */
roll_scr_up(x,H3); /* 自当前行起滚屏 */
if(xx+i<=ttl_x) disp(ss_x+i,H3); /* 如最下行还有,显示此行 */
}
else disp_t(); /* 如原不在 0 屏,则显示 0 屏 */
}
}
Ctrl_T(int a) /* 删至行尾,a=1 显示,a=0 不显示 */
{
int g;
chg=1; /* 置文件已修改标志为真 */
g=string_lingth(); /* 测行长 */
if(xx==ksx && yy<=ksy) ksy=yy; /* 如在块首行,并在块首列前,计算块首列号 */
if(xx==kwx && yy<=kwy) kwy=yy; /* 如在块尾行,并在块尾列前,计算块尾列号 */
dks(); /* 如块首、块尾重合, 块标志置 1 */
strcpy(ss[ss_x]+yy,ss[ss_x]+g); /* 原行尾回车换行符前移至当前光标处 */
if(a) disp(ss_x,x); /* 在按 Ctrl+T 时,重显本行 */
}
Ctrl_F(int a) /* 光标移至块首,a=1 显示,a=0 不显示 */
{
if(blck) { /* 如块标志为真,移至块首 */
if(ksx<=xx) upto(ksx); /* 如目标行在当前行或之前,上移至目标行 */
else dnto(ksx); /* 如目标行在当前行后,下移至目标行 */
ser-=yy-ksy; /* 计算字序数 */
yy=ksy; /* 至块首列 */
if(a) comp_disp(); /* 如 a 为真,计算参数,重显当前屏幕 */
}
else write_prompt(1); /* 否则,提示:请先定义块 */
}
Ctrl_D() /* 删除块 */
{
if(blck==2) { /* 如已建立块 */
chg=1; /* 文件已修改标志置为真 */
txx=xx; /* 保存行号 */
tyy=yy; /* 保存列号 */
del_block(); /* 删块操作 */
Shift_F7(); /* 清除块定义,重显当前屏幕 */
}
else write_prompt(1); /* 否则,提示: 请先定义块 */
}
dks() /* 如块首、块尾重合, 块标志置 1 */
{
if(ksx==kwx && ksy==kwy) blck=1;
}
Ctrl_K() /* 拷贝块 */
{
int j,g;
long i;
if(blck==2) { /* 如已定义块 */
i=ser; /* 保存原字序号 */
if(read_block() || over(string_lingth())) {
/* 读块到ddd,并检查拷贝块后与移入处串相加行是否超长,如失败退回 */
ser=i; /* 恢复原字序号 */
return; /* 返回 */
}
i=kwx-ksx; /* 保存原块标记有用参数 */
j=kwy;
g=kwy-ksy;
ser+=tyy-yy; /* 计算字序数 */
mvto(txx); /* 重返原坐标,即块拷贝目的位置 */
kwy=(i==0)?yy+g:j; /* 计算块坐标变化 */
ksx=xx;
ksy=yy;
kwx=ksx+i;
write_block(kwx); /* 将 ddd 中的内容拷到目的位置 */
chg=1; /* 文件已修改标志置为真 */
comp_disp(); /* 计算有关参数,显示当前屏幕 */
ddd=dd; /* 指针返回缓冲区头 */
free(ddd); /* 释放 ddd 占用的内存空间 */
}
else write_prompt(1); /* 否则,提示:请先定义块 */
}
Ctrl_V() /* 移动块 */
{
int k,g;
long j;
if(blck==2) { /* 如已定义块 */
j=ser; /* 保存原字序数 */
if(read_block() || over(string_lingth())) {
/* 读块到ddd,并检查拷贝块后与移入处串相加行是否超长,如溢出退回 */
ser=j; /* 恢复原参数 */
return; /* 返回 */
}
j=kwx-ksx; /* 保存原块标记有用参数 */
k=kwy;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -