============================================== 1999.11.22 発行 =========
         極私的 Emacs カスタマイズ紹介マガヂン
            Emacs をわたし色に染めて♪
------------------------------------------------------------------------
   第 17 回 X にまつわるエトセトラ【前編】ウィンドウのサイズを変える
------------------------------------------------------------------------
※あなたのカスタマイズをぜひ教えてください。一般的なものから、他の人は
 絶対にしないような「外道」なものまで、何でも結構です。

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

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

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
☆読者のお便りから☆

	●Mule と Emacs はどう違うのでしょうか? Emacs 20.x では Mule が
	 本家 Emacs に統合されたはずなのに、なぜ Mule 3.0、Mule 4.0 など
	 というものが存在するのでしょうか?

		まず、Emacs 19.x の時代には、Mule(Multilingual Enhance-
		ment to GNU Emacs)というのは、本家の英語版 Emacs に、
		日本語をはじめとする多国語対応のための大掛かりなパッチを
		あてたもの、あるいは、そのパッチ自身を指す言葉でした。

		さて、Emacs 20.x ではおっしゃる通り、本家の(欧文専用の)
		Emacs に、Mule の多国語対応機能の多くが取り込まれました。

		【補足】ただし、多国語対応機能が要らない人もいますので、
		    そういう人は、実行時の設定によって、多国語対応
		    機能なしの Emacs を使うことができます。

		【余談】いまだに Emacs 20.x に取り込まれていない機能の
		    主要なものに、Wnn や Canna のサポートがあります。
		    現在はこれらは非公式パッチという形で配布されて
		    います。

		ここで話がややこしくなるのですが、Emacs 20.x の世界では、
		「中に取り込まれた多国語対応機能」のことを Mule と呼び
		ます。そして、その部分の仕様が、Emacs 19.28/19.34 用の
		Mule 2.3 より新しいので、Mule 3.0、Mule 4.0 というバー
		ジョン番号をふっているのです。つまり、Mule 1.x/2.x の
		ように Emacs と Mule が別々に存在するのではなくて、Mule
		3.0、Mule 4.0 というのは、「多国語対応機能ありに設定した
		Emacs 20.x の別名」だと考えていただければいいと思います。

		またさらに話がややこしくなるのですが、Mule と呼んだとき
		には本家との統合前の(Emacs 19.34 までの)Mule のみを指し、
		多国語対応機能が統合された Emacs 20.x は単に Emacs(または
		Emacs 20.x)と呼んで区別するという用例もありますので、
		ご注意ください。

		なお、同時に XEmacs についてもお問い合わせをいただいたの
		ですが、こちらについては調べきれませんでしたので、また
		後日お答えしたいと思います。いちおう、http://www.xemacs.org
		が総本山のようですので、いちどご覧になってみてください。

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
☆前回の訂正☆

	前回ご紹介した中に vz-right-of-screen というものがありましたが、
	実はこれがうまくいかない場合があることがわかりました。

	うまくいかない場合というのは、カーソルが最終行にある場合です。
	たとえば、

	+-----------------------------------+ ※[改行] は改行を表します。
	|この行では正常に動きます。[改行]   |  [EOF]  は end of file を
	|最終行です。[EOF]                  |         表します。
	+-----------------------------------+

	のように、最後の行に改行がない場合、最終行で vz-right-of-screen
	を実行すると、最後の [EOF] の位置ではなく、その手前の「。」の位置
	にカーソルが行きます。あるいは、

	+-----------------------------------+
	|最終行には改行があります。[改行]   |
	|[EOF]                              |
	+-----------------------------------+

	のような場合に、最後の [EOF] にカーソルがある状態で vz-right-of-
	screen を実行すると、本来ならカーソルが動いてはいけないはずなのに、
	前の行の [改行] の位置に戻ってしまいます。

	この原因は、元の実装

	        (defun vz-primitive-right-of-screen ()
	          "Vz 画面の右端"
	          (interactive)
	          (vertical-motion 1)
	          (backward-char 1))

	で、まず vertical-motion でカーソルを次の物理行の冒頭に送ってから、
	backward-char でその一つ前の文字(つまりは元の行の末尾)に戻して
	いるせいです。

	ところが、上の例のように [EOF] を含む行では、vertical-motion は
	たかだか [EOF] までしか移動できません。そのため、そこから戻る
	必要はないのに戻ってしまっているせいで、おかしなことになるのです。

	というわけで、次のように書き換えてください。

		(defun vz-right-of-screen ()
		  "Vz 画面の右端"
		  (interactive)
		  (vertical-motion 1)
		  (if (not (eobp))
		    (backward-char 1)))

	ここで書いてある通り、(eobp) で「現在のカーソルの位置が end of
	buffer(つまり [EOF])かどうか」を判別し、[EOF] ではない場合に
	限って 1 文字戻るようにしました。

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

