php-mode で、全ての関数を折りたたむ
php-modeを使っていて、js2-modeの様に、メソッドや関数群を全て一気に折りたたみたい時がある。
今時折りたたみはよくある機能だ。
ちなみにjs2-modeでは、
C-c C-f
で全体の折りたたみをtoggleする。
さらに、
C-c C-o
で個別の折りたたみをtoggleする。
使ってみるとこれは超絶便利で、全体が簡単に俯瞰出来るので、非常に見通しが良くなる。
php-modeでも同じことをやりたいのは普通のことだ。
さて、これを可能にするのがhideshow.elだ。
ちなみに、emacs 23.3には標準的に内蔵されていて、
(hs-minor-mode)
をphp-modeのhookの中にでも書いておけば、すぐに使える。
しかし初期キーバインドは相当癖があるため、js2-modeに習うといいだろう。
js2-modeのように、ブロックをtoggleするのは、
hs-toggle-hiding
である。
しかし、hs-minor-mode時に、hs-hide-allすると、どうやらクラスを折りたたんでしまう。
それだけならまだしも、クラスを展開すると、クラスの中のメソッドは折りたたんでいない。
正直クラスは折りたたんで欲しくなく、全てのメソッドを折りたたんでほしい。
ので、自分で作ることにした。
自分の様な特殊な要望にしか答えられないelisp断片だけれども、備忘録のため、載せてみる。
;; hs-toggle-function (defvar my-hs-state-hide nil) (defun hs-toggle-function() "toggle all functions for php or c" (interactive) (if my-hs-state-hide (progn (hs-show-all) (setq my-hs-state-hide nil)) (hs-hide-function)) ) (defun hs-hide-function() (interactive) (setq my-hs-state-hide t) (save-excursion (beginning-of-buffer) (while (re-search-forward "function.*?(.*?)" nil t) (if (search-forward "{" nil t ) (hs-hide-block))))) (define-key php-mode-map (kbd "C-c C-f") 'hs-toggle-function)
これで、"C-c C-f"で、全体的にメソッド、関数部分がtoggleする。
個別のtoggleは、"C-c C-o"に割り当てたhs-toggle-hidingで行う。