Go to the first, previous, next, last section, table of contents.

矢印キーが働くようにするには, どうしたらいいですか?

Emacs は起動時には矢印キーは一切関知しません (X 上で起動しているときは別です. 質問 53 参照). 起動時の初期化のプロセスで, 端末に特有の初期化ファイルをロードします (環境変数 TERM からどの初期化ファイルをロードするかが決められ, そのファイルが存在したらロードします). この初期化ファイルが矢印キーを有効にします.

働かない理由にはいくつか考えられます:

  1. 端末の初期化ファイルが存在しない.
      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 を再起動する必要があります.
    

端末の初期化ファイルがある場合も次の二つの場合は問題が残ります.

  1. 端末の矢印キーがコントロール文字を生成する場合. Emacs は C-^ と C-\ 以外のコントロール文字にはすべてコマンドを バインドしているので, この場合はあきらめるしかないでしょう. 頑張ればバインディングをうまく調整して変更できるかもしれませんが.
  2. 端末の矢印キーが "ESC [" で始まる文字列を生成する場合. ANSI 規格ではこの文字列が採用されているにも関わらず, Emacs と一緒に配布されているどの端末設定ファイルも デフォルトでこの文字列にコマンドをバインドしていません. (ファンクション・キーが "ESC [" という文字列で始まる文字列を 生成する場合も同様です.) これは M-[ を backward-paragraph コマンドにバインドすることが より重要であると考えられていたからでしょう. これは Emacs 19 版では改善されるようです. いくつかの端末設定ファイルでは `enable-arrow-keys' というコマンドが 定義されていて, この問題に対応することができます. .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 で述べたようにします.

Go to the first, previous, next, last section, table of contents.