📄 全屏幕编辑软件的编写(c语言)02.txt
字号:
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); /* 否则,提示:请先定义块 */
}
上一页 [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12] [13] [14] [15] [16] 下一页
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); /* 否则,提示:请先定义块 */
}
上一页 [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12] [13] [14] [15] [16] 下一页
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; /* 保存原块标记有用参数 *
上一页 [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12] [13] [14] [15] [16] 下一页
k=kwy;
g=kwy-ksy;
del_block(); /* 删除原块 */
kwy=(j==0)?yy+g:k; /* 计算新位置块标记 */
ksx=xx;
ksy=yy;
kwx=ksx+j;
write_block(kwx); /* ddd 中块拷至当前光标处 */
blck=2; /* 置为:已定义块 */
chg=1; /* 文件已修改标志置为真 */
comp_disp(); /* 计算显示参数, 显示本屏 */
ddd=dd; /* 指针返回缓冲区头 */
free(ddd); /* 释放 ddd 占用的内存空间 */
}
else write_prompt(1); /* 否则,提示“请先定义块!” */
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -