outline-minor-mode vs orgstruct

emacs-lisp-mode-hookoutline-minor-mode を設定しておくと幸せになれますよね. Orgstruct mode というのもあるのですが,どうも挙動がおかしいことがあるので,あまり信用していません (個人の感想です). org-modeoutline-mode から派生しているので, org-mode の操作が有効な場合があります.

例えば, org-cycle が使えるので,結構便利です. TAB に割当てちゃいましょう.

(add-hook 'emacs-lisp-mode-hook
          (lambda ()
            (outline-minor-mode 1)
            ;; (turn-on-orgstruct++)
            (define-key outline-minor-mode-map "\C-i" 'org-cycle)
            (define-key outline-minor-mode-map "\C-c\C-f" 'outline-forward-same-level)
            (define-key outline-minor-mode-map "\C-c\C-b" 'outline-backward-same-level)
            (define-key outline-minor-mode-map "\C-c\C-n" 'outline-next-visible-heading)
            (define-key outline-minor-mode-map "\C-c\C-p" 'outline-previous-visible-heading)
            ))

org-cycle-emulate-tabt にしておきましょう(デフォルトは t). ヘッディング以外では,本来の TAB として振舞うので,快適です.

ちなみに, emacs-lisp-mode 専用のヘッディングは, lisp-mode.el で設定されています.

(setq outline-regexp ";;;\\(;* [^ \t\n]\\|###autoload\\)\\|("))

行頭から3個以上の ; や 行頭の ( がヘッディングとして認識されるようです. コメントの付け方がきちんとしていれば,このままで有用なはずです. 同じく lis-mode.el で定義されている lisp-outline-level は, ちょっといいかげんですね.

(defun lisp-outline-level ()
  "Lisp mode `outline-level' function."
  (let ((len (- (match-end 0) (match-beginning 0))))
    (if (looking-at "(\\|;;;###autoload")
        1000
      len)))

これをいじると,もうちょっと org-mode と仲良くなれるかもしれません.