折りたたみ表示

Eclipseに慣れてしまってるので、EmacsPHPのソースをみていくときに
折り畳みがないと不便だなと思っていたわけですが。
folding.el だとコメントに//{{{とかが入っていないソースもあるわけで、うーんと思っていました。

そしたらアウトラインモードを使えば良いとかわかりましたよ。
ちょっとカンドー。この辺を参考にしました。
http://d.hatena.ne.jp/katase_n/19700201
http://www.bookshelf.jp/soft/meadow_35.html#SEC506
http://www.bookshelf.jp/pukiwiki/pukiwiki.php?%B2%BF%A4%C7%A4%E2%A5%A2%A5%A6%A5%C8%A5%E9%A5%A4%A5%F3%A5%E2%A1%BC%A5%C9

最近はもうPHP5な人なので対応してみました。
キーバインドをC-c C-oに変更したのと、Enterで開閉をできるようにしてみた。(うまくいかないこともあるみたいだけどとりあえずね。)

(add-hook 
 'php-mode-hook
 '(lambda ()
    ; ヘッドラインの指定
    (setq outline-regexp 
          (concat "^<\\?\\|"
                  "^\\?>\\|"
                  "^[abstract ]*class\\|"
                  "^inteface\\|"
                  "^  [abstract|public|protected|private|static]*\s?[public|protected|private|static]*\s?function\\|"
                  "^    [abstract|public|protected|private|static]*\s?[public|protected|private|static]*\s?function\\|"
                  "^/\\*\\*\\|"
                  "^  /\\*\\*\\|"
                  "^    /\\*\\*"))
    (setq outline-level
          '(lambda ()
             (save-excursion
               (let ((str nil))
                 (looking-at outline-regexp)
                 (setq str (buffer-substring-no-properties
                            (match-beginning 0) (match-end 0)))
                 (cond
                  ((string-match "^/\\*\\*" str) 1)
                  ((string-match "^<\\?" str) 1)
                  ((string-match "^\\?>" str) 1)
                  ((string-match "^[abstract ]*class" str) 1)
                  ((string-match "^interface" str) 1)
                  ((string-match "^  /\\*\\*" str) 2)
                  ((string-match "^    /\\*\\*" str) 2)
                  ((string-match "^  [abstract|public|protected|private|static]*\s?[public|protected|private|static]*\s?function" str) 3)
                  ((string-match "^    [abstract|public|protected|private|static]*\s?[public|protected|private|static]*\s?function" str) 3)
                  )))))
    (setq outline-minor-mode-prefix "\C-c\C-o")
    (outline-minor-mode t)
    (hide-body)))

(defun outlineadd-mode-hook ()
  (define-key outline-mode-prefix-map "\C-v" 'outlineadd-occur)
  (define-key outline-mode-prefix-map "\C-m" 'outlineadd-toggle))
(add-hook 'outline-mode-hook 'outlineadd-mode-hook)
(add-hook 'outline-minor-mode-hook 'outlineadd-mode-hook)

(defun outlineadd-occur ()
  (interactive)
  (occur (concat "^" outline-regexp)))

(defun outlineadd-toggle ()
  (interactive)
  "Toggle outline hiding for the entry under the cursor"
  (if (progn
        (setq cpos_save (point))
        (end-of-line)
        (get-char-property (point) 'invisible))
      (progn 
        (show-subtree)
        (goto-char cpos_save))
    (progn 
      (hide-leaves)
      (goto-char cpos_save))))