=============================================== 1999.5.24 発行 =========
         極私的 Emacs カスタマイズ紹介マガヂン
            Emacs をわたし色に染めて♪
------------------------------------------------------------------------
        第 2 回  デリイトキイは BS にあらず
------------------------------------------------------------------------
※あなたのカスタマイズをぜひ教えてください。一般的なものから、他の人は
 絶対にしないような「外道」なものまで、何でも結構です。

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

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

☆読者の質問より☆

	 前回のアンケートには、たくさんの方々から回答をいただき
	ありがとうございました。

	 ということで、今日はまず、寄せられた質問の中から、
	現時点で回答可能なものについて回答したいと思います。

	●Mac ユーザーなんですけど、VZ って何ですか?

		 VZ というのは、MS-DOS の世界で有名だったテキストエディ
		タです。元はフリーソフトでしたが、のちには商用製品として
		(株)ビレッジセンターから発売されるようになりました。
		 フルアセンブラのため軽快、全ソース公開のため改造自由、
		完全キーカスタマイズやマクロ機能などで、DOS のパワーユー
		ザーの間にはかなりの人気がありました。基本的には対応機種
		は PC-98x1 および AT 互換機ですが、富士通 FMR/FM TOWNS
		用のパッチがあって、私はそれを利用して FM TOWNS で使用
		していました。
		 なお、現在、(株)ビレッジセンターからは、Windows 用の
		「WZ エディタ」が発売されています。

	●.mule と .emacs の違いは?

		設定ファイルの ~/.emacs と ~/.mule のことでしょうか?

		手元で調べてみたところ、どうやら私の環境(SunOS 5.6、
		Mule 2.3/emacs 19.34.1)では ~/.mule というファイルは
		読まないようです。

	●いいじまさんは、Ctrl キーは小指の先で押しますか、それとも、
	 手のひらの小指の根元のところで押しますか?

		え〜、私は薬指の先で押します(^^;)
		実家のワープロ専用機から数えて私のコンピュータ歴は
		10 年近くになりますが、タッチタイピングはできないです。
		まわりからは、「6 本指でよくそんなに速く打てるなぁ」と
		あきれられてをります。

		ちなみに、Ctrl キーは A の左隣にあるのが私の好みです。
		家の AT 互換機では、Keylay for Windows98 というソフトを
		使って、Caps Lock キーに Ctrl の機能を割り当ててゐます。

		#X Window System での Ctrl キーの移動は、本来は Emacs
		#の範疇ではないのですが、あとで特集を組もうと思ひます。

	●Mule for Windows の特集を組んでほしい。

		これについては、知り合いの Emacs hacker に出演交渉をして
		おります。
		運がよければ、彼に代講をお願いできるかもしれません。

	●ひとつの ~/.emacs で、NEmacs と Mule で別々の設定をするには?

		if 文を使います。詳しくは本文で。

	●いいじまさんが参考にした資料などありましたら紹介してください。

		私の場合、大学の生協&図書館で、Emacs ないし Mule と
		名のつく本を片っ端から読みあさりました。
		「Emacs 入門」的な本には、簡単なカスタマイズの方法はだい
		たい書いてありますので、読んでおいて損はないと思います。

		そのあとは、基本的には
			○apropos で探す(apropos については、第 4 回で
			 とりあげる予定です)
			○FAQ(/usr/local/share/emacs/19.34/etc/ にある、
			 FAQ および FAQ-Mule.jp ファイル)で調べる
			○/usr/local/share/emacs/19.34/lisp/ のソース
			 を、grep をたよりにしてひたすら読む
		という方法で探してきました。Emacs Lisp のリファレンス
		マニュアル(後日紹介)も必要に応じて参照します。

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

