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で行う。