Skip to content

Commit 721b16a

Browse files
committed
add: 基本的命令行命令识别逻辑,待完善
1 parent 778523d commit 721b16a

File tree

3 files changed

+196
-40
lines changed

3 files changed

+196
-40
lines changed

llcomNext/LLCOM/Models/TerminalCommand.cs

Lines changed: 56 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -5,40 +5,68 @@ namespace LLCOM.Models;
55

66
public enum TerminalCommand
77
{
8-
None, //没匹配上任何命令
9-
Unknown, //未知命令
8+
/// <summary>没匹配上任何命令</summary>
9+
None,
10+
/// <summary>未知命令</summary>
11+
Unknown,
1012

11-
Bs, //退格 0x08
12-
Ht, //水平制表符 0x09
13-
Lf, //换行 0x0A
14-
Cr, //回车 0x0D
13+
/// <summary>退格 0x08</summary>
14+
Bs,
15+
/// <summary>水平制表符 0x09</summary>
16+
Ht,
17+
/// <summary>换行 0x0A</summary>
18+
Lf,
19+
/// <summary>回车 0x0D</summary>
20+
Cr,
1521

16-
Hide, //隐藏光标 \x1b[?25l
17-
Show, //显示光标 \x1b[?25h
22+
/// <summary>隐藏光标 \x1b[?25l</summary>
23+
Hide,
24+
/// <summary>显示光标 \x1b[?25h</summary>
25+
Show,
1826

19-
ClearLineEnd, //清除光标到行尾 \x1b[K
20-
ClearLineStart, //清除光标到行首 \x1b[1K
21-
ClearLine, //清除当前行 \x1b[2K
27+
/// <summary>清除光标到行尾 \x1b[K</summary>
28+
ClearLineEnd,
29+
/// <summary>清除光标到行首 \x1b[1K</summary>
30+
ClearLineStart,
31+
/// <summary>清除当前行 \x1b[2K</summary>
32+
ClearLine,
2233

23-
ClearScreenEnd, //清除光标到屏幕末尾 \x1b[J
24-
ClearScreenStart, //清除光标到屏幕开头 \x1b[1J
25-
ClearScreen, //清除屏幕 \x1b[2J
34+
/// <summary>清除光标到屏幕末尾 \x1b[J</summary>
35+
ClearScreenEnd,
36+
/// <summary>清除光标到屏幕开头 \x1b[1J</summary>
37+
ClearScreenStart,
38+
/// <summary>清除屏幕 \x1b[2J</summary>
39+
ClearScreen,
2640

27-
MoveCursorUp, //光标上移 \x1b[{n}A
28-
MoveCursorDown, //光标下移 \x1b[{n}B
29-
MoveCursorRight, //光标右移 \x1b[{n}C
30-
MoveCursorLeft, //光标左移 \x1b[{n}D
31-
ResetCursor, //光标移动到左上角 \x1b[H
32-
MoveCursorTo, //光标移动到指定位置 \x1b[{n};{m}H
33-
SaveCursor, //保存光标位置 \x1b[s
34-
RestoreCursor, //恢复光标位置 \x1b[u
41+
/// <summary>光标上移 \x1b&#123;n&#125;A</summary>
42+
MoveCursorUp,
43+
/// <summary>光标下移 \x1b&#123;n&#125;B</summary>
44+
MoveCursorDown,
45+
/// <summary>光标右移 \x1b&#123;n&#125;C</summary>
46+
MoveCursorRight,
47+
/// <summary>光标左移 \x1b&#123;n&#125;D</summary>
48+
MoveCursorLeft,
49+
/// <summary>光标移动到左上角 \x1b[H</summary>
50+
ResetCursor,
51+
/// <summary>光标移动到指定位置 \x1b&#123;n&#125;;&#123;m&#125;H</summary>
52+
MoveCursorTo,
53+
/// <summary>保存光标位置 \x1b[s</summary>
54+
SaveCursor,
55+
/// <summary>恢复光标位置 \x1b[u</summary>
56+
RestoreCursor,
3557

36-
ResetStyle, //重置样式 \x1b[m
37-
Bold, //加粗 \x1b[1m
38-
Underline, //下划线 \x1b[4m
39-
Reverse, //反转颜色 \x1b[7m
40-
ForegroundColor, //前景色 \x1b[3{n}m
41-
BackgroundColor, //背景色 \x1b[4{n}m
58+
/// <summary>重置样式 \x1b[m</summary>
59+
ResetStyle,
60+
/// <summary>加粗 \x1b[1m</summary>
61+
Bold,
62+
/// <summary>下划线 \x1b[4m</summary>
63+
Underline,
64+
/// <summary>反转颜色 \x1b[7m</summary>
65+
Reverse,
66+
/// <summary>前景色 \x1b[3&#123;n&#125;m</summary>
67+
ForegroundColor,
68+
/// <summary>背景色 \x1b[4&#123;n&#125;m</summary>
69+
BackgroundColor,
4270
}
4371