☆本日のお題☆

	「デリイトキイは BS にあらず」

	 Emacs の初期状態では、DEL キーに「カーソルの手前の文字を消す」
	という操作が割り当てられています。これは、通常は
		BS キイに割り当てられてゐなければ《ならない》
	操作と私は考へます。たしかに、
		慣れてしまえば問題ない
	とおっしゃるかたもたくさんいらっしゃいますが、これだけで
		Emacs は肌に合はない
	といふ方もいらっしゃると思ひます。

	 では、いっぽう BS キーはどうかというと、なんとコンソール上と
	X 上で動作が違います。X 上ではきちんとバックスペースの用を為して
	くれますが、コンソール上では C-h と同一視されるので、なんと
	ヘルプ機能になってしまいます。

	 なぜこのような差があるのかというと、X 上では、
	「BS キーを押した」ということと「Ctrl を押しながら H を押した」
	ということは区別できますが、コンソール上の場合は、どちらも
	「キャラクターコード 8 番」だということしかわからないからです。

	【解説】X の機能を使えば、(もちろん、MS Windows や MacOS でも
	    同じことですが)“どのキーが押されたのか”がわかります。
	    たとえば、Netscape Messenger で、Shift+N を押すかわりに
	    Caps Lock をかけた状態で N を押しても Shift+N とは認識
	    されません。これは、Netscape が「N が押されているか」と
		「Shift が押されているか」を別々に検知できるからです。

	    一方、コンソール上(/dev/tty ファイルから読んでいる場合)
	    では、キャラクタコードしかわかりません。
		たとえば、FDclone 上でディレクトリを消す場合、Shift+D
		でも、Caps Lock をかけて D でもどちらでもかまわないのは、
	    どちらも“大文字の D”“キャラクタコード 68 番”という
	    点では同じだからです。

☆キー操作で設定を変えてみよう☆

	そこで、まずはキー操作で設定をいじってみましょう。
	以下の操作は *scartch*(モード行に Lisp Interaction とでている
	はずです)ではうまくいかないことがあるので、そういう場合は
	M-x fundamental-mode RET としてから設定してください。

	通常、キー割り当てを変えるには、global-set-key というコマンドを
	使います。たとえば、
		M-x global-set-key RET C-k forward-char RET
	とすると、C-k でカーソルが右に動くようになります。

	【補足】global があるからには local もあります。
	    local-set-key コマンドは次回に紹介します。

	さて、カーソル位置の文字を消すコマンドは、delete-char です。
	これは、M-x delete-char RET としてみればわかりますし、
	M-x describe-key RET(または、メニューバーの Help→Describe Key)
	で C-d に割り当てられているコマンドを調べることでもわかります。

	【補足】現時点では describe-key コマンドは C-h k で実行できます
	    が、今回はこれから C-h の機能を変更するので、C-h k は
	    使えなくなります。この対策は第 4 回で。

	そこで、次のように操作してみましょう。
		M-x global-set-key RET DEL delete-char RET

	このコマンドを入れると、たしかに DEL キーはカーソル位置の文字を
	消すようになりました。ところが、BS キーも、X 上の場合は DEL と
	同様にカーソル位置の文字を消すようになってしまいました。

	おや?と思って
		M-x describe-key RET BS
		M-x global-set-key RET BS
	のようにしてみると、なんと、BS キーは DEL と同じキーだと
	見なされています。

	【補足】コンソール上では、上の操作をしても、BS はあいかわらず
	    Help のままです。

☆バックスペイスはデリイトにあらず!☆

	ということで、しかたがないので文献調査です。
	まずは /usr/local/share/emacs/19.34/etc/FAQ-Mule.jp を覗いてみます。

	【解説】同じディレクトリの FAQ という英文は、オリジナルの GNU
	    Emacs 19.34 用のものです。FAQ-Mule.jp になければそちらを
	    調べてみるといいでしょう。

	そうすると、質問 D-6 に、ちょうど同じ内容が載っています。
	それによると、~/.emacs に
		(define-key function-key-map [backspace] [8])
		(put 'backspace 'ascii-character 8)
	と書けば、BS キーは X 上でもコンソール上と同じく C-h 扱いされる
	ようになるそうです。

	さて、この FAQ-Mule.jp の文書には、実際には次のように書かれて
	います。
		(if (eq window-system 'x)
		(progn
			(define-key function-key-map [backspace] [8])
			(put 'backspace 'ascii-character 8)
		))
	つまり、X 上で動いているときでなければこの部分は実行されない
	ようになっていますが、中の 2 行だけをコンソール上で実行しても
	エラーにはなりませんでした。

	まあ、特に害があるとも思えませんが、いちおう指示にしたがって
	if 文もつけておくことにしましょう。

	【補足】閉じ括弧の位置はどこでもかまいません。私は上のように
	    開き括弧と対応する位置に置くのが好みなのですが、Lisp
		プログラマは ...8))) のように最後にまとめて書いてしまう
	    ことが多いようです。

