From mboxrd@z Thu Jan 1 00:00:00 1970 From: =?utf-8?Q?Fran=C3=A7ois_Pinard?= Subject: Re: viewing number of nested headlines Date: Tue, 05 Feb 2013 07:43:22 -0500 Message-ID: <86d2wfkk2d.fsf@iro.umontreal.ca> References: <87y5f3vycq.fsf@bzg.ath.cx> Mime-Version: 1.0 Content-Type: text/plain Return-path: Received: from eggs.gnu.org ([208.118.235.92]:45764) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1U2hry-0008To-J1 for emacs-orgmode@gnu.org; Tue, 05 Feb 2013 07:43:29 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1U2hrw-0001SA-MT for emacs-orgmode@gnu.org; Tue, 05 Feb 2013 07:43:26 -0500 Received: from 206-248-137-202.dsl.teksavvy.com ([206.248.137.202]:54639 helo=mercure.bureau.ubity.com) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1U2hrw-0001Rp-Do for emacs-orgmode@gnu.org; Tue, 05 Feb 2013 07:43:24 -0500 In-Reply-To: <87y5f3vycq.fsf@bzg.ath.cx> (Bastien's message of "Tue, 05 Feb 2013 11:39:17 +0100") List-Id: "General discussions about Org-mode." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: emacs-orgmode-bounces+geo-emacs-orgmode=m.gmane.org@gnu.org Sender: emacs-orgmode-bounces+geo-emacs-orgmode=m.gmane.org@gnu.org To: emacs-orgmode@gnu.org Bastien writes: > 42 147 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 , 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))))