@@ -1394,10 +1394,6 @@ export class TerminalInstance extends Disposable implements ITerminalInstance {
1394
1394
}
1395
1395
} ) ) ;
1396
1396
1397
- this . _register ( processManager . onProcessData ( ev => {
1398
- this . _initialDataEvents ?. push ( ev . data ) ;
1399
- this . _onData . fire ( ev . data ) ;
1400
- } ) ) ;
1401
1397
this . _register ( processManager . onProcessReplayComplete ( ( ) => this . _onProcessReplayComplete . fire ( ) ) ) ;
1402
1398
this . _register ( processManager . onEnvironmentVariableInfoChanged ( e => this . _onEnvironmentVariableInfoChanged ( e ) ) ) ;
1403
1399
this . _register ( processManager . onPtyDisconnect ( ( ) => {
@@ -1480,19 +1476,38 @@ export class TerminalInstance extends Disposable implements ITerminalInstance {
1480
1476
}
1481
1477
1482
1478
private _onProcessData ( ev : IProcessDataEvent ) : void {
1483
- if ( ev . trackCommit ) {
1484
- ev . writePromise = new Promise < void > ( r => this . _writeProcessData ( ev , r ) ) ;
1479
+ // TODO: Move to separate listener
1480
+ this . _initialDataEvents ?. push ( ev . data ) ;
1481
+
1482
+ // Ensure events are split by SI command execute sequence to ensure the output of the
1483
+ // command can be read by extensions. This must be done here as xterm.js does not currently
1484
+ // have a listener for when individual data events are parsed, only `onWriteParsed` which
1485
+ // fires when the write buffer is flushed.
1486
+ const execIndex = ev . data . indexOf ( '\x1b]633;C\x07' ) ;
1487
+ if ( execIndex !== - 1 ) {
1488
+ if ( ev . trackCommit ) {
1489
+ this . _writeProcessData ( ev . data . substring ( 0 , execIndex + '\x1b]633;C\x07' . length ) ) ;
1490
+ ev . writePromise = new Promise < void > ( r => this . _writeProcessData ( ev . data . substring ( execIndex + '\x1b]633;C\x07' . length ) , r ) ) ;
1491
+ } else {
1492
+ this . _writeProcessData ( ev . data . substring ( 0 , execIndex + '\x1b]633;C\x07' . length ) ) ;
1493
+ this . _writeProcessData ( ev . data . substring ( execIndex + '\x1b]633;C\x07' . length ) ) ;
1494
+ }
1485
1495
} else {
1486
- this . _writeProcessData ( ev ) ;
1496
+ if ( ev . trackCommit ) {
1497
+ ev . writePromise = new Promise < void > ( r => this . _writeProcessData ( ev . data , r ) ) ;
1498
+ } else {
1499
+ this . _writeProcessData ( ev . data ) ;
1500
+ }
1487
1501
}
1488
1502
}
1489
1503
1490
- private _writeProcessData ( ev : IProcessDataEvent , cb ?: ( ) => void ) {
1504
+ private _writeProcessData ( data : string , cb ?: ( ) => void ) {
1491
1505
const messageId = ++ this . _latestXtermWriteData ;
1492
- this . xterm ?. raw . write ( ev . data , ( ) => {
1506
+ this . xterm ?. raw . write ( data , ( ) => {
1493
1507
this . _latestXtermParseData = messageId ;
1494
- this . _processManager . acknowledgeDataEvent ( ev . data . length ) ;
1508
+ this . _processManager . acknowledgeDataEvent ( data . length ) ;
1495
1509
cb ?.( ) ;
1510
+ this . _onData . fire ( data ) ;
1496
1511
} ) ;
1497
1512
}
1498
1513
0 commit comments