Emacs Lispで式単位のコメントアウト — #:g1

Posted 2011-12-04 02:04:00 GMT

昨日の@mhayashi1120さんからの引き続き、EmacsAdventCalendarJPの15日目です。
Common Lispや、Schemeでは、#| 範囲コメント |# が使えて、これは入れ子にできたりするので便利なのですが、Emacs Lispにはありません。 手軽でやっつけな方法としては、

'(progn
  (foo bar baz))
という風にクォートしてしまう手段がありますが、それはさておき、コメントアウト系のコマンドはS式単位でも便利に使えるようなので、それを紹介したいと思います。
まず、
(list (list (list '^o^)))
という式があるとします。これの(list '^o^)の部分がいらないなあ、という場合を考えます。
この場合、(list '^o^) のカッコ上でC-M-Space (mark-sexp) してS式を一つ選択し、M-; (comment-dwim) でコメントアウトすると
(list (list ;; (list '^o^)
            ))
なんと、S式的には都合の良いように調整してコメントアウトしてくれます。
やっぱり元に、戻したいなあという場合ですが、コメントになっている式より上の階層をC-M-Space (mark-sexp)して、 C-u M-; する(数引数をつけた (comment-dwim))と、
(list (list (list '^o^)
            ))
こんな感じに戻ります。
コッカが別の行になっているのが気になるので、C-M-f (forward-sexp) して式の後に移動して、任意の回数M-^ (delete-indentation) してコッカをくつけます。
■ ネストしている場合の復帰ですが、
(list ;; (list ;; (list '^o^)
      ;;       )
      )
という式だとすると、listのコッカ上に移動して、C-M-SpaceしてS式を一つ選択。C-u M-;して
(list (list ;; (list '^o^)
            )
      )
さらに、一段下のlistのコッカ上に移動して(C-d C-f)、C-M-SpaceしてS式を一つ選択して、 C-u M-;
(list (list (list '^o^)
            )
      )
やはり末尾のコッカが気になるので C-M-e等で末尾に抜けて、M-^連打 といったところです。

今回 Emacs Lispでの解説でしたが、式単位での移動やリージョンの選択は、他の言語でも同じキーバインドでも対応していることが多いので、Emacs Lispに限らず、色々試してみてはいかがでしょうか
明日16日目は、@asudofuさんの回です。

comments powered by Disqus