|  | #!/bin/sh | 
|  |  | 
|  | PATH=/bin:/usr/bin | 
|  | TERM=screen | 
|  |  | 
|  | [ -z "$TEST_TMUX" ] && TEST_TMUX=$(readlink -f ../tmux) | 
|  | TMUX="$TEST_TMUX -Ltest" | 
|  | $TMUX kill-server 2>/dev/null | 
|  |  | 
|  | $TMUX -f/dev/null new -x20 -y2 -d || exit 1 | 
|  |  | 
|  | sleep 0.1 | 
|  |  | 
|  | exit_status=0 | 
|  |  | 
|  | assert_key () { | 
|  | key=$1 | 
|  | expected_code=$2 | 
|  |  | 
|  | $TMUX new-window -- sh -c 'stty raw -echo && cat -tv' | 
|  | $TMUX send-keys "$key" $ | 
|  |  | 
|  | actual_code=$($TMUX capturep -p | head -1 | sed -e 's/\$$//') | 
|  | $TMUX kill-window | 
|  |  | 
|  | if [ "$actual_code" = "$expected_code" ]; then | 
|  | if [ -n "$VERBOSE" ]; then | 
|  | echo "[PASS] $key -> $actual_code" | 
|  | fi | 
|  | else | 
|  | echo "[FAIL] $key -> $expected_code (Got: $actual_code)" | 
|  | exit_status=1 | 
|  | fi | 
|  |  | 
|  | shift | 
|  | shift | 
|  |  | 
|  | if [ "$1" = "--" ]; then | 
|  | shift | 
|  | assert_key "$@" | 
|  | fi | 
|  | } | 
|  |  | 
|  | assert_key 'C-Space' '^@' | 
|  | assert_key 'C-a' '^A'	 -- 'M-C-a' '^[^A' | 
|  | assert_key 'C-b' '^B'	 -- 'M-C-b' '^[^B' | 
|  | assert_key 'C-c' '^C'	 -- 'M-C-c' '^[^C' | 
|  | assert_key 'C-d' '^D'	 -- 'M-C-d' '^[^D' | 
|  | assert_key 'C-e' '^E'	 -- 'M-C-e' '^[^E' | 
|  | assert_key 'C-f' '^F'	 -- 'M-C-f' '^[^F' | 
|  | assert_key 'C-g' '^G'	 -- 'M-C-g' '^[^G' | 
|  | assert_key 'C-h' '^H'	 -- 'M-C-h' '^[^H' | 
|  | assert_key 'C-i' '^I'	 -- 'M-C-i' '^[^I' | 
|  | assert_key 'C-j' ''	 -- 'M-C-j' '^[' # NL | 
|  | assert_key 'C-k' '^K'	 -- 'M-C-k' '^[^K' | 
|  | assert_key 'C-l' '^L'	 -- 'M-C-l' '^[^L' | 
|  | assert_key 'C-m' '^M'	 -- 'M-C-m' '^[^M' | 
|  | assert_key 'C-n' '^N'	 -- 'M-C-n' '^[^N' | 
|  | assert_key 'C-o' '^O'	 -- 'M-C-o' '^[^O' | 
|  | assert_key 'C-p' '^P'	 -- 'M-C-p' '^[^P' | 
|  | assert_key 'C-q' '^Q'	 -- 'M-C-q' '^[^Q' | 
|  | assert_key 'C-r' '^R'	 -- 'M-C-r' '^[^R' | 
|  | assert_key 'C-s' '^S'	 -- 'M-C-s' '^[^S' | 
|  | assert_key 'C-t' '^T'	 -- 'M-C-t' '^[^T' | 
|  | assert_key 'C-u' '^U'	 -- 'M-C-u' '^[^U' | 
|  | assert_key 'C-v' '^V'	 -- 'M-C-v' '^[^V' | 
|  | assert_key 'C-w' '^W'	 -- 'M-C-w' '^[^W' | 
|  | assert_key 'C-x' '^X'	 -- 'M-C-x' '^[^X' | 
|  | assert_key 'C-y' '^Y'	 -- 'M-C-y' '^[^Y' | 
|  | assert_key 'C-z' '^Z'	 -- 'M-C-z' '^[^Z' | 
|  | assert_key 'Escape' '^[' -- 'M-Escape' '^[^[' | 
|  | assert_key "C-\\" "^\\"	 -- "M-C-\\" "^[^\\" | 
|  | assert_key 'C-]' '^]'	 -- 'M-C-]' '^[^]' | 
|  | assert_key 'C-^' '^^'	 -- 'M-C-^' '^[^^' | 
|  | assert_key 'C-_' '^_'	 -- 'M-C-_' '^[^_' | 
|  | assert_key 'Space' ' '	 -- 'M-Space' '^[ ' | 
|  | assert_key '!' '!'	 -- 'M-!' '^[!' | 
|  | assert_key '"' '"'	 -- 'M-"' '^["' | 
|  | assert_key '#' '#'	 -- 'M-#' '^[#' | 
|  | assert_key '$' '$'	 -- 'M-$' '^[$' | 
|  | assert_key '%' '%'	 -- 'M-%' '^[%' | 
|  | assert_key '&' '&'	 -- 'M-&' '^[&' | 
|  | assert_key "'" "'"	 -- "M-'" "^['" | 
|  | assert_key '(' '('	 -- 'M-(' '^[(' | 
|  | assert_key ')' ')'	 -- 'M-)' '^[)' | 
|  | assert_key '*' '*'	 -- 'M-*' '^[*' | 
|  | assert_key '+' '+'	 -- 'M-+' '^[+' | 
|  | assert_key ',' ','	 -- 'M-,' '^[,' | 
|  | assert_key '-' '-'	 -- 'M--' '^[-' | 
|  | assert_key '.' '.'	 -- 'M-.' '^[.' | 
|  | assert_key '/' '/'	 -- 'M-/' '^[/' | 
|  | assert_key '0' '0'	 -- 'M-0' '^[0' | 
|  | assert_key '1' '1'	 -- 'M-1' '^[1' | 
|  | assert_key '2' '2'	 -- 'M-2' '^[2' | 
|  | assert_key '3' '3'	 -- 'M-3' '^[3' | 
|  | assert_key '4' '4'	 -- 'M-4' '^[4' | 
|  | assert_key '5' '5'	 -- 'M-5' '^[5' | 
|  | assert_key '6' '6'	 -- 'M-6' '^[6' | 
|  | assert_key '7' '7'	 -- 'M-7' '^[7' | 
|  | assert_key '8' '8'	 -- 'M-8' '^[8' | 
|  | assert_key '9' '9'	 -- 'M-9' '^[9' | 
|  | assert_key ':' ':'	 -- 'M-:' '^[:' | 
|  | assert_key '\;' ';'	 -- 'M-\;' '^[;' | 
|  | assert_key '<' '<'	 -- 'M-<' '^[<' | 
|  | assert_key '=' '='	 -- 'M-=' '^[=' | 
|  | assert_key '>' '>'	 -- 'M->' '^[>' | 
|  | assert_key '?' '?'	 -- 'M-?' '^[?' | 
|  | assert_key '@' '@'	 -- 'M-@' '^[@' | 
|  | assert_key 'A' 'A'	 -- 'M-A' '^[A' | 
|  | assert_key 'B' 'B'	 -- 'M-B' '^[B' | 
|  | assert_key 'C' 'C'	 -- 'M-C' '^[C' | 
|  | assert_key 'D' 'D'	 -- 'M-D' '^[D' | 
|  | assert_key 'E' 'E'	 -- 'M-E' '^[E' | 
|  | assert_key 'F' 'F'	 -- 'M-F' '^[F' | 
|  | assert_key 'G' 'G'	 -- 'M-G' '^[G' | 
|  | assert_key 'H' 'H'	 -- 'M-H' '^[H' | 
|  | assert_key 'I' 'I'	 -- 'M-I' '^[I' | 
|  | assert_key 'J' 'J'	 -- 'M-J' '^[J' | 
|  | assert_key 'K' 'K'	 -- 'M-K' '^[K' | 
|  | assert_key 'L' 'L'	 -- 'M-L' '^[L' | 
|  | assert_key 'M' 'M'	 -- 'M-M' '^[M' | 
|  | assert_key 'N' 'N'	 -- 'M-N' '^[N' | 
|  | assert_key 'O' 'O'	 -- 'M-O' '^[O' | 
|  | assert_key 'P' 'P'	 -- 'M-P' '^[P' | 
|  | assert_key 'Q' 'Q'	 -- 'M-Q' '^[Q' | 
|  | assert_key 'R' 'R'	 -- 'M-R' '^[R' | 
|  | assert_key 'S' 'S'	 -- 'M-S' '^[S' | 
|  | assert_key 'T' 'T'	 -- 'M-T' '^[T' | 
|  | assert_key 'U' 'U'	 -- 'M-U' '^[U' | 
|  | assert_key 'V' 'V'	 -- 'M-V' '^[V' | 
|  | assert_key 'W' 'W'	 -- 'M-W' '^[W' | 
|  | assert_key 'X' 'X'	 -- 'M-X' '^[X' | 
|  | assert_key 'Y' 'Y'	 -- 'M-Y' '^[Y' | 
|  | assert_key 'Z' 'Z'	 -- 'M-Z' '^[Z' | 
|  | assert_key '[' '['	 -- 'M-[' '^[[' | 
|  | assert_key "\\" "\\"	 -- "M-\\" "^[\\" | 
|  | assert_key ']' ']'	 -- 'M-]' '^[]' | 
|  | assert_key '^' '^'	 -- 'M-^' '^[^' | 
|  | assert_key '_' '_'	 -- 'M-_' '^[_' | 
|  | assert_key '`' '`'	 -- 'M-`' '^[`' | 
|  | assert_key 'a' 'a'	 -- 'M-a' '^[a' | 
|  | assert_key 'b' 'b'	 -- 'M-b' '^[b' | 
|  | assert_key 'c' 'c'	 -- 'M-c' '^[c' | 
|  | assert_key 'd' 'd'	 -- 'M-d' '^[d' | 
|  | assert_key 'e' 'e'	 -- 'M-e' '^[e' | 
|  | assert_key 'f' 'f'	 -- 'M-f' '^[f' | 
|  | assert_key 'g' 'g'	 -- 'M-g' '^[g' | 
|  | assert_key 'h' 'h'	 -- 'M-h' '^[h' | 
|  | assert_key 'i' 'i'	 -- 'M-i' '^[i' | 
|  | assert_key 'j' 'j'	 -- 'M-j' '^[j' | 
|  | assert_key 'k' 'k'	 -- 'M-k' '^[k' | 
|  | assert_key 'l' 'l'	 -- 'M-l' '^[l' | 
|  | assert_key 'm' 'm'	 -- 'M-m' '^[m' | 
|  | assert_key 'n' 'n'	 -- 'M-n' '^[n' | 
|  | assert_key 'o' 'o'	 -- 'M-o' '^[o' | 
|  | assert_key 'p' 'p'	 -- 'M-p' '^[p' | 
|  | assert_key 'q' 'q'	 -- 'M-q' '^[q' | 
|  | assert_key 'r' 'r'	 -- 'M-r' '^[r' | 
|  | assert_key 's' 's'	 -- 'M-s' '^[s' | 
|  | assert_key 't' 't'	 -- 'M-t' '^[t' | 
|  | assert_key 'u' 'u'	 -- 'M-u' '^[u' | 
|  | assert_key 'v' 'v'	 -- 'M-v' '^[v' | 
|  | assert_key 'w' 'w'	 -- 'M-w' '^[w' | 
|  | assert_key 'x' 'x'	 -- 'M-x' '^[x' | 
|  | assert_key 'y' 'y'	 -- 'M-y' '^[y' | 
|  | assert_key 'z' 'z'	 -- 'M-z' '^[z' | 
|  | assert_key '{' '{'	 -- 'M-{' '^[{' | 
|  | assert_key '|' '|'	 -- 'M-|' '^[|' | 
|  | assert_key '}' '}'	 -- 'M-}' '^[}' | 
|  | assert_key '~' '~'	 -- 'M-~' '^[~' | 
|  |  | 
|  | assert_key 'Tab' '^I'    -- 'M-Tab' '^[^I' | 
|  | assert_key 'BSpace' '^?' -- 'M-BSpace' '^[^?' | 
|  |  | 
|  | ## These cannot be sent, is that intentional? | 
|  | ## assert_key 'PasteStart' "^[[200~" | 
|  | ## assert_key 'PasteEnd' "^[[201~" | 
|  |  | 
|  | assert_key 'F1' "^[OP" | 
|  | assert_key 'F2' "^[OQ" | 
|  | assert_key 'F3' "^[OR" | 
|  | assert_key 'F4' "^[OS" | 
|  | assert_key 'F5' "^[[15~" | 
|  | assert_key 'F6' "^[[17~" | 
|  | assert_key 'F8' "^[[19~" | 
|  | assert_key 'F9' "^[[20~" | 
|  | assert_key 'F10' "^[[21~" | 
|  | assert_key 'F11' "^[[23~" | 
|  | assert_key 'F12' "^[[24~" | 
|  |  | 
|  | assert_key 'IC' '^[[2~' | 
|  | assert_key 'Insert' '^[[2~' | 
|  | assert_key 'DC' '^[[3~' | 
|  | assert_key 'Delete' '^[[3~' | 
|  |  | 
|  | ## Why do these differ from tty-keys? | 
|  | assert_key 'Home' '^[[1~' | 
|  | assert_key 'End' '^[[4~' | 
|  |  | 
|  | assert_key 'NPage' '^[[6~' | 
|  | assert_key 'PageDown' '^[[6~' | 
|  | assert_key 'PgDn' '^[[6~' | 
|  | assert_key 'PPage' '^[[5~' | 
|  | assert_key 'PageUp' '^[[5~' | 
|  | assert_key 'PgUp' '^[[5~' | 
|  |  | 
|  | assert_key 'BTab' '^[[Z' | 
|  | assert_key 'C-S-Tab' '^[[Z' | 
|  |  | 
|  | assert_key 'Up' '^[[A' | 
|  | assert_key 'Down' '^[[B' | 
|  | assert_key 'Right' '^[[C' | 
|  | assert_key 'Left' '^[[D' | 
|  |  | 
|  | # assert_key 'KPEnter' | 
|  | assert_key 'KP*' '*' -- 'M-KP*' '^[*' | 
|  | assert_key 'KP+' '+' -- 'M-KP+' '^[+' | 
|  | assert_key 'KP-' '-' -- 'M-KP-' '^[-' | 
|  | assert_key 'KP.' '.' -- 'M-KP.' '^[.' | 
|  | assert_key 'KP/' '/' -- 'M-KP/' '^[/' | 
|  | assert_key 'KP0' '0' -- 'M-KP0' '^[0' | 
|  | assert_key 'KP1' '1' -- 'M-KP1' '^[1' | 
|  | assert_key 'KP2' '2' -- 'M-KP2' '^[2' | 
|  | assert_key 'KP3' '3' -- 'M-KP3' '^[3' | 
|  | assert_key 'KP4' '4' -- 'M-KP4' '^[4' | 
|  | assert_key 'KP5' '5' -- 'M-KP5' '^[5' | 
|  | assert_key 'KP6' '6' -- 'M-KP6' '^[6' | 
|  | assert_key 'KP7' '7' -- 'M-KP7' '^[7' | 
|  | assert_key 'KP8' '8' -- 'M-KP8' '^[8' | 
|  | assert_key 'KP9' '9' -- 'M-KP9' '^[9' | 
|  |  | 
|  | # Extended keys | 
|  | $TMUX set -g extended-keys always | 
|  |  | 
|  | assert_extended_key () { | 
|  | extended_key=$1 | 
|  | expected_code_pattern=$2 | 
|  |  | 
|  | expected_code=$(printf '%s' "$expected_code_pattern" | sed -e 's/;_/;2/') | 
|  | assert_key "S-$extended_key" "$expected_code" | 
|  |  | 
|  | expected_code=$(printf '%s' "$expected_code_pattern" | sed -e 's/;_/;3/') | 
|  | assert_key "M-$extended_key" "$expected_code" | 
|  |  | 
|  | expected_code=$(printf '%s' "$expected_code_pattern" | sed -e 's/;_/;4/') | 
|  | assert_key "S-M-$extended_key" "$expected_code" | 
|  |  | 
|  | expected_code=$(printf '%s' "$expected_code_pattern" | sed -e 's/;_/;5/') | 
|  | assert_key "C-$extended_key" "$expected_code" | 
|  |  | 
|  | expected_code=$(printf '%s' "$expected_code_pattern" | sed -e 's/;_/;6/') | 
|  | assert_key "S-C-$extended_key" "$expected_code" | 
|  |  | 
|  | expected_code=$(printf '%s' "$expected_code_pattern" | sed -e 's/;_/;7/') | 
|  | assert_key "C-M-$extended_key" "$expected_code" | 
|  |  | 
|  | expected_code=$(printf '%s' "$expected_code_pattern" | sed -e 's/;_/;8/') | 
|  | assert_key "S-C-M-$extended_key" "$expected_code" | 
|  | } | 
|  |  | 
|  | ## Many of these pass without extended keys enabled -- are they extended keys? | 
|  | assert_extended_key 'F1' '^[[1;_P' | 
|  | assert_extended_key 'F2' "^[[1;_Q" | 
|  | assert_extended_key 'F3' "^[[1;_R" | 
|  | assert_extended_key 'F4' "^[[1;_S" | 
|  | assert_extended_key 'F5' "^[[15;_~" | 
|  | assert_extended_key 'F6' "^[[17;_~" | 
|  | assert_extended_key 'F8' "^[[19;_~" | 
|  | assert_extended_key 'F9' "^[[20;_~" | 
|  | assert_extended_key 'F10' "^[[21;_~" | 
|  | assert_extended_key 'F11' "^[[23;_~" | 
|  | assert_extended_key 'F12' "^[[24;_~" | 
|  |  | 
|  | assert_extended_key 'Up' '^[[1;_A' | 
|  | assert_extended_key 'Down' '^[[1;_B' | 
|  | assert_extended_key 'Right' '^[[1;_C' | 
|  | assert_extended_key 'Left' '^[[1;_D' | 
|  |  | 
|  | assert_extended_key 'Home' '^[[1;_H' | 
|  | assert_extended_key 'End' '^[[1;_F' | 
|  |  | 
|  | assert_extended_key 'PPage' '^[[5;_~' | 
|  | assert_extended_key 'PageUp' '^[[5;_~' | 
|  | assert_extended_key 'PgUp' '^[[5;_~' | 
|  | assert_extended_key 'NPage' '^[[6;_~' | 
|  | assert_extended_key 'PageDown' '^[[6;_~' | 
|  | assert_extended_key 'PgDn' '^[[6;_~' | 
|  |  | 
|  | assert_extended_key 'IC' '^[[2;_~' | 
|  | assert_extended_key 'Insert' '^[[2;_~' | 
|  | assert_extended_key 'DC' '^[[3;_~' | 
|  | assert_extended_key 'Delete' '^[[3;_~' | 
|  |  | 
|  | assert_key 'C-Tab' "^[[9;5u" | 
|  | assert_key 'C-S-Tab' "^[[1;5Z" | 
|  |  | 
|  | $TMUX kill-server 2>/dev/null | 
|  |  | 
|  | exit $exit_status |