☆今回のお題☆

	今回と次回は、X上で Emacs を使うための tips をご紹介します。
	当初の予定としては、今回だけで「xmodmap によるキー割り当ての
	変更方法」と「ウィンドウサイズの変え方」の両方を扱う予定でしたが、
	事情により今回は後者のみとさせてください。

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
☆Lisp プログラムでウィンドウサイズを変える☆

	ウィンドウ(Emacs の世界ではフレームという言い方が普通なので、
	以下フレームで統一します)のサイズを変えるための関数としては、
	Emacs には次のものなどがあります。ここで「幅」「高さ」の単位は
	半角文字です。

		(set-frame-height どのフレームか 高さ)
		(set-frame-width  どのフレームか 幅)
		(set-fgrame-size  どのフレームか 幅 高さ)

	ここで、第一引数に「どのフレームか」があるのは、X 上の Emacs では
	ひとつの Emacs で複数のフレームを開くことができる(メニューの
	Files→Make New Frame、標準のキー操作では C-x 5 2)ので、どれ
	なのかをはっきりさせる必要があるからです。とはいえ、ここでは
	「現在使用中のフレーム」だけを相手にすればそれでいいので、
	ここには (selected-frame) と書いておけば十分です。

	さて、それでは実際にやってみましょう。バッファ上に
		(set-frame-size (selected-frame) 70 20)
	と書いてからそれをマウスなどで範囲指定し(このマガヂンを Emacs
	上で読んでいる人は、わざわざ入力せずにこれを選択してもいいで
	しょう)、それから M-x eval-region RET を入力してみましょう。
	こう入力すると、フレームの大きさが、横幅が半角 70 文字(全角
	35 文字)、縦方向の高さが 20 行になったことがわかると思います。

	【補足】この高さには、反転表示行(モードライン)や、その下の、
	    コマンド入力などに使う行(ミニバッファ)を含みます。
	    メニューバーは、普通に X 上の Emacs で実行した場合は
	    行数に含まれませんが、コンソール上でこれを実行した場合
		(どうなるのか実際に試してみてください)にはこれも行数に
		含みます。

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
☆コマンドにする☆

	さて、ところが、この「set-frame-なんとか」という関数は、コマンド
	としては使うことができません。つまり、M-x set-frame-size のように
	使ったり、(global-set-key "\C-os" 'set-frame-size) としてキーに
	割り当てたりすることができません。

	そこで、コマンドとして新しく作ることにしましょう。~/.emacs に
	書き込むべき定義は、

		(defun set-selected-frame-size (width height)
			(interactive "nWidth: \nnHeight: ")
			(set-frame-size (selected-frame) width height)
		)

	でいいでしょう。interactive の引数については、第 6 回を参照して
	ください。第 6 回で使ったのは引数が 1 つだけの場合でしたが、
	今回のように 2 つ以上ある場合は、\n(改行)で区切って指定する
	ことができます。

	これならば M-x set-selected-frame-size RET のように使用したり、
	(global-set-key "\C-os" 'set-selected-frame-size) のように
	キーに割り当てたりすることができます。

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
☆上級編 - 入力時に現在の数値を表示するようにする☆

	さて、ここで作った set-selected-frame-size では、実行したときに
	「Width:」「Height:」とだけ表示されます。ところが、これでは設定
	前に現在の値を知ることができないため、ちょっと不便です。目視で
	ある程度の判断はできますが、あまりあてになりません。

	そこで、interactive の引数を工夫して、「Width(now 80):」や
	「Height(now 25):」のように表示されるようにしてやりましょう。

	この設定には、

		(defun set-selected-frame-size (width height)
			(interactive (concat
			    "nWidth(now "       (frame-width  (selected-frame))
			    "): \nnHeight(now " (frame-height (selected-frame))
			    "):"
			))
			(set-frame-size (selected-frame) width height)
		)

	とすれば OK のはず…ですが、実はそれではうまく行きません。
	というのは、interactive の引数は、上記のような方法で使うときには
	文字列定数でなければいけないからです。

	実は、interactive にはもう一つの書式があります。

	(interactive (list
		(string-to-int (read-string "Width:" ))
		(string-to-int (read-string "Height:"))
	))

	のような、(list 第一引数に与えるべき値 第二引数に与えるべき値 ...)
	という書式です。このケースでは、どちらも「文字列としてキー入力を
	求め、その結果を数値として取り扱う」という形ですが、この書式を
	うまく使うと、「ある引数についてはキー入力を求めるが、別のある
	引数については或るデフォルト値を与える」といった芸当ができます。

	さて、これを使って書き直すと、次のようになります。

                (defun set-selected-frame-size (width height)
                    (interactive (list
                        (string-to-int (read-string (concat
			    "Width(now "  (frame-width  (selected-frame)) "):"
			)))
                        (string-to-int (read-string (concat
                            "Height(now " (frame-height (selected-frame)) "):"
                        )))
                    ))
                    (set-frame-size (selected-frame) width height)
                )

	【後日訂正】実は、Emacs のバージョンによっては、これでは正しく
	      動きません。訂正は第 xx 回で。

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

☆次回予告☆

	次回の予定は、「第 18 回 X にまつわるエトセトラ【後編】xmodmap
	でキーを変える」です。

	それではまた♪

========================================================================
極私的 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
これは「古文書」です。 古くなった情報も原則未修正で保存していますのでご注意ください。

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