============================================== 1999.10.18 発行 =========
         極私的 Emacs カスタマイズ紹介マガヂン
            Emacs をわたし色に染めて♪
------------------------------------------------------------------------
                         第 14 回 キー操作集大成
                〜コンソールからファンクションキーを使う〜
------------------------------------------------------------------------
※あなたのカスタマイズをぜひ教えてください。一般的なものから、他の人は
 絶対にしないような「外道」なものまで、何でも結構です。

※解除の方法は、このメールの末尾をごらんください。
========================================================================

	こんにちは。でるもんた・いいじまです。

	「週刊」のつもりが、気づいたら隔週になっていました。

	来週からはきちんと週刊になる予定です(学校がはじまって、
	月曜日にまとまった時間がとれるようになったので)ので
	よろしくお願いします。

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

☆今回のお題☆

	今回は、第 11 回でやり残したカーソルキーとファンクションキーの
	問題、また f10 キーをより ATOK 的にする方法などについて説明します。

	┌───────注意────────────────────────┐
	│以下には Wnn 関係の設定方法が書かれていますが、この方法は、そのま │
	│までは Emacs 20.x 以降や XEmacs では使えません。Emacs 20.x 以降や │
	│XEmacs をご利用の場合は、第24回・第25回をあわせてお読み下さい。   │
	└─────────────────────────────────┘

-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
☆ファンクションキー・カーソルキーの問題☆

	まずは、コンソールで日本語入力をするとファンクションキー・カー
	ソルキーが使えない問題からいきましょう。

