Misc Change Log

`OpenBSD で scheme のアプリ開発' みたいなことをやってます。

2005-03-19

unparen

EmacsWiki:UnParenMode

Pretty Lambda のときにいっしょに紹介すべきだったんだけど。

要はあれだ。括弧消しちゃう。Lisp 仙人の視点がわかるんじゃない?

こんな感じ。

[unparen]

EmacsWiki によれば、Pretty Lambda と組み合わせるのがおすすめらしい。

[unparen-Y]

どこがやねん。てかこれ何語ですか?

肝心の使い方なんだけど、.emacs に、

(autoload 'unparen-mode "unparen"
  "Make all parens invisible, unless they are quoted." t)

あとは、M-x unparen-mode で実行。バッファが読み込み専用に変更される。 トグルになってるので、戻すにはもう一回 M-x unparen-mode すべし。

気に入ったら、

(global-set-key [(super u)] 'unparen-mode)

とかすれば S-u で楽々変換……ってこんなことできてうれしいかと聞かれてもちょっと困る。

オリジナル版はコメント中に () が入ってるときに () の対応がとれなくなって止まることがあるので、 ちょっとだけ書き換え。

(defun unparen ()
  "Hide all parens and make buffer read-only."
  (goto-char (point-min))
  (while (re-search-forward "[;()]" nil t)
    (cond ((eq ?\; (char-after (match-beginning 0)))
	   (if (eq ?\\ (char-before (match-beginning 0)))
	       (goto-char (+ (match-beginning 0) 1))
	       (forward-line 1)))
	  ((and (eq ?' (char-before (match-beginning 0)))
		(eq ?\( (char-after (match-beginning 0))))
	   (progn
	     (goto-char (match-beginning 0))
	     (forward-sexp)))
	  (t
	   (put-text-property (match-beginning 0)
			       (match-end 0)
			       'invisible
			       'unparen))))
  (toggle-read-only 1))

弱点は、可変個引数を取る手続きを一行に複数書くと破綻することか。 いい例がすぐに思いつかないけど、

(map (lambda (m n) (cons m n)) '(1 2 3) '(4 5 6))

を unparen すると、

map lambda m n cons m n '(1 2 3) '(4 5 6)

になっちゃうので lambda の引数はどこまであるのかわからなくなる、とか。 一応 mic-paren-mode が効くんだけど、カーソル持っていかないとだめだから、ちょっとアレ。

Posted at 11:43 | Permalink | Category | Comments