Run this: puts "Type any characters, then ." expect { ? { set result $expect_out(0,string) if {[string compare \n $result]} { scan $result %c value if {$value==27} { puts "You just typed Esc (decimal ASCII 27)." } { puts "You just typed '$result' (decimal ASCII $value)." } } exp_continue } } Example output: type "a", see decimal 97; type "", see the sequence 27-91-49-(49,50)-126 [[explain]] Win 95 ---- Also see "[keysyms]", [CWIND], and "[How to send escape characters through Expect]". ---- [Csan] The original code did not handle the Esc $result properly - it ate the second ' character in the output. I added a branch to handle that case. I also extended the output to include the octal and hexadecimal values - useful for further re-use of the $result - see further on. Another addition was to save the resulting character (sequence) to keyseq.dat, which can be imported into another text editor. I find this addition very useful while using 'joe' editor... 2008-08-06: new version, with corrected output (cosmetic changes, prettier output, correct text), switched to [string equal] and also handling the Enter-only case The new version of the script (I called it keyseqs.exp): #!/usr/bin/expect set timeout 10 set outfile ./keyseq.dat set prompt "Type any characters followed by , wait for $timeout seconds or press Ctrl-C The resulting character sequence will be written to $outfile Type here: " set showheader 1 set seqsize 0 puts $prompt expect { ? { set result $expect_out(0,string) if {![string equal \n $result]} { if {[catch {eof $fd}]} { set fd [open $outfile w] } scan $result %c dvalue set show $result if {$dvalue==27} { set show Esc } if {$showheader} { puts "\nWhat you have just entered I can see as the following byte sequence:\n" set showheader 0 } puts "'$show'\t(ASCII octal [format %4s [format %#o $dvalue]], decimal [format %3s $dvalue], hexadecimal [format %x $dvalue])" puts -nonewline $fd $result incr seqsize } { if {$seqsize==0} { puts "You only typed Enter. $outfile is empty." set seqsize 0 } if {![catch {eof $fd}]} { close $fd puts "\n$outfile created.\n-+----\n$prompt" set showheader 1 } } exp_continue } } Example output (I typed PageUp): # ./keyseqs.exp Type any characters followed by , wait for 10 seconds or press Ctrl-C The resulting character sequence will be written to ./keyseq.dat Type here: ^[[5~ What you have just entered I can see as the following byte sequence: 'Esc' (ASCII octal 033, decimal 27, hexadecimal 1b) '[' (ASCII octal 0133, decimal 91, hexadecimal 5b) '5' (ASCII octal 065, decimal 53, hexadecimal 35) '~' (ASCII octal 0176, decimal 126, hexadecimal 7e) ./keyseq.dat created. -+---- Type any characters followed by , wait for 10 seconds or press Ctrl-C The resulting character sequence will be written to ./keyseq.dat Type here: # ---- [LV] says: "Believe it or not, there is no set standard for what function keys generate. In fact, depending on the application, the same function key could generate different values [[for different applications] on some systems." ---- [[ [Category Expect] | [Category Characters] ]]