Emacs は起動時には矢印キーは一切関知しません (X 上で起動しているときは別です. 質問 53 参照). 起動時の初期化のプロセスで, 端末に特有の初期化ファイルをロードします (環境変数 TERM からどの初期化ファイルをロードするかが決められ, そのファイルが存在したらロードします). この初期化ファイルが矢印キーを有効にします.
働かない理由にはいくつか考えられます:
lisp/term ディレクトリを捜してください. 環境変数 TERM に設定されている端末タイプが xxx-yy-z とすると, Emacs は lisp/term ディレクトリから xxx-yy-z.el, xxx-yy.el そして xxx.el という順で初期化ファイルを捜し, 最初に見つかったものをロードします.
もしいずれもなかったら, 誰かに頼んであなたの端末の初期化ファイルを作ってもらうか, 自分の .emacs で解決してみましょう. 例えば, あなたの端末の矢印キーが次のような文字列を生成するとします:
Up: ESC [ A Down: ESC [ B Right: ESC [ C Left: ESC [ D
このとき次のように .emacs で適当なコマンドをバインドできます:
(setq term-setup-hook (function (lambda () (cond ((string-match "\\`xyzzy" (or (getenv "TERM") "")) ;; First, must unmap the binding for M-[ (or (keymapp (lookup-key global-map "\e[")) (define-key global-map "\e[" nil)) ;; Enable terminal type xyzzy's arrow keys: (define-key global-map "\e[A" 'previous-line) (define-key global-map "\e[B" 'next-line) (define-key global-map "\e[C" 'forward-char) (define-key global-map "\e[D" 'backward-char)) ((string-match "\\`abcde" (or (getenv "TERM") "")) ;; Do something different for terminal type abcde ;; ..... ))))))
`cond' の場合分けで別の端末を加えることもできます. 註: この設定を有効にするには Emacs を再起動する必要があります.
端末の初期化ファイルがある場合も次の二つの場合は問題が残ります.
(setq term-setup-hook (function (lambda () (if (fboundp 'enable-arrow-keys) (enable-arrow-keys)))))これを lips/default.el に書く場合は
;; don't override a user's term-setup-hook (or term-setup-hook (setq term-setup-hook (function (lambda () (and (fboundp 'enable-arrow-keys) ;; don't override a user key mapping (eq 'backward-paragraph (lookup-key esc-map "[")) (enable-arrow-keys))))))のようにして各ユーザの .emacs での設定を上書きしない配慮が必要です. 端末のタイプが `sun' のときは, .emacs に次のように書く必要があります (上に追加するか, または入れ換えます):
(setq sun-esc-bracket t)端末のタイプが `xterm' のときは, xterm.el は特に何もしていないのでこの解答の 1 で述べたようにします.