@@ -25,26 +25,25 @@ private void TerminalChanged()
2525 TerminalChangedEvent ? . Invoke ( this , EventArgs . Empty ) ;
2626 }
2727
28- //用于存放终端数据的缓存
28+ /// 用于存放终端数据的缓存
2929 private List < List < TerminalBlock > > CacheLines { get ; } = [ ] ;
3030
3131 //当前光标位置
32- //X从0开始,最大可到达窗口宽度(再增加就需要换行了)
33- //Y从0开始,最大可到达窗口高度-1
32+ /// X从0开始,最大可到达窗口宽度(再增加就需要换行了)
3433 private int PositionX { get ; set ; } = 0 ;
34+ /// Y从0开始,最大可到达窗口高度-1
3535 private int PositionY { get ; set ; } = 0 ;
3636
37- //当前的颜色、字体等信息,存到TerminalBlock中
37+ /// 当前的颜色、字体等信息,存到TerminalBlock中
3838 private TerminalBlock CurrentState { get ; set ; } = new ( String . Empty ) ;
3939
40- //MaxCacheLines表示终端缓存的行数,超过这个行数后会删除最上面的行
40+ /// MaxCacheLines表示终端缓存的行数,超过这个行数后会删除最上面的行
4141 private readonly int _maxCacheLines = Utils . Setting . TerminalBufferLines ;
4242
43- //可视范围内的宽高
43+ /// 可视范围内的宽
4444 private int _windowWidth ;
45- public int WindowWidth => _windowWidth ;
45+ /// 可视范围内的高
4646 private int _windowHeight ;
47- public int WindowHeight => _windowHeight ;
4847
4948 //添加新的一行上去
5049 private void AddLine ( )
@@ -469,6 +468,8 @@ public void AddChars(ReadOnlySpan<char> chars)
469468 ptr += len ;
470469 }
471470
471+ //当前的样式备份一下
472+ var lastState = CurrentState ;
472473 //匹配对应命令
473474 switch ( cmd )
474475 {
@@ -486,7 +487,6 @@ public void AddChars(ReadOnlySpan<char> chars)
486487 PositionX = _windowWidth - 1 ; //挪到行尾
487488 }
488489 //样式恢复默认
489- var lastState = CurrentState ;
490490 CurrentState = new TerminalBlock ( "" ) ;
491491 //加一个空格来覆盖掉当前字符
492492 AddText ( new [ ] { ' ' } ) ;
@@ -503,20 +503,84 @@ public void AddChars(ReadOnlySpan<char> chars)
503503 }
504504 break ;
505505 case TerminalCommand . Ht :
506+ //水平制表符,光标往后挪到下一个制表符位置,制表符位置是8的倍数
507+ //计算一下需要几个空格
508+ var nextTabStop = ( PositionX / 8 + 1 ) * 8 ;
509+ //如果下一个制表符位置超过了窗口宽度,就直接挪到窗口宽度
510+ if ( nextTabStop >= _windowWidth )
511+ nextTabStop = _windowWidth - 1 ;
512+ //添加空格
513+ var spaces = nextTabStop - PositionX ;
514+ if ( spaces > 0 )
515+ {
516+ //添加空格
517+ AddText ( new string ( ' ' , spaces ) . ToCharArray ( ) ) ;
518+ //光标位置往后挪
519+ PositionX += spaces ;
520+ }
506521 break ;
507522 case TerminalCommand . Lf :
523+ //换行,光标往下一行挪
524+ PositionY ++ ;
525+ if ( PositionY >= _windowHeight )
526+ {
527+ //如果超过了最大高度,添加新行
528+ AddLine ( ) ;
529+ PositionY = _windowHeight - 1 ; //光标位置挪到最后一行
530+ }
508531 break ;
509532 case TerminalCommand . Cr :
533+ //回车,光标位置挪到行首
534+ PositionX = 0 ;
510535 break ;
511536 case TerminalCommand . Hide :
537+ //隐藏光标,TODO
512538 break ;
513539 case TerminalCommand . Show :
540+ //显示光标,TODO
514541 break ;
515542 case TerminalCommand . ClearLineEnd :
543+ //清除光标到行尾
544+ //样式恢复默认
545+ CurrentState = new TerminalBlock ( "" ) ;
546+ //添加空格到行尾
547+ var spacesToEnd = _windowWidth - PositionX ;
548+ if ( spacesToEnd > 0 )
549+ {
550+ AddText ( new string ( ' ' , spacesToEnd ) . ToCharArray ( ) ) ;
551+ }
552+ //样式恢复到上一个状态
553+ CurrentState = lastState ;
516554 break ;
517555 case TerminalCommand . ClearLineStart :
556+ //清除光标到行首
557+ //样式恢复默认
558+ CurrentState = new TerminalBlock ( "" ) ;
559+ //存一下上次的光标位置
560+ var oldXLineStartCmd = PositionX ;
561+ //光标位置挪到行首
562+ PositionX = 0 ;
563+ //添加空格到行首
564+ if ( oldXLineStartCmd > 0 )
565+ {
566+ AddText ( new string ( ' ' , oldXLineStartCmd ) . ToCharArray ( ) ) ;
567+ }
568+ //样式恢复到上一个状态
569+ CurrentState = lastState ;
518570 break ;
519571 case TerminalCommand . ClearLine :
572+ //清除当前行
573+ //样式恢复默认
574+ CurrentState = new TerminalBlock ( "" ) ;
575+ //移动光标到行首
576+ PositionX = 0 ;
577+ //添加一行空格
578+ if ( _windowWidth > 0 )
579+ {
580+ AddText ( new string ( ' ' , _windowWidth ) . ToCharArray ( ) ) ;
581+ }
582+ //样式恢复到上一个状态
583+ CurrentState = lastState ;
520584 break ;
521585 case TerminalCommand . ClearScreenEnd :
522586 break ;
0 commit comments