[Date Prev] [Date Index] [Date Next]
[Thread Prev] [Thread Index] [Thread Next]

[xyzzy:01733] Re: テキストのオートインデントについて



大橋さん、こんにちは。須田です。

        Thu, 28 Jan 1999 16:26:26 +0900 の
        [xyzzy:01720] Re: テキストのオートインデントについて
        への返事です。

> ところで、elispとklisp(すいません、呼び方がわからないのでlispに亀井さんのK
> をつけちゃいました)では、エディタの拡張言語としてはどちらが簡単なんでしょう
> か。MuleのLispコードは、hookとかkey-mapとか難しそうでしたが。

どっちも同じくらい難しいです。ただ、common lisp ふう(? そのもの?)なのは xyzzy
のほうが多くて、エディター拡張用の関数は、残念ながら elisp のほうが多いような
気がします(気のせいか?)。

以前亀井さんの助けを借りて、text-newline-midashi-and-create-spaces というグロ
テスクで重いコマンドを作ったことがあります。今回それを改造して、text-newline-
and-indent なる関数をでっちあげました。以下のとおりです(どっかおかしかったら、
指摘して下さい > 亀井さん)。

(defun text-newline-and-indent (&optional (arg 1))
  (interactive "*p")
  (let ((current-space
	 (save-excursion
	   (goto-bol)
	   (and (looking-at "^[  \t]")
			(following-char)))))
    (insert #\LFD)
	(if (eq *last-command-char* #\F20)
		(let ((current-gyoto
			   (save-excursion
				 (scan-buffer *gyoto-mark* :regexp t :reverse t :tail nil)
				 (following-char))))
		  (insert current-gyoto))
	  (when current-space
		(insert current-space arg)))))

これもですね、かなりグロかなー。どういうのかというと、現在の行頭のスペースを見
にいって、その種類を得、改行してからそれを入れます。このコマンドをテキストモー
ドのキーマップの #\RET に割り付けておくと、M-5 #\RET で、半角なり全角なりのス
ペースが5個入力されます。M-* というのをやらなければ1個です。

 それからこのコマンドをテキストモードのキーマップの #\F20 に割り付けておくと、
#\C-RET で、現在の行頭マークを探して、それを入れます。行頭マークは

   (defvar *gyoto-mark* "^[■□◇◆●◎○]")

というような具合にしてどっかに書いておいて下さい(.xyzzyとかに)。こんな具合にす
ると、もしかしたらワードでやらなくてむすむようになるかも知れません。

 なお、F20 というのは

(set-extended-key-translate-table exkey-C-return #\F20)

というのをどこかに書いておくと、#\C-RET が F20 になるという魔術です。

 単にリターンで済むところを上のように複雑にするわけですから、xyzzy が word
なみに重くなっちゃいます(ウソウソ)。

--------
須田誠也
EZU11330@xxxxxxxxxxx

Index Home