4472
public class TerminalCommandCheck

llcomNext/LLCOM/Models/TerminalObject.cs

Lines changed: 136 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ private void AddLine()
6969
/// 文本不得包含不可见字符
7070
/// </summary>
7171
/// <param name="texts">待添加的文本</param>
72-
public void AddText(char[] texts)//TODO)) 保持private
72+
private void AddText(char[] texts)//TODO)) 保持private
7373
{
7474
//防止没有设置窗口大小的时候就添加数据
7575
if(_windowWidth == 0 || _windowHeight == 0)
@@ -259,14 +259,14 @@ public void AddText(char[] texts)//TODO)) 保持private
259259
}
260260

261261
//TODO)) 仅用于测试
262-
public void ChangePosition(int x, int y)
262+
private void ChangePosition(int x, int y)
263263
{
264264
PositionX = x;
265265
PositionY = y;
266266
}
267267

268268
//TODO)) 仅用于测试
269-
public void ChangeStyle(
269+
private void ChangeStyle(
270270
int? foreground = null,
271271
int? background = null,
272272
bool? isBold = null,
@@ -436,4 +436,137 @@ public void ScrollBarChanged(double value)
436436
if(lastCurrentLine != CurrentLine)
437437
TerminalChanged();
438438
}
439+
440+
441+
442+
public void AddChars(ReadOnlySpan<char> chars)
443+
{
444+
//如果没有设置窗口大小,直接返回
445+
if(_windowWidth == 0 || _windowHeight == 0)
446+
return;
447+
448+
var ptr = 0;
449+
var lastPos = 0;
450+
while (ptr < chars.Length)
451+
{
452+
//分析当前文本块有没有匹配到命令
453+
var ((cmd, (p1,p2)) ,len) = TerminalCommandCheck.Do(chars[ptr..]);
454+
//没匹配到就继续下一个
455+
if (cmd == TerminalCommand.None)
456+
{
457+
ptr++;
458+
continue;
459+
}
460+
else//匹配到了,动作之前先打印没输出的文本
461+
{
462+
var slice = chars[lastPos..ptr];
463+
if (slice.Length > 0)
464+
{
465+
//添加文本
466+
AddText(slice.ToArray());
467+
}
468+
lastPos = ptr + len;
469+
ptr += len;
470+
}
471+
472+
//匹配对应命令
473+
switch (cmd)
474+
{
475+
case TerminalCommand.Unknown://未知命令,直接跳过
476+
break;
477+
case TerminalCommand.Bs:
478+
//退格,光标往前挪一个字符,并且删除当前字符
479+
//先把光标往前挪一个字符
480+
if (PositionX > 0)
481+
PositionX--;
482+
else if (PositionY > 0)
483+
{
484+
//如果光标在行首,往上一行挪
485+
PositionY--;
486+
PositionX = _windowWidth - 1; //挪到行尾
487+
}
488+
//样式恢复默认
489+
var lastState = CurrentState;
490+
CurrentState = new TerminalBlock("");
491+
//加一个空格来覆盖掉当前字符
492+
AddText(new[] { ' ' });
493+
//样式恢复到上一个状态
494+
CurrentState = lastState;
495+
//先把光标往前挪一个字符
496+
if (PositionX > 0)
497+
PositionX--;
498+
else if (PositionY > 0)
499+
{
500+
//如果光标在行首,往上一行挪
501+
PositionY--;
502+
PositionX = _windowWidth - 1; //挪到行尾
503+
}
504+
break;
505+
case TerminalCommand.Ht:
506+
break;
507+
case TerminalCommand.Lf:
508+
break;
509+
case TerminalCommand.Cr:
510+
break;
511+
case TerminalCommand.Hide:
512+
break;
513+
case TerminalCommand.Show:
514+
break;
515+
case TerminalCommand.ClearLineEnd:
516+
break;
517+
case TerminalCommand.ClearLineStart:
518+
break;
519+
case TerminalCommand.ClearLine:
520+
break;
521+
case TerminalCommand.ClearScreenEnd:
522+
break;
523+
case TerminalCommand.ClearScreenStart:
524+
break;
525+
case TerminalCommand.ClearScreen:
526+
break;
527+
case TerminalCommand.MoveCursorUp:
528+
break;
529+
case TerminalCommand.MoveCursorDown:
530+
break;
531+
case TerminalCommand.MoveCursorRight:
532+
break;
533+
case TerminalCommand.MoveCursorLeft:
534+
break;
535+
case TerminalCommand.ResetCursor:
536+
break;
537+
case TerminalCommand.MoveCursorTo:
538+
break;
539+
case TerminalCommand.SaveCursor:
540+
break;
541+
case TerminalCommand.RestoreCursor:
542+
break;
543+
case TerminalCommand.ResetStyle:
544+
break;
545+
case TerminalCommand.Bold:
546+
break;
547+
case TerminalCommand.Underline:
548+
break;
549+
case TerminalCommand.Reverse:
550+
break;
551+
case TerminalCommand.ForegroundColor:
552+
break;
553+
case TerminalCommand.BackgroundColor:
554+
break;
555+
default:
556+
throw new ArgumentOutOfRangeException();
557+
}
558+
//指针往后挪
559+
ptr += len;
560+
}
561+
562+
//如果最后还有未处理的文本
563+
if (lastPos < chars.Length)
564+
{
565+
//添加文本
566+
AddText(chars[lastPos..].ToArray());
567+
}
568+
569+
//触发更新事件
570+
TerminalChanged();
571+
}
439572
}

llcomNext/LLCOM/ViewModels/DataViews/TerminalViewModel.cs

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -33,19 +33,14 @@ public TerminalViewModel(Func<Type, ViewModelBase> getService)
3333
[RelayCommand]
3434
private async Task Test()
3535
{
36-
var random = new Random();
37-
var testChars = "测试Test".ToCharArray();
38-
for(int i=0; i<100; i++)
36+
//测试显示数据
37+
await Task.Run(() =>
3938
{
4039
lock (TerminalObject)
4140
{
42-
//TerminalObject.ChangeStyle(random.Next(30,38),random.Next(30,38));
43-
TerminalObject.ChangePosition(random.Next(0,TerminalObject.WindowWidth), random.Next(0,TerminalObject.WindowHeight));
44-
TerminalObject.AddText([testChars[random.Next(0, testChars.Length)]]);
45-
TerminalRefreshEvent?.Invoke(this, EventArgs.Empty);
41+
TerminalObject.AddChars("123456\b123456\b测试\b");
4642
}
47-
await Task.Delay(1);
48-
}
43+
});
4944
}
5045

5146
//终端对象, TODO)) 后续需要为每项操作加锁

0 commit comments

Comments
 (0)