☆それではあらためて☆

	これで、BS キーは DEL キーと同一視されなくなりました。
	Emacs を再起動して、次のように操作しましょう。
		M-x global-set-key RET DEL delete-char RET
	こんどは、DEL キーはカーソル位置の文字を消すようになりましたし、
	BS は影響を受けないままです。

	さて、つづいて BS です。BS キーをコンソール上に合わせて C-h と
	同一視させるようにしたからには、C-h に割り当てられているコマン
	ドが Help のままでは困ります。

	そこで、
		M-x global-set-key RET BS
	と押してみると、もう一つのキー操作を求めています。

	それもそのはず、C-h は単独で押すキーではなく、次のキー操作と組み
	合わせてはじめて意味をなすキーだからです。
	したがって、これはもう ~/.emacs に書くしかありません。

	それから、これを書くと、もう C-h キーでヘルプは出なくなります。
	この対策は、第 4 回で紹介することにしたいと思いますので、
	それまではメニューバーからマウスで選ぶか、M-x describe-key
	のように指定するかしてください。

☆~/.emacs に書こう☆

	さて、それでは ~/.emacs に書き込みましょう。

	最終的に、~/.emacs には次のように書くことになります。

		(if (eq window-system 'x)
		(progn
			(define-key function-key-map [backspace] [8])
			(put 'backspace 'ascii-character 8)
		))

		(global-set-key "\C-h" 'backward-delete-char)
		(global-set-key "\177" 'delete-char)

	DEL キーは \177 と書きます。
	詳しい説明は省きますが、何のことかわからない人は、
	とりあえずそういうものだと思っていただいて結構だと思います。

	それから、コマンド名の頭にはアポストロフィ「'」があります。
	これは後日説明したいと思います。

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
☆後日注:最近の Emacs の場合 (1)☆

	最近の Emacs では、上記のように書いてもうまくいかない場合があり
	ます。

	まず、環境によっては、M-x describe-key RET BS で「DEL」と表示され、
	M-x describe-key RET DEL で「C-d」と表示される場合があります。

	この場合は、とりあえずそのまま BS キーを押すとカーソルの手前の文
	字が、DEL キーを押すとカーソル位置の文字が消えてくれます。もし、
	どうしても設定上の都合で、BS キーを押したときは C-h とみなして
	ほしい、という場合、また、C-d を DEL とは別の用途に使いたいという
	場合は、

		(if (fboundp 'normal-erase-is-backspace-mode)
			(normal-erase-is-backspace-mode 0)
		)

	と書いてください。ただし、これを書いても、さらに設定が必要になる
	場合もあります。詳細は第 27 回で。

☆後日注:最近の Emacs の場合 (2)☆

	あるいは、M-x describe-key RET BS でも M-x describe-key RET DEL
	でも「DEL」と表示されるけれども、~/.emacs で上に書いたような記載を
	しても効き目がない、という場合もあります。この場合は、上の例の
	if 文の代わりに、

		(add-hook 'term-setup-hook '(lambda ()
			(define-key function-key-map [backspace] [8])
			(put 'backspace 'ascii-character 8)
		))

	と書いてみてください。これについては第 26 回で。

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

☆発展編 if 文の使い方☆

	さて、今回は if 文がでてきました。
	この機会に、Emacs Lisp における if 文の使い方について
	説明したいと思います。

	if 文の一般形は、
		(if 条件式 甲 乙 丙 丁 ...)
	となります。そして、この if 文の動作は、
		○まず、条件式を評価する
		○条件式の値が nil でなければ、甲を評価する
		○条件式の値が nil ならば、乙、丙、丁…を評価する
	です。

	つまり、普通の C 言語などと同じ感覚で
		(if (eq window-system 'x)
			(define-key function-key-map [backspace] [8])
			(put 'backspace 'ascii-character 8)
		)
	と書くと、
		○X 上で動いている場合は、define-key 文を実行する
		○X 上でない(コンソール、MS Windows など)場合は、
		 put 文を実行する
	という意味になってしまいます。

	【補足】条件式の値が「数値のゼロ」になる場合も、条件式は真と
	    見なされます。数値がゼロかそうでないかを判別するには、
		条件式に (= 数値式 0) か (zerop 数値式) を指定します。

	そこで、progn という命令を使います。progn の使い方は
		(progn α β γ ...)
	で、「α、β、γ…を順に実行する」というだけの命令ですが、
	(progn ....) で囲んだ部分全体が一つの式と見なされるので、
	それを if 文に使うことができます。

	ちなみに、progn を使うと括弧が増えていやだ、という場合には、
	(if (not 条件式) nil α β γ) という形でお茶を濁すことも
	できます。

☆if 文の実例☆

	「一つの ~/.emacs で、Mule 用と NEmacs 用の書きわけをしたい」

	Mule では、MULE という名前の変数が存在します。いっぽう、
	NEmacs では、NEMACS という名前の変数が存在しています。
	そこで、変数が存在しているかどうかを調べる boundp 関数を使って、
	次のような if 文で書くことができます。

		(if (boundp 'MULE)
		(progn
			Mule 用の設定をここに書く
		))

		(if (boundp 'NEMACS)
		(progn
			NEmacs 用の設定をここに書く
		))

	【後日訂正】発行時には、boundp は「変数・コマンドなどが存在して
	      いるかどうかを調べる」と書きましたが、これは誤りで、
	      boundp は、指定された名前の変数・定数が存在しているか
	      どうかだけを調べます。そういう名前のコマンド・関数が
	      あるかどうかは、commandp、fboundp という関数で調べ
	      ます。

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

☆本日のワンポイント☆

	もうお気づきの方も多いと思いますが、「M-x なんとか」という
	コマンドは、~/.emacs では (なんとか ...) と書くことができます。

	たとえば、M-x global-set-key は、(global-set-key ...) と
	書きましたね。

	それでは、ほかのコマンドはどうかというと、前回つかった
	set-variable も使えるのでしょうか。実際に試してみると、
		(set-variable 'line-number-mode t)
	のように使えることがわかります。

	【注意】変数名の頭には、setq の場合と違って「'」がつきます。

	ただし、前回 ~/.emacs に書いた setq は、M-x setq としては
	使えません。この詳細は、第 6 回に書きたいと思います。

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

☆次回予告☆

	次回は「第 3 回 男は黙って fundamental mode」です。

	Emacs では、開いたファイルの種類によって、自動的にキー操作が
	変わったり、インデントや括弧対応づけをしたり、といったことを
	してくれます。

	ところが私は、まるでチャップリンの『Modern Times』のやうな
	違和感を覚へます。たとへば、C 言語のプログラムを書くときには、
	私は if (...) と打ち込んだあとには手がパブロフの犬的に
		RET TAB { RET TAB TAB
	と動くのですが、TAB を入れなくてもインデントされたり、
	{ を入れると勝手に改行したり } が出現したりといふのは、
	きはめて気持ちが悪いのです。

	そこで次回は、この「余計なお世話」をさせない方法のご紹介です。
	もちろん、まっとうな、「ファイル名とモードの対応関係を一部分
	だけ変更する方法」も紹介したいと思います。

	なお、この「男は黙って」(といふより、「漢はだまって」と
	書くべきだとも思ふのですが)というのは私の先輩の口癖でして、
	別に男性だけのものという意味ではありません(^^;)
	女性のかたももちろんお使いくださいませ。

	それではまた来週、ごきげんよう♪

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

☆発行人☆

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

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

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

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

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

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

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