============================================== 1999.11.08 発行 =========
         極私的 Emacs カスタマイズ紹介マガヂン
            Emacs をわたし色に染めて♪
------------------------------------------------------------------------
     第 16 回 物理行単位のカーソル移動 〜vz.el から一部を流用する〜
------------------------------------------------------------------------
※あなたのカスタマイズをぜひ教えてください。一般的なものから、他の人は
 絶対にしないような「外道」なものまで、何でも結構です。

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

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

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
☆後日注☆

	今回紹介するのは vz.el ですが、他に physical-line-mode なるものが
	あるそうです。

		http://www.taiyaki.org/elisp/

	vz.el で不具合がある場合はこちらのコードを試すといいでしょう。
	じつは私も細かい不具合を発見しているのですが、あまり不自由しない
	のでそのままにしてあります。

	ただし、Emacs 20 以降で導入された defcustom 命令を特に何の断りも
	なく使用していることから考えて、Mule 2.3 で動作させるには多少の
	困難が伴うかもしれません。
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
☆読者のお便りから☆

	●メールを書くモードだと、せっかくご隠居いただいた C-c が復活
	 してしまい、特に、スクロールのつもりで C-c C-c と連打すると
	 メールが送られてしまうのはいただけません。何とかなりませんか?

		これには、第 13 回・第 14 回で御紹介した「ホック」を
		使います。たとえば、お使いのメーラーが MH-e なら、

		(add-hook 'mh-letter-mode-hook '(lambda ()
                	(define-key mh-letter-mode-map "\C-c" 'scroll-up)
			(define-key mh-letter-mode-map "\M-o\C-c\C-c"
						'mh-send-letter)
	        ))

		とすれば大丈夫です。ただし、これはメールを書くモードで
		C-c にご隠居願うだけですので、到着メール一覧表画面でも
		C-c を止めるには、もっとたくさんの define-key が必要に
		なります。

		rmail なら、送信には mail モードを使っていますので、

		(add-hook 'mail-mode-hook '(lambda ()
			(define-key mail-mode-map "\C-c" 'scroll-up)
			(define-key mail-mode-map "\M-o\C-c\C-c"
					'mail-send-and-exit)
		))

		でたぶん大丈夫だと思います。ただし、私自身はこれを使わない
		ので、一応の動作確認はしましたが、もしかしたら不具合がある
		かもしれません。

				☆

		他のメーラーの場合は、まず、「そのメーラーで、メールを
		書くときは何というモードになっているのか」を調べます。

		mh-e の場合は、モードライン(反転表示行)に「(MH-Letter)」
		と出たので、mh-letter-mode という予測を立て、
			% cd /usr/local/share/emacs/19.34/lisp
			% grep mh-letter-mode *.el
		で探すと、mh-letter-mode-hook、mh-letter-mode-map、
		mh-send-letter というキーワードが見つかりました。

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

☆今回のお題☆

	さて、今回は「物理行単位でのカーソル移動」です。

	Emacs では、「改行から改行まで」を 1 行として扱います。
	この「改行から改行まで」を、Windows 用エディタの世界などでは
	論理行といいます。一方、論理行に対して、画面上の 1 行を物理行と
	いいます。

	【注意】この「論理行」「物理行」という用語は、必ずしも用法が一定
	    していないようで、逆の意味に使う人もいます。その人の感覚
	    では、「改行から改行まで」は、メモリ上の物理的な配置に
	    由来するから「物理」行であり、「画面上の 1 行」はコンピュ
	    ータの物理的な都合には関係なく人間にとっての 1 行であるから
	    「論理」行である、ということのようです。

	カーソル移動などのコマンドも、基本的には論理行単位になります。

	たとえば、

	+------------------------------------------------------------+
	|これは長い長い長い長い長い長い長い長い長い長い長い長い長い\\|
	|長い長い長い長い長い長い長い長い長い長い長い長い行です。    |
	|次にあるのは短い行です。                                    |
	+------------------------------------------------------------+

	という状態を考えてみてください。1 行目の末尾の「\\」は、次の行に
	続いているという表示です。カーソルは 1 行目の 3 文字目の「は」に
	あったとします。ここで下カーソルキーを押すと、カーソルはその下の
	「長」ではなく、さらに下の「あ」まで進んでしまいます。また、
	「は」からシフト+右カーソルや C-e(飯嶋式では C-f)などを押して
	みると、カーソルは右端の「い」ではなく、「。」の次まで進んで
	しまいます。

	これは表示の直感に反しているので、何とかしよう、というのが
	今回のお題です。

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
☆vz.el を使う☆

	さて、Emacs の世界には、そもそも物理行単位という発想が稀薄です。
	そのため、物理行単位でカーソルを移動するコマンドは、ちょっと探した
	ところでは見つかりません。

	そこで、以前に名前が出た「vz.el」を使うことにします。もっとも、
	(require 'vz) や (load-library "vz") のような形で呼び出すと、
	すべてが vz 的になってしまってかえって不都合なので、必要な部分
	だけを抜き出して .emacs に加筆するようにしましょう。

	vz.el の入手場所は次のとおりです:
		ftp://ftp.st.ryukoku.ac.jp/pub/emacs-lisp/vzel/

	【後日補足】現在、この場所からは入手できません。
		当マガヂンのホームページからダウンロードしてください。
		http://www.ht.sakura.ne.jp/~delmonta/emacs/

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
☆まずは解析☆

	さて、上記サイトから vzel074.lzh をダウンロードすると、いくつかの
	ファイルが出てきます。この中で、とりあえず VZ-KEYS.EL を読むことに
	しましょう。

	そうするとまず、
		(define-key vz-mode-map [up] 'vz-previous-line)
		(define-key vz-mode-map [down] 'vz-next-line)
	という記述が見つかります。

	また、そのしばらく先には、AT 互換機と PC-98x1 とで場合分けが
	されていますが、

	; AT 互換機用 vz と互換にする場合
		(define-key vz-mode-map [home] 'vz-left-of-screen)
		(define-key vz-mode-map [end] 'vz-right-of-screen)
	; PC-98x1 用 vz と互換にする場合
		(define-key vz-mode-map [M-left] 'vz-left-of-screen)
		(define-key vz-mode-map [M-right] 'vz-right-of-screen)
	という記述があります。

	ということで、他の VZ*.EL の中から、これらのコマンドが定義されて
	いる場所を探しだして、その部分だけを .emacs に書き込むことにしま
	しょう。

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
☆.emacs に書き込むべき内容は☆

	さて、その後はひたすら grep して、これらのコマンドが定義されている
	場所を探しましょう。

	そうすると、VZ.EL の 500 行目あたりから

	(defun vz-next-line ()
	  "Vz:↓"
	  (interactive)
	  (if truncate-lines
	      (next-line 1)
	    (or (eq last-command 'vz-next-line)
		(setq vz-goal-column (% (current-column) (1- (window-width)))))
	    (if (eolp)
		(progn
		  (forward-char 1)
		  (move-to-column vz-goal-column))
	      (vertical-motion 1)
	      (move-to-column (+ vz-goal-column (current-column))))))

	(defun vz-previous-line ()
	  "Vz:↑"
	  (interactive)
	  (if truncate-lines
	      (previous-line 1)
	    (or (eq last-command 'vz-next-line)
		(setq vz-goal-column (% (current-column) (1- (window-width)))))
	    (let ((ncol (- vz-goal-column (window-width) -1)))
	      (vertical-motion -1)
	      (if (<= 0 ncol)
		  (move-to-column ncol)
		(move-to-column (+ vz-goal-column (current-column))))))
	  (setq this-command 'vz-next-line))	;fake

	;中略

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

	(defun vz-left-of-screen ()
	  "Vz 画面の左端"
	  (interactive)
	  (vertical-motion 0))

	という定義があるのがわかります。
	そこで、ここを .emacs に書き写します。

	【後日訂正】実際には、このままではうまく行かない場合があります。
		詳しくは次回(第 17 回)へ。

	ついでに、vz-next-line と vz-previous-line では、vz-goal-column
	という変数を使っているようですので、

		(defvar vz-goal-column nil)

	という記述もしておくといいでしょう。

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
☆最後にキーを設定する☆

	あとは、必要に応じてキー操作を設定するだけです。カーソルキーの
	[up]、[down]、[(shift left)]、[(shift right)] と、対応する
	Control+英字 の 4 種類、都合 8 つのキーを設定しましょう。

		(global-set-key "\C-e" 'vz-previous-line)
		(global-set-key "\C-x" 'vz-next-line)
		(global-set-key "\C-f" 'vz-right-of-screen)
		(global-set-key "\C-a" 'vz-left-of-screen)

		(global-set-key [up] 'vz-previous-line)
		(global-set-key [down] 'vz-next-line)
		(global-set-key [(shift right)] 'vz-right-of-screen)
		(global-set-key [(shift left)]  'vz-left-of-screen)
		(global-set-key [down] 'vz-next-line)

	さて、これで設定は終わりです。Emacs を再起動しましょう。

	【後日注】執筆当時は、Shift+カーソルキーは [S-right] のように書いて
	     いましたが、XEmacs ではこの記法は使えないため、
	     [(shift right)] のように改めました。なお、こちらの記法は
	     Mule 2.3 や Emacs 20.x、21.x でも使用可能です。

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

☆次回予告☆

	次回の予定は、「第 17 回 X にまつわるエトセトラ」です。

	今回は趣向を変えて、X Window System についてすこし扱ってみたいと
	思います。内容としては、
		○xmodmap によるキーカスタマイズの仕方
		○Emacs のウィンドウサイズを変更する
	の 2 本立てでお送りしたいと思います。

	なお、xmodmap というのは、X Window System 上でキーの並びを変更する
	ツールです。今までやってきた「Emacs 上でのカスタマイズ」では、
	Control キーの機能を変更するということはできませんでしたが、
	この xmodmap を使えば、「Control キーと Caps Lock キーを入れ替え
	る」「DVORAK 配列のキーボードにする」といったことが非常に簡単に
	できてしまいます。

	それではまた♪

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

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