◇そもそも、カーソルキー・ファンクションキーって?

	第 2 回「デリイトキイは BS にあらず」でお話ししたように、
	X 上では、アプリケーションは「どのキーが押されたのか」を
	知ることができます。コンソールではそれはできず、キャラクタ
	コードだけがわかります。

	さて、今まで扱ってきたキー、たとえば Esc、Tab、Delete などには、
	そのキーに対応するキャラクタコードがありました。Esc は \x1B
	(\033)、Tab は \x09(\011)、Delete は \x7F(\177)です。

	【補足】\ の後に数字を並べるのは 8 進方式、\x を使うのは 16 進
		方式です。Emacs ではどちらも使えます。

	一方で、ファンクションキーやカーソルキーには、それに対応する
	キャラクタコードがありません。そこで、コンソール上では、カーソル
	キーを押したときに、特定の文字列をアプリケーションに伝えるという
	方法をとっています。

	たとえば、私の手元の環境(SPARC 版 Solaris 2.6+kterm)では、
	上カーソルキーが押されたときには「ESC [ A」の 3 文字が、
	F1 キーが押されたときには「ESC [ 1 1 ~」の 5 文字が押されたと
	いう情報がアプリにいくようになっています。

	ためしに、コンソール上で Emacs を起動して(mule -nw)、ESC [ 1 1 ~
	と入力すると、たしかに f1 として扱われていることがわかると思います。

	なお、これは UNIX では、
		% cat
	として、その状態でカーソルキーなどを押してみると、どのキーがどの
	文字列なのかがわかります。

	【蛇足】私の環境の場合、上記の cat を使う方法ではカーソルキーは
		「ESC [ A」のようになるのですが、Emacs 上ではなぜか
		「ESC O A」になってしまいます。

◇function-key-map

	さて、このような事情を考慮して、Emacs では function-key-map と
	いうものを用意しています。これは、「特定の文字列が入力されたら、
	ファンクションキーなどが押されたものとして扱ってください」という
	設定をするためのもので、たとえば次のように書かれています。

		(define-key function-key-map "\e[11~" [f1])
		(define-key function-key-map "\e[12~" [f2])

	このために、ESC [ 1 1 ~ が押されたら、最初から F1 が押されたもの
	として取り扱われるのです。

	なお、この設定は、/usr/local/share/emacs/19.34/lisp/term/vt100.el
	などから呼び出される /usr/…/term/lk201.el に書かれています。

	なお、この function-key-map は、当然ながら自分で書き換える/追記
	することもできます。コンソール上でファンクションキーやカーソル
	キーが(日本語入力状態以外でも)使えない場合は、.emacs に自分で
	この設定をすることになります。

	たとえば、手元の環境では、コンソール上の Emacs ではなぜか、
	f10 キーを押すと f0 キーと見なされるので、それを訂正するには
		(define-key function-key-map "\e[21~" [f10])
	とします。

	【後日注】このように function-key-map を書き換える方法の場合、
	     単に .emacs に書く方法では、追記はできても、デフォルトで
	     設定されているものを変更することはできません。これは、
	     デフォルトのキー設定が、.emacs を読み込むよりも後で行わ
	     れるためです。

	     デフォルトで設定されているものを書き換えるには、
	     	(add-hook 'term-setup-hook '(lambda ()
	     		(define-key function-key-map "\e[21~" [f10])
	     		(define-key function-key-map "\e[12~" [f2])
	     	))
	     のように、add-hook 文を使ってください。詳細は第 26 回で。

◇local keymap との関係

	ところが、Wnn での日本語入力中はこの機能がききません。
	それはなぜかというと、/usr/…/lisp/egg.el で、

		(define-key fence-mode-esc-map "O" 'undefined)
		(define-key fence-mode-esc-map "[" 'undefined)

	という設定がされていて、function-key-map の設定よりもこちらが
	優先されるからです。

	これは「fence mode で ESC [ や ESC O を入力したら、undefined と
	いうコマンドを実行しなさい」という意味になります。当然そんな
	名前のコマンドはないので、ピッという音が鳴って、あとは何も
	起こりません。henkan mode(漢字に変換した後の、[漢] と出ている
	状態)でも同様の設定が行われています。

	【蛇足】実際には、上の define-key 文が直接書かれているわけでは
		なく、

		(let ((ch 0))
		(while (<= ch 127)
		 (define-key fence-mode-map     (char-to-string ch) 'undefined)
		 (define-key fence-mode-esc-map (char-to-string ch) 'undefined)
		 (setq ch (1+ ch))
		))

		と書かれており、そのあとで、意味のあるキーだけ再定義して
		います。これはおそらく、余計なコマンドを入力して変なことが
		起こるのを防止するためなのでしょう。

◇対策

	対策はただひとつ、ESC O と ESC [ の定義を外してしまうことです。
	キーの定義を外すには、'undefined ではなく nil を指定します。
	というわけで、.emacs に次のように書きます。

		(define-key fence-mode-map "\eO" nil)
		(define-key fence-mode-map "\e[" nil)
		(define-key henkan-mode-map "\eO" nil)
		(define-key henkan-mode-map "\e[" nil)

	これでめでたくカーソルキー・ファンクションキーが使えるように
	なりました。

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
☆f10 をより ATOK 的に☆

	ATOK では、f10 キーは、日本語入力オンの状態でだけ入力文字種の
	切り替えになりますが、第 11 回で設定した
		(global-set-key [f10] 'special-symbol-input)
	では、日本語入力中でなくてもその機能が働いてしまいます。

	もともとは f10 には、メニューバーにある項目をキーボードで選択する
	ための tmm-menubar コマンドがあるので、できればこれと両用したい
	ものです。

	そこで、次のようにしました。[あ] の状態と [--] の状態とは変数
	egg:*input-mode* で区別できるので、それを使いました。

	(defun tmm-menubar-or-special-symbol-input ()
		(interactive)
		(if egg:*input-mode*
			(special-symbol-input)
			(tmm-menubar)
		)
	)

	(global-set-key [f10] 'tmm-menubar-or-special-symbol-input)

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
☆色々なモードでのキー設定☆

	さて、今までは、基本的には「普通の文字入力状態」でのキーについて
	お話ししてきましたが、Emacs にはそれ以外に色々なモードがあります。
	たとえば、ディレクトリのファイル一覧を表示してその編集をする
	dired モードや、メールの読み書きのためのモードなどがあります。

	私の場合、.emacs に次のように書き加えています。

	(add-hook 'dired-mode-hook '(lambda()
		(define-key dired-mode-map "\C-h" 'kill-buffer)
	))
	(add-hook 'mh-letter-mode-hook '(lambda()
		(define-key mh-letter-mode-map "\C-c" 'scroll-up)
		(define-key mh-letter-mode-map
			[menu-bar delmonta ds-mh-send-letter]
			'("MH Send Letter" . mh-send-letter)
		)
	))

	add-hook、lambda については前回説明した通りですが、もし文法的な
	ことよくわからなれければ、これをそのまま書き写してしまっても
	かまいません。

	なお、なぜ直接
		(define-key dired-mode-map "\C-h" 'kill-buffer)
	とせずにホックを使うのかというと、この dired-mode-map という
	マップは、dired.el を読み込むまでは存在しないからです。
	かといって dired は毎回使うものではないので、(require 'dired)
	とするのは時間の無駄になるケースが大半です。
	そこでホックを使いました。mh-letter-mode もほぼ同様の理由です。

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
☆あとがき☆

	まだまだ漏れている項目があるような気がするのですが
	…きっと気のせいでしょう(^^;)

	漏れに気がついたらまたそのときに紹介したいと思います。

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

☆次回予告☆

	次回は「第 15 回 便利なマクロ(3) HTML タグの入力と外道な数式」
	の予定です。

	私はあるとき、数式を HTML で入力するという暴挙にでました。つまり、
		<i>x</i><sup>2</sup> + <i>y</i><sup>2</sup>
					= <i>z</i><sup>2</sup>
	といった形で延々とタグを書き並べるということをしました。

	でも、さすがにこれをすべて手で入力するのは非人間的なので、
	何とか楽をできないか、と考えてつくったマクロがあります。
	次回はそれのご紹介です。何故かかる暴挙に出たのかについても、
	与太話としてお話ししたいと思います。

	なお、今の時点で読みたいという方はこちらへ↓
		http://user.ecc.u-tokyo.ac.jp/~l94102/alte/
	ブラウザだとまともに読めますが、ソースの可読性はゼロです。

	【後日注】このページは引っ越しました。
		http://www.ht.sakura.ne.jp/~delmonta/alte/ へどうぞ。

	それではまた♪

========================================================================
極私的 Emacs カスタマイズ紹介マガジン Emacs をわたし色に染めて♪

☆発行人☆

        でるもんた・いいじま <L94102@mail.ecc.u-tokyo.ac.jp>
                        http://user.ecc.u-tokyo.ac.jp/~l94102/emacs/

                ※このメールマガジンで取り上げてほしいテーマ、ご意見など
                 ありましたら、上のメールアドレスまでお気軽にどうぞ。

☆配信☆
        このメールマガジンは、「インターネットの本屋さん・まぐまぐ」を
        利用して配信しています。
                http://www.mag2.com     (マガジン ID=0000013484)

☆バックナンバー・登録解除・メールアドレス変更は☆

        上記のホームページまでどうぞ。
        なお、手動での登録解除は行っておりませんのでご了承下さい。
=========================================================================

Copyright © IIJIMA Hiromitsu aka Delmonta, 2016/03/10 15:09 JST
これは「古文書」です。 古くなった情報も原則未修正で保存していますのでご注意ください。

古文書本館トップ | 電脳外道学会