📄 edit.cpp
字号:
for (int i = TextY; i < LengthOf(TextX); i++)
{
Text[TextX]->Line[i] = Text[TextX]->Line[i + 1];
}
Text[TextX]->Line[LengthOf(TextX)] = ' ';
// 当前行需重新着色
Text[TextX]->Sign[0] = ' ';
// 屏幕Y坐标前移1位
NowY--;
// 重新打印当前行
PrintLine(TextX);
// 设置修改标志
ShowSaved(false);
}
}
SetCursor();
}
void PressUp()
{
// 处理输入上键
if (TextX > 0)
{
// 非第1行
if (LengthOf(TextX) > 0)
{
// 当前行非空
// 标准化当前行
StandardizeLine(TextX);
char LineBak[MaxY];
strcpy(LineBak, Text[TextX]->Line);
ErrorType ErrorID = CheckLine(Text[TextX]->Line);
if (ErrorID != NoError)
{
gettext(1, 1, 80, 25, TextMirror);
ShowError(ErrorID, TextX, "");
Error = NoError;
strcpy(Text[TextX]->Line, LineBak);
return;
}
// 打印当前行
PrintLine(TextX);
}
// 文本X坐标上移1行
TextX--;
if (NowX > winEdit.Top() + 1)
{
// 屏幕X坐标未超出编辑窗口当前屏
// 光标上移1行
NowX--;
}
else
{
// 屏幕X坐标超出编辑窗口当前屏
// 修改编辑窗口首行序号
x0--;
// 重新打印编辑窗口当前屏
PrintText(winEdit.Top() + 1);
}
// 输出位置
ShowPosition();
// 输出编辑窗口垂直滚动条
winEdit.ScrollVertical(TextX);
}
SetCursor();
}
void PressDown()
{
// 处理输入下键
if (TextX < EndLine)
{
// 非最后一行
if (LengthOf(TextX) > 0)
{
// 当前行非空
char LineBak[MaxY];
strcpy(LineBak, Text[TextX]->Line);
// 标准化当前行
StandardizeLine(TextX);
ErrorType ErrorID = CheckLine(Text[TextX]->Line);
if (ErrorID != NoError)
{
gettext(1, 1, 80, 25, TextMirror);
ShowError(ErrorID, TextX, "");
Error = NoError;
strcpy(Text[TextX]->Line, LineBak);
return;
}
// 重新打印当前行
PrintLine(TextX);
}
// 文本X坐标下移1行
TextX++;
if (NowX < winEdit.Bottom() - 1)
{
// 屏幕X坐标未超出编辑窗口当前屏
// 光标下移1行
NowX++;
}
else
{
// 屏幕X坐标超出编辑窗口当前屏
// 修改编辑窗口首行序号
x0++;
// 重新打印编辑窗口当前屏
PrintText(winEdit.Top() + 1);
}
// 输出位置
ShowPosition();
// 输出编辑窗口垂直滚动条
winEdit.ScrollVertical(TextX);
}
SetCursor();
}
void PressPageUp()
{
// 处理输入PageUp
x0 -= winEdit.High() - 1;
TextX -= winEdit.High() - 1;
if (x0 < 0)
{
x0 = 0;
TextX = 0;
NowX = winEdit.Top() + 1;
}
// 重新打印编辑窗口当前屏
PrintText(winEdit.Top() + 1);
// 输出位置
ShowPosition();
// 输出编辑窗口垂直滚动条
winEdit.ScrollVertical(TextX);
SetCursor();
}
void PressPageDown()
{
// 处理输入PageDown
x0 += winEdit.High() - 1;
TextX += winEdit.High() - 1;
if (TextX > EndLine)
{
x0 = TextX = EndLine;
NowX = winEdit.Top() + 1;
}
// 重新打印编辑窗口当前屏
PrintText(winEdit.Top() + 1);
// 输出位置
ShowPosition();
// 输出编辑窗口垂直滚动条
winEdit.ScrollVertical(TextX);
SetCursor();
}
void PressCtrlY()
{
// 处理输入Ctrl + Y
// 删除当前行
// 将当前行(不含)以后的各行依次向上移动一行(文本,着色码,标记,断点)
for (int i = TextX; i < EndLine; i++)
{
strcpy(Text[i]->Line, Text[i + 1]->Line);
strcpy(Text[i]->Sign, Text[i + 1]->Sign);
Text[i]->Mark = Text[i + 1]->Mark;
Text[i]->Break = Text[i + 1]->Break;
}
// 最后一行清空
strset(Text[EndLine]->Line, ' ');
Text[EndLine]->Sign[0] =' ';
Text[EndLine]->Mark = false;
Text[EndLine]->Break = false;
if (TextX < EndLine)
{
// 当前行不是最后一行
DelLine();
// 删除最后一行
EndLine--;
// 修改编辑窗口文本高度
winEdit.SetTotHigh(EndLine);
}
// 修改文本Y坐标至行首
TextY = 0;
// 修改光标Y坐标至行首
NowY = winEdit.Left() + 1;
// 重新打印当前行(含)后的各行
PrintText(NowX);
// 输出位置
ShowPosition();
// 输出编辑窗口垂直滚动条
winEdit.ScrollVertical(TextX);
// 设置修改标志
ShowSaved(false);
SetCursor();
}
void PressCtrlPageUp()
{
// 处理输入Ctrl + PageUp
// 到文件开头
// 修改编辑窗口首行序号
x0 = 0;
// 修改文本X坐标至第一行
TextX = 0;
// 修改光标X坐标至第一行
NowX = winEdit.Top() + 1;
// 重新打印编辑窗口当前屏
PrintText(winEdit.Top() + 1);
// 输出位置
ShowPosition();
// 输出编辑窗口垂直滚动条
winEdit.ScrollVertical(TextX);
SetCursor();
}
void PressCtrlPageDown()
{
// 输入Ctrl + PageDown
// 到文件末尾
// 修改文本X坐标至最后一行
TextX = EndLine;
if (EndLine >= winEdit.High())
{
// 需要向后翻屏
// 修改编辑窗口首行序号
x0 = EndLine - winEdit.High();
// 修改光标X坐标至最后一行
NowX = winEdit.Bottom() - 1;
// 重新打印编辑窗口当前屏
PrintText(winEdit.Top() + 1);
}
else
{
// 无需翻屏
// 修改光标X坐标为最后一行
NowX = EndLine + winEdit.Top() - x0 + 1;
}
// 输出位置
ShowPosition();
// 输出编辑窗口垂直滚动条
winEdit.ScrollVertical(TextX);
SetCursor();
}
void PressEnter()
{
// 处理输入Enter
// 存储旧的着色特征码
char OldColor[MaxY];
strcpy(OldColor, Text[TextX]->Sign);
// 存储旧的当前行文本
char OldLine[MaxY];
strcpy(OldLine, Text[TextX]->Line);
// 取回车后剩余的当前行文本
char LineTemp[MaxY];
if (Insert)
{
GetMid(Text[TextX]->Line, 0, TextY - 1, LineTemp);
strcpy(Text[TextX]->Line, LineTemp);
}
// 标准化上一行
StandardizeLine(TextX);
ErrorType ErrorID = CheckLine(Text[TextX]->Line);
if (ErrorID != NoError)
{
strcpy(Text[TextX]->Sign, OldColor);
strcpy(Text[TextX]->Line, OldLine);
gettext(1, 1, 80, 25, TextMirror);
ShowError(ErrorID, TextX, "");
Error = NoError;
TextY = LengthOf(TextX);
NowX = TextX - x0 + winEdit.Top() + 1;
NowY = winEdit.Left() + TextY + 1;
PrintText(TextX - x0 + winEdit.Top() + 1);
SetCursor();
return;
}
else
{
strcpy(Text[TextX]->Line, OldLine);
}
if (TextX < MaxX - 1)
{
// 当前行小于最大允许行数
if (Insert)
{
// 当前处于插入模式
if (EndLine == TotRoomLine)
{
// 需要申请新的文本行空间
// 申请新的文本行
NewLine();
if (Error)
{
// 无空闲内存可申请
return;
}
}
// 设置修改标志
ShowSaved(false);
// 总行数加1
EndLine++;
// 修改编辑窗口文本总高度
winEdit.SetTotHigh(EndLine);
// 将当前行的下一行(不含)以后的各行依次向下移动一行(文本,着色码,标记,断点)
for (int i = EndLine; i > TextX + 1; i--)
{
strcpy(Text[i]->Line, Text[i - 1]->Line);
strcpy(Text[i]->Sign, Text[i - 1]->Sign);
Text[i]->Mark = Text[i - 1]->Mark;
Text[i]->Break = Text[i - 1]->Break;
}
// 当前行下一行清空
strset(Text[TextX + 1]->Line, ' ');
// 当前行的下一行需重新着色
Text[TextX + 1]->Sign[0] = ' ';
// 当前行的长度(非空格)
int j = LengthOf(TextX);
// 处理标记、断点和着色码
if (0 < TextY && TextY < j)
{
// 当前行被截断
// 删除当前行和下一行的标记和断点
Text[TextX]->Mark = false;
Text[TextX]->Break = false;
Text[TextX + 1]->Mark = false;
Text[TextX + 1]->Break = false;
// 当前行和下一行需要重新着色
Text[TextX]->Sign[0] = ' ';
Text[TextX + 1]->Sign[0] = ' ';
}
else if (TextY >= j)
{
// 从当前行末尾处回车,当前行完好
// 删除下一行的标记和断点
Text[TextX + 1]->Mark = false;
Text[TextX + 1]->Break = false;
// 下一行需要重新着色
Text[TextX + 1]->Sign[0] = ' ';
}
else
{
// 当前行被整体移动到下一行
// 复制当前行的标记和断点至下一行。
Text[TextX + 1]->Mark = Text[TextX]->Mark;
Text[TextX + 1]->Break = Text[TextX]->Break;
// 删除当前行的标记和断点
Text[TextX]->Mark = false;
Text[TextX]->Break = false;
// 当前行需要重新着色
Text[TextX]->Sign[0] = ' ';
// 复制当前行的着色码至下一行
strcpy(Text[TextX + 1]->Sign, Text[TextX]->Sign);
}
// 当前行光标处开始的文本被移动到下一行
for (i = TextY; i < j; i++)
{
Text[TextX + 1]->Line[i - TextY] = Text[TextX]->Line[i];
}
// 清空当前行后部多余的文本
for (i = TextY; i < LengthOf(TextX); i++)
{
Text[TextX]->Line[i]=' ';
}
}
else if (TextX < EndLine)
{
// 当前处于改写模式,且不是最后一行
// 修改文本坐标
TextX++;
TextY = 0;
if (NowX == winEdit.Bottom() - 1)
{
// 光标在编辑窗口的底行,需要向上翻屏
// 编辑窗口首行序号加1
x0++;
// 输出编辑窗口垂直滚动条
winEdit.ScrollVertical(TextX);
// 输出位置
ShowPosition();
}
else
{
// 无需翻屏
// 光标下移一行
NowX++;
}
return;
}
StandardizeLine(TextX);
// 文本X坐标加1
TextX++;
// 寻找前一行(非空)的行首位置(非空格),完成自动对齐缩进
int i = TextX;
int j;
do
{
i--;
j = 0;
while (j < LengthOf(i) && Text[i]->Line[j] == ' ')
{
j++;
}
} while (i >= 0 && LengthOf(i) == 0);
if (NextTab(j) > 0 && IsIndent(i))
{
// 当前行需要再缩进Tab各字符
// 当前行的行首位置
j = NextTab(j);
if (LengthOf(TextX) > 0)
{
// 当前行非空
// 将当前行文本前移至自动缩进位置
for (i = LengthOf(TextX) + j; i >= j; i--)
{
Text[TextX]->Line[i] = Text[TextX]->Line[i - j];
}
// 清空当前行后部多余部分
for (i = j - 1; i >= 0; i--)
{
Text[TextX]->Line[i] = ' ';
}
}
}
// 修改文本Y坐标为行首(非空格,带自动对齐缩进)
TextY = j;
// 修改光标Y坐标
NowY = j + winEdit.Left() + 1;
if (TextY > HeadOf(TextX))
{
// 当前行的行首位置在当前光标的前面,需要向后移动
// 将当前行文本向后移动,至行首与光标对齐
for (i = LengthOf(TextX) + j; i >= j; i--)
{
Text[TextX]->Line[i] = Text[TextX]->Line[i - j];
}
// 清空前部内容
for (i = j - 1; i >= 0; i--)
{
Text[TextX]->Line[i] = ' ';
}
}
if (NowX < winEdit.Bottom() - 1)
{
// 不需要翻屏
// 光标下移1行
NowX++;
// 重新打印自当前行开始的各行
PrintText(TextX - 1 - x0 + winEdit.Top() + 1);
}
else
{
// 需要翻屏
// 编辑窗口首行序号加1
x0++;
// 重新打印编辑窗口当前屏
PrintText(winEdit.Top() + 1);
}
// 输出位置
ShowPosition();
// 输出编辑窗口垂直滚动条
winEdit.ScrollVertical(TextX);
SetCursor();
}
else
{
// 无法再添加新的文本行
// 警报
Sound();
}
}
void PressTab()
{
// 处理输入Tab
// 寻找当前位置后面的Tab区的开始位置
int i = NextTab(TextY);
// 当前行需要向后移动的字符数
int Plus = i - TextY;
if (i > 0)
{
// 后面还有Tab区
if (Insert && LengthOf(TextX) + Plus < MaxY)
{
// 插入模式下,当前行不会超出编辑窗口宽度
// 当前行向后移动,至行首与新Tab区开始点对齐
for (int i = LengthOf(TextX); i >= TextY; i--)
{
Text[TextX]->Line[i + Plus] = Text[TextX]->Line[i];
}
// 清空行首多余部分
for (i = 0; i < Plus; i++)
{
Text[TextX]->Line[i + TextY] = ' ';
}
// 当前行需重新着色
Text[TextX]->Sign[0] = ' ';
// 重新打印当前行
PrintLine(TextX);
// 文本Y坐标后移
TextY += Plus;
// 光标后移
NowY += Plus;
// 设置修改标志
ShowSaved(false);
}
else if (!Insert && TextY + Plus < MaxY)
{
// 改写模式下,光标后面还有Tab区
// 文本Y坐标后移
TextY += Plus;
// 光标后移
NowY += Plus;
}
// 输出位置
ShowPosition();
}
SetCursor();
}
void PressText(const int Key)
{
// 处理输入其他字符
if (isprint((char)Key) &&
TextY < MaxY - 1 &&
(Insert && LengthOf(TextX) < MaxY - 1 || (!Insert)))
{
// 输入的是普通文本
if (Insert)
{
// 当前是插入模式
// 当前位置后面的字符依次向后移动一个字符
for (int i = LengthOf(TextX); i > TextY; i--)
{
Text[TextX]->Line[i] = Text[TextX]->Line[i - 1];
}
}
// 将输入赋值给当前位置字符
Text[TextX]->Line[TextY] = Key;
// 当前行需要重新着色
Text[TextX]->Sign[0] = ' ';
// 重新打印当前行
PrintLine(TextX);
// 文本Y坐标右移
TextY++;
// 光标右移
NowY++;
// 设置修改标志
ShowSaved(false);
// 输出位置
ShowPosition();
}
SetCursor();
}
int NextTab(const int Now)
{
// 返回Now位置之后Tab区的开始位置
int i = Now + 1;
while (i < MaxY - 1 && !TabStart[i])
{
i++;
}
if (i < MaxY - 1)
{
return i;
}
else
{
return -1;
}
}
int PreviousTab(const int Now)
{
// 返回Now位置之前Tab区的开始位置
int i = Now - 1;
while (i > 0 && !TabStart[i])
{
i--;
}
if (i >= 0)
{
return i;
}
else
{
return -1;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -