@@ -26,7 +26,42 @@ const BACKSPACE_BYTES = new Set(["\u007F", "\b"]);
2626const FORWARD_DELETE_SEQUENCES = new Set ( [ "\u001B[3~" , "\u001B[P" ] ) ;
2727const HOME_SEQUENCES = new Set ( [ "\u001B[H" , "\u001B[1~" , "\u001B[7~" , "\u001BOH" ] ) ;
2828const END_SEQUENCES = new Set ( [ "\u001B[F" , "\u001B[4~" , "\u001B[8~" , "\u001BOF" ] ) ;
29- const SHIFT_RETURN_SEQUENCES = new Set ( [ "\u001B\r" , "\u001B[13;2u" , "\u001B[13;2~" , "\u001B[27;2;13~" ] ) ;
29+ const SHIFT_RETURN_SEQUENCES = new Set ( [
30+ "\u001B\r" ,
31+ "\u001B[13;2u" ,
32+ "\u001B[13;1u" ,
33+ "\u001B[13;2~" ,
34+ "\u001B[13;1~" ,
35+ "\u001B[27;2;13~" ,
36+ "\u001B[27;1;13~" ,
37+ ] ) ;
38+
39+ const CSI_SHIFT_RETURN_RE = / ^ \u001B \[ 1 3 ; ( \d + ) [ u ~ ] $ / ;
40+ const CSI_EXTENDED_SHIFT_RETURN_RE = / ^ \u001B \[ 2 7 ; ( \d + ) ; 1 3 ~ $ / ;
41+
42+ function isShiftReturn ( raw : string ) : boolean {
43+ if ( SHIFT_RETURN_SEQUENCES . has ( raw ) ) return true ;
44+ let m : RegExpMatchArray | null ;
45+ if ( ( m = raw . match ( CSI_SHIFT_RETURN_RE ) ) !== null ) {
46+ const mod = parseInt ( m [ 1 ] , 10 ) ;
47+ return ( mod & 2 ) !== 0 || ( mod & 1 ) !== 0 ;
48+ }
49+ if ( ( m = raw . match ( CSI_EXTENDED_SHIFT_RETURN_RE ) ) !== null ) {
50+ const mod = parseInt ( m [ 1 ] , 10 ) ;
51+ return ( mod & 2 ) !== 0 || ( mod & 1 ) !== 0 ;
52+ }
53+ return false ;
54+ }
55+
56+ const CSI_RETURN_RE = / ^ \u001B \[ 1 3 ; ( \d + ) [ u ~ ] $ / ;
57+ const CSI_EXTENDED_RETURN_RE = / ^ \u001B \[ 2 7 ; ( \d + ) ; 1 3 ~ $ / ;
58+
59+ function isReturn ( raw : string ) : boolean {
60+ if ( raw === "\r" ) return true ;
61+ if ( SHIFT_RETURN_SEQUENCES . has ( raw ) ) return true ;
62+ if ( META_RETURN_SEQUENCES . has ( raw ) ) return true ;
63+ return CSI_RETURN_RE . test ( raw ) || CSI_EXTENDED_RETURN_RE . test ( raw ) ;
64+ }
3065const META_RETURN_SEQUENCES = new Set ( [ "\u001B[13;3u" , "\u001B[13;4u" ] ) ;
3166const CTRL_LEFT_SEQUENCES = new Set ( [ "\u001B[1;5D" , "\u001B[5D" ] ) ;
3267const CTRL_RIGHT_SEQUENCES = new Set ( [ "\u001B[1;5C" , "\u001B[5C" ] ) ;
@@ -113,10 +148,10 @@ export function parseTerminalInput(data: Buffer | string): { input: string; key:
113148 end : END_SEQUENCES . has ( raw ) ,
114149 pageDown : raw === "\u001B[6~" ,
115150 pageUp : raw === "\u001B[5~" ,
116- return : raw === "\r" || SHIFT_RETURN_SEQUENCES . has ( raw ) || META_RETURN_SEQUENCES . has ( raw ) ,
151+ return : isReturn ( raw ) ,
117152 escape : raw === "\u001B" ,
118153 ctrl : CTRL_LEFT_SEQUENCES . has ( raw ) || CTRL_RIGHT_SEQUENCES . has ( raw ) ,
119- shift : SHIFT_RETURN_SEQUENCES . has ( raw ) ,
154+ shift : isShiftReturn ( raw ) ,
120155 tab : raw === "\t" || raw === "\u001B[Z" ,
121156 backspace : BACKSPACE_BYTES . has ( raw ) ,
122157 delete : FORWARD_DELETE_SEQUENCES . has ( raw ) ,
@@ -162,7 +197,7 @@ export function parseTerminalInput(data: Buffer | string): { input: string; key:
162197 key . shift = true ;
163198 }
164199
165- if ( key . tab || key . backspace || key . delete ) {
200+ if ( key . tab || key . backspace || key . delete || key . return ) {
166201 input = "" ;
167202 }
168203
0 commit comments