Os terminais só entendem caracteres, não chaves, portanto, chaves que não são caracteres imprimíveis são codificadas como caracteres de controle ou sequências de escape.
Terminais diferentes enviam diferentes seqüências de escape para algumas chaves. Felizmente, não há conflitos em terminais comuns: você pode declarar as seqüências de escape sem se preocupar com qual terminal você está.
Use C-c h
ou C-q
seguido pela tecla de função para ver qual sequência de escape ele envia.
(define-key input-decode-map "\eOA" [up])
(define-key input-decode-map "\eOB" [down])
(define-key input-decode-map "\eOC" [left])
(define-key input-decode-map "\eOD" [right])
(define-key input-decode-map "\e[A" [up])
(define-key input-decode-map "\e[B" [down])
(define-key input-decode-map "\e[C" [left])
(define-key input-decode-map "\e[D" [right])