emacs-orgmode
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [O] viewing number of nested headlines


From: François Pinard
Subject: Re: [O] viewing number of nested headlines
Date: Tue, 05 Feb 2013 07:43:22 -0500
User-agent: Gnus/5.130006 (Ma Gnus v0.6) Emacs/23.4 (gnu/linux)

Bastien <address@hidden> writes:

> 42 147 <address@hidden> writes:

>> Is there a way to see how many nested headlines there are within a
>> higher-level headline (not necessarily top-level)?

> This is a nice feature of VimOrganizer but no, there is no way to do
> this with Org for now.

Hi!

I'm not sure the following code responds to your wish, maybe it would
help enough?  Surely, it is often useful to me.  You might have to
adapt the first few lines to your local installation or taste, however.



(defvar fp-org-distribution "~/emacs/_/org-mode")
(add-to-list 'load-path (concat fp-org-distribution "/lisp"))
(add-to-list 'load-path (concat fp-org-distribution "/contrib/lisp" ) t)

(require 'org)

(defface fp-warn-face
  '((((class color) (background light))
     (:foreground "chocolate2" :weight bold))
    (((class color) (background dark))
     (:foreground "chocolate1" :weight bold)))
  "Face for own highlights.")

(define-key org-mode-map "\C-cow" 'fp-org-weight-display)





(defun fp-org-weight-display ()
  "Show header weights in the entire buffer.

Use \\[fp-org-weight-remove-overlays] to remove the header weights."
  (interactive)
  (fp-org-weight-remove-overlays)
  (save-excursion
    (goto-char (point-min))
    (outline-next-visible-heading 1)
    (while (not (eobp))
      (save-excursion
        (fp-org-weight-put-overlay (fp-org-weights-at-point)
                                   (funcall outline-level)))
      (outline-next-visible-heading 1))
    ;; Arrange to remove the overlays upon next change.
    (when org-remove-highlights-with-change
      (org-add-hook 'before-change-functions 'fp-org-weight-remove-overlays
                    nil 'local))))

(defvar fp-org-weight-overlays nil)
(make-variable-buffer-local 'fp-org-weight-overlays)

(defun fp-org-weight-put-overlay (weights &optional level)
  "Put an overlays on the current line, displaying WEIGHTS.
If LEVEL is given, prefix weights with a corresponding number of stars.
This creates a new overlay and stores it in `fp-org-weight-overlays', so that it
will be easy to remove."
  (let* ((h (car weights))
         (p (cdr weights))
         (c 50)
         (l (if level (org-get-valid-level level 0) 0))
         (off 0))
    (org-move-to-column c)
    (unless (eolp) (skip-chars-backward "^ \t"))
    (skip-chars-backward " \t")
    (let* ((ov (make-overlay (1- (point)) (point-at-eol)))
           (d (+ off (max 0 (- c (current-column) 2))))
           (tx (concat (buffer-substring (1- (point)) (point))
                       " "
                       (make-string d ? )
                       " "
                       (org-add-props (format "%s %3s %6s "
                                              (make-string l ?*)
                                              (if (zerop p) "" p)
                                              (if (zerop h) "" (format "(%s h)" 
h)))
                           (list 'face 'fp-warn-face))
                       "")))
      (if (not (featurep 'xemacs))
          (overlay-put ov 'display tx)
        (overlay-put ov 'invisible t)
        (overlay-put ov 'end-glyph (make-glyph tx)))
      (push ov fp-org-weight-overlays))))

(defun fp-org-weight-remove-overlays (&optional beg end noremove)
  "Remove the occur highlights from the buffer.
BEG and END are ignored.  If NOREMOVE is nil, remove this function
from the `before-change-functions' in the current buffer."
  (interactive)
  (unless org-inhibit-highlight-removal
    (mapc 'delete-overlay fp-org-weight-overlays)
    (setq fp-org-weight-overlays nil)
    (unless noremove
      (remove-hook 'before-change-functions
                   'fp-org-weight-remove-overlays 'local))))

;; Compliment of Nicolas Goaziou <address@hidden>, 2012-02-26
(defun fp-org-weights-at-point ()
  "Return cons of number of subtrees and paragraphs in the subtree at point.
Paragraphs (also encompasses equivalent structures)."
  (org-with-wide-buffer
   (org-narrow-to-subtree)
   (let ((tree (org-element-parse-buffer 'element)) (num-hl 0) (num-el 0))
     (org-element-map tree 'headline (lambda (hl) (incf num-hl)))
     (org-element-map
      tree '(paragraph table verse-block quote-block src-block example-block)
      (lambda (el) (incf num-el)))
     (cons (1- num-hl) num-el))))



reply via email to

[Prev in Thread] Current Thread [Next in Thread]