@@ -18,7 +18,7 @@ const fo = new FakeInput();
1818new Interface ( { input : fi , output : fo , terminal : true } ) ;
1919
2020let keys = [ ] ;
21- fi . on ( 'keypress' , function ( s , k ) {
21+ fi . on ( 'keypress' , ( s , k ) => {
2222 keys . push ( k ) ;
2323} ) ;
2424
@@ -32,13 +32,13 @@ function addTest(sequences, expectedKeys) {
3232 expectedKeys = [ expectedKeys ] ;
3333 }
3434
35- expectedKeys = expectedKeys . map ( function ( k ) {
35+ expectedKeys = expectedKeys . map ( ( k ) => {
3636 return k ? extend ( { ctrl : false , meta : false , shift : false } , k ) : k ;
3737 } ) ;
3838
3939 keys = [ ] ;
4040
41- sequences . forEach ( function ( sequence ) {
41+ sequences . forEach ( ( sequence ) => {
4242 fi . write ( sequence ) ;
4343 } ) ;
4444 assert . deepStrictEqual ( keys , expectedKeys ) ;
@@ -65,7 +65,7 @@ const addKeyIntervalTest = (sequences, expectedKeys, interval = 550,
6565 expectedKeys = [ expectedKeys ] ;
6666 }
6767
68- expectedKeys = expectedKeys . map ( function ( k ) {
68+ expectedKeys = expectedKeys . map ( ( k ) => {
6969 return k ? extend ( { ctrl : false , meta : false , shift : false } , k ) : k ;
7070 } ) ;
7171
@@ -129,10 +129,63 @@ addTest('a\x1baA\x1bA', [
129129 { name : 'a' , sequence : '\x1bA' , meta : true , shift : true } ,
130130] ) ;
131131
132- // xterm/gnome
133- addTest ( '\x1bOA\x1bOB' , [
132+ // xterm/gnome ESC O letter
133+ addTest ( '\x1bOP\x1bOQ\x1bOR\x1bOS' , [
134+ { name : 'f1' , sequence : '\x1bOP' , code : 'OP' } ,
135+ { name : 'f2' , sequence : '\x1bOQ' , code : 'OQ' } ,
136+ { name : 'f3' , sequence : '\x1bOR' , code : 'OR' } ,
137+ { name : 'f4' , sequence : '\x1bOS' , code : 'OS' } ,
138+ ] ) ;
139+
140+ // xterm/rxvt ESC [ number ~ */
141+ addTest ( '\x1b[11~\x1b[12~\x1b[13~\x1b[14~' , [
142+ { name : 'f1' , sequence : '\x1b[11~' , code : '[11~' } ,
143+ { name : 'f2' , sequence : '\x1b[12~' , code : '[12~' } ,
144+ { name : 'f3' , sequence : '\x1b[13~' , code : '[13~' } ,
145+ { name : 'f4' , sequence : '\x1b[14~' , code : '[14~' } ,
146+ ] ) ;
147+
148+ // from Cygwin and used in libuv
149+ addTest ( '\x1b[[A\x1b[[B\x1b[[C\x1b[[D\x1b[[E' , [
150+ { name : 'f1' , sequence : '\x1b[[A' , code : '[[A' } ,
151+ { name : 'f2' , sequence : '\x1b[[B' , code : '[[B' } ,
152+ { name : 'f3' , sequence : '\x1b[[C' , code : '[[C' } ,
153+ { name : 'f4' , sequence : '\x1b[[D' , code : '[[D' } ,
154+ { name : 'f5' , sequence : '\x1b[[E' , code : '[[E' } ,
155+ ] ) ;
156+
157+ // common
158+ addTest ( '\x1b[15~\x1b[17~\x1b[18~\x1b[19~\x1b[20~\x1b[21~\x1b[23~\x1b[24~' , [
159+ { name : 'f5' , sequence : '\x1b[15~' , code : '[15~' } ,
160+ { name : 'f6' , sequence : '\x1b[17~' , code : '[17~' } ,
161+ { name : 'f7' , sequence : '\x1b[18~' , code : '[18~' } ,
162+ { name : 'f8' , sequence : '\x1b[19~' , code : '[19~' } ,
163+ { name : 'f9' , sequence : '\x1b[20~' , code : '[20~' } ,
164+ { name : 'f10' , sequence : '\x1b[21~' , code : '[21~' } ,
165+ { name : 'f11' , sequence : '\x1b[23~' , code : '[23~' } ,
166+ { name : 'f12' , sequence : '\x1b[24~' , code : '[24~' } ,
167+ ] ) ;
168+
169+ // xterm ESC [ letter
170+ addTest ( '\x1b[A\x1b[B\x1b[C\x1b[D\x1b[E\x1b[F\x1b[H' , [
171+ { name : 'up' , sequence : '\x1b[A' , code : '[A' } ,
172+ { name : 'down' , sequence : '\x1b[B' , code : '[B' } ,
173+ { name : 'right' , sequence : '\x1b[C' , code : '[C' } ,
174+ { name : 'left' , sequence : '\x1b[D' , code : '[D' } ,
175+ { name : 'clear' , sequence : '\x1b[E' , code : '[E' } ,
176+ { name : 'end' , sequence : '\x1b[F' , code : '[F' } ,
177+ { name : 'home' , sequence : '\x1b[H' , code : '[H' } ,
178+ ] ) ;
179+
180+ // xterm/gnome ESC O letter
181+ addTest ( '\x1bOA\x1bOB\x1bOC\x1bOD\x1bOE\x1bOF\x1bOH' , [
134182 { name : 'up' , sequence : '\x1bOA' , code : 'OA' } ,
135183 { name : 'down' , sequence : '\x1bOB' , code : 'OB' } ,
184+ { name : 'right' , sequence : '\x1bOC' , code : 'OC' } ,
185+ { name : 'left' , sequence : '\x1bOD' , code : 'OD' } ,
186+ { name : 'clear' , sequence : '\x1bOE' , code : 'OE' } ,
187+ { name : 'end' , sequence : '\x1bOF' , code : 'OF' } ,
188+ { name : 'home' , sequence : '\x1bOH' , code : 'OH' } ,
136189] ) ;
137190
138191// old xterm shift-arrows
@@ -141,6 +194,28 @@ addTest('\x1bO2A\x1bO2B', [
141194 { name : 'down' , sequence : '\x1bO2B' , code : 'OB' , shift : true } ,
142195] ) ;
143196
197+ // xterm/rxvt ESC [ number ~
198+ addTest ( '\x1b[1~\x1b[2~\x1b[3~\x1b[4~\x1b[5~\x1b[6~' , [
199+ { name : 'home' , sequence : '\x1b[1~' , code : '[1~' } ,
200+ { name : 'insert' , sequence : '\x1b[2~' , code : '[2~' } ,
201+ { name : 'delete' , sequence : '\x1b[3~' , code : '[3~' } ,
202+ { name : 'end' , sequence : '\x1b[4~' , code : '[4~' } ,
203+ { name : 'pageup' , sequence : '\x1b[5~' , code : '[5~' } ,
204+ { name : 'pagedown' , sequence : '\x1b[6~' , code : '[6~' } ,
205+ ] ) ;
206+
207+ // putty
208+ addTest ( '\x1b[[5~\x1b[[6~' , [
209+ { name : 'pageup' , sequence : '\x1b[[5~' , code : '[[5~' } ,
210+ { name : 'pagedown' , sequence : '\x1b[[6~' , code : '[[6~' } ,
211+ ] ) ;
212+
213+ // rxvt
214+ addTest ( '\x1b[7~\x1b[8~' , [
215+ { name : 'home' , sequence : '\x1b[7~' , code : '[7~' } ,
216+ { name : 'end' , sequence : '\x1b[8~' , code : '[8~' } ,
217+ ] ) ;
218+
144219// gnome terminal
145220addTest ( '\x1b[A\x1b[B\x1b[2A\x1b[2B' , [
146221 { name : 'up' , sequence : '\x1b[A' , code : '[A' } ,
@@ -149,11 +224,27 @@ addTest('\x1b[A\x1b[B\x1b[2A\x1b[2B', [
149224 { name : 'down' , sequence : '\x1b[2B' , code : '[B' , shift : true } ,
150225] ) ;
151226
152- // rxvt
153- addTest ( '\x1b[20~\x1b[2$\x1b[2^' , [
227+ // rxvt keys with modifiers
228+ // eslint-disable-next-line max-len
229+ addTest ( '\x1b[20~\x1b[2$\x1b[2^\x1b[3$\x1b[3^\x1b[5$\x1b[5^\x1b[6$\x1b[6^\x1b[7$\x1b[7^\x1b[8$\x1b[8^' , [
154230 { name : 'f9' , sequence : '\x1b[20~' , code : '[20~' } ,
155231 { name : 'insert' , sequence : '\x1b[2$' , code : '[2$' , shift : true } ,
156232 { name : 'insert' , sequence : '\x1b[2^' , code : '[2^' , ctrl : true } ,
233+ { name : 'delete' , sequence : '\x1b[3$' , code : '[3$' , shift : true } ,
234+ { name : 'delete' , sequence : '\x1b[3^' , code : '[3^' , ctrl : true } ,
235+ { name : 'pageup' , sequence : '\x1b[5$' , code : '[5$' , shift : true } ,
236+ { name : 'pageup' , sequence : '\x1b[5^' , code : '[5^' , ctrl : true } ,
237+ { name : 'pagedown' , sequence : '\x1b[6$' , code : '[6$' , shift : true } ,
238+ { name : 'pagedown' , sequence : '\x1b[6^' , code : '[6^' , ctrl : true } ,
239+ { name : 'home' , sequence : '\x1b[7$' , code : '[7$' , shift : true } ,
240+ { name : 'home' , sequence : '\x1b[7^' , code : '[7^' , ctrl : true } ,
241+ { name : 'end' , sequence : '\x1b[8$' , code : '[8$' , shift : true } ,
242+ { name : 'end' , sequence : '\x1b[8^' , code : '[8^' , ctrl : true } ,
243+ ] ) ;
244+
245+ // misc
246+ addTest ( '\x1b[Z' , [
247+ { name : 'tab' , sequence : '\x1b[Z' , code : '[Z' , shift : true } ,
157248] ) ;
158249
159250// xterm + modifiers
0 commit comments