emacs でのソースコードの折り畳み表示
Posted by yoosee on Debian at 2007-01-30 22:00 JST
1
folding.el
IRC で「emacs にソースコードの一部を折り畳む機能はあったかな」と言う話題になったのでちょっと探してみた。Debian だと emacs-goodies-el に入っている folding.el だが、これは折り畳みのためにマークをコメントとして入れないといけない。vim fold で言うところの foldmethod=marker 相当になるだろうか。
2
outline-minor-mode, hs-minor-mode
ソースコードを syntax を基準にした block 単位で折り畳むのには、emacs21 標準の hs-minor-mode (hideshow.el) や outline-minor-mode が使えそうだ。hs-minor-mode は名前の通り、特定部分を隠したり(hide)表示したり(show)する機能。標準では ruby の folding はサポートされていないが、hs-special-modes-alist に syntax のヒントを与えてやればいいようだ。このあたりはhs-minor-mode で ruby のコメントを折り畳む方法が参考になる。とりあえず
(add-hook 'ruby-mode-hook
'(lambda()
(hs-minor-mode 1)))
(let ((ruby-mode-hs-info
'(ruby-mode
"class\\|module\\|def\\|if\\|unless\\|case\\|while\\|until\\|for\\|begin\\|do"
"end"
"#"
ruby-move-to-block
nil)))
(if (not (member ruby-mode-hs-info hs-special-modes-alist))
(setq hs-special-modes-alist
(cons ruby-mode-hs-info hs-special-modes-alist))))と言う感じで行けるらしい。outline-minor-mode の方で設定するならcomp.lang.python の Code Folding with Emacs や bookshelf.jp の outline-mode 解説が参考になる。どちらにせよキーバインドが C-c @ C-[osaw] 等と指がつりそうなので、何か使い易いものにバインドしなおすのが良さそうだ。ちなみに C/C++ で #ifdef ... #endif を隠すには hide-ifdef-mode と言うのが使える。html の特定要素を自動的に fold してくれる html-fold.el と言うのも便利そうだ。
と色々並べてみたものの、 vim の folding にそのまま匹敵しそうな機能は見付けられてない。とは言え hs-minor-mode は便利なので常用することになりそう。

