2 番目の例は明らかにより複雑であり、ここでは説明しませんが、outline-mode/minor-mode はインデント ベースのツリーでうまく機能します。任意の繰り返されるプレフィックス文字列 (この例では 4 つのスペースですが、必要に応じて構成可能)。
以下のコードをロード/評価してから、データ ファイル (ローカル変数を含む) をロードすると、分岐を非表示/表示し、 and (カーソル キー)を使用SHIFT+TABして分岐を昇格/降格できます。もちろん、他のすべての機能も利用できます。SHIFT+LEFTSHIFT+RIGHToutline-minor-mode
mysite/
manage.py
mysite/
__init__.py
settings.py
urls.py
wsgi.py
;;; Local Variables:
;;; my-outline-prefix: " "
;;; eval: (my-outline-minor-mode 1)
;;; End:
(global-set-key (kbd "<S-tab>") 'outline-toggle-children)
(global-set-key (kbd "<S-left>") 'outline-promote)
(global-set-key (kbd "<S-right>") 'outline-demote)
(defvar my-outline-prefix " "
"Prefix string denoting a single outline level for `my-outline-minor-mode'.")
(defvar my-outline-max-level 20
"Maximum number of levels for `my-outline-minor-mode'.")
(define-minor-mode my-outline-minor-mode
"Outline levels based on repetitions of `my-outline-prefix'."
0 nil nil
(outline-minor-mode 1)
(setq-local outline-level 'my-outline-level)
(setq-local outline-regexp (format "\\(%s\\)*"
(regexp-quote my-outline-prefix)))
(setq outline-heading-alist '())
(let ((level 0)
(level-prefix ""))
(while (< level my-outline-max-level)
(setq outline-heading-alist (cons (cons level-prefix level)
outline-heading-alist)
level (1+ level)
level-prefix (concat level-prefix my-outline-prefix)))
(setq outline-heading-alist (nreverse outline-heading-alist))))
(defun my-outline-level ()
"Counts how many times `my-outline-prefix' appears at the start of the line."
(let* ((data (match-data))
(start (car data))
(end (cadr data))
(indent (- end start)))
(/ indent (length my-outline-prefix))))