From mboxrd@z Thu Jan 1 00:00:00 1970 From: Thorsten Jolitz Subject: [NEW FEATURE] org-hlc.el - hidden-lines-cookies (hlc) for Org-mode Date: Wed, 22 May 2013 22:44:55 +0200 Message-ID: <87zjvmiw1k.fsf@gmail.com> Mime-Version: 1.0 Content-Type: text/plain Return-path: Received: from eggs.gnu.org ([208.118.235.92]:55936) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UfFuG-0001LE-Np for emacs-orgmode@gnu.org; Wed, 22 May 2013 16:45:10 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1UfFuE-00015n-Om for emacs-orgmode@gnu.org; Wed, 22 May 2013 16:45:08 -0400 Received: from plane.gmane.org ([80.91.229.3]:43957) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UfFuE-00014F-DK for emacs-orgmode@gnu.org; Wed, 22 May 2013 16:45:06 -0400 Received: from list by plane.gmane.org with local (Exim 4.69) (envelope-from ) id 1UfFuC-0005Mm-D1 for emacs-orgmode@gnu.org; Wed, 22 May 2013 22:45:04 +0200 Received: from e178191082.adsl.alicedsl.de ([85.178.191.82]) by main.gmane.org with esmtp (Gmexim 0.1 (Debian)) id 1AlnuQ-0007hv-00 for ; Wed, 22 May 2013 22:45:04 +0200 Received: from tjolitz by e178191082.adsl.alicedsl.de with local (Gmexim 0.1 (Debian)) id 1AlnuQ-0007hv-00 for ; Wed, 22 May 2013 22:45:04 +0200 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 Hi List, I ported this from outshine.el (i.e. outline-minor-mode) to Org-mode, hope it is useful. What is it all about? With 'org-hlc' ,-------------------------------------------------------------------- | Behind every folded headline, a little 'cookie' shows the number of | hidden lines till the next visible headline. `-------------------------------------------------------------------- e.g. ,--------------------------------------------------------------------- | * my-file.org [#13] | ** Commentary [#1] | *** About my-file | | This file implements extensions for occur-mode. You can think of a | navi-buffer as a kind of 'remote-control' for an (adecuately) | outline-structured original-buffer. | | *** Usage [#165] `--------------------------------------------------------------------- I attach the code to this message, you can find the git-repo here: ,-------------------------------- | https://github.com/tj64/org-hlc | git clone https://github.com/tj64/org-hlc `------------------------------------------ Please let me know if there is interest to include this in Org-mode. ----------- ORG-HLC.EL ----------- ;;; org-hlc.el --- hidden-lines-cookies for folded Org-mode headlines ;; Copyright (C) 2013 Thorsten Jolitz ;; Author: Thorsten Jolitz ;; Keywords: org-mode, outline, visibility, overlays ;; This file is (NOT YET) part of GNU Emacs. ;; GNU Emacs is free software: you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation, either version 3 of the License, or ;; (at your option) any later version. ;; GNU Emacs is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; You should have received a copy of the GNU General Public License ;; along with GNU Emacs. If not, see . ;;; Commentary: ;; 'hidden-lines-cookies' (hlc) are small cookies at the end of each folded ;; (and visible) headline in an Org-mode buffer that show the number of hidden ;; lines before the next visible headline. ;; hidden-lines-cookies can be handled with three user commands: ;; `org-hlc-show-hidden-lines-cookies', `org-hlc-hide-hidden-lines-cookies', ;; and the convenience command `org-hlc-toggle-hidden-lines-cookies' that ;; toggles between the two other commands conditional on the last one ;; executed. ;; The appearance of the cookies can be customized by changing the values of ;; four customizable variables: `org-hlc-hidden-lines-cookie-left-delimiter' ;; (with default value "["), `org-hlc-hidden-lines-cookie-right-delimiter' ;; (with default value ']), `org-hlc-hidden-lines-cookie-left-signal-char' ;; (with default value "#") and ;; `org-hlc-hidden-lines-cookie-right-signal-char' (with default value ""). ;; Thus an exemplary folded headline with 165 hidden lines before the next ;; visible headline might look like this when hidden-lines-cookies are shown: ;; ,----------------- ;; | *** Headline [#165] ;; `----------------- ;;; Code: ;;;; Variables (defvar org-hlc-hidden-lines-cookies-on-p nil "If non-nil, hidden-lines cookies are shown, otherwise hidden.") (defgroup org-hlc nil "Enhanced library for outline navigation in source code buffers." :prefix "org-hlc-" :group 'org) (defcustom org-hlc-hidden-lines-cookie-left-delimiter "[" "Left delimiter of cookie that shows number of hidden lines." :group 'org-hlc :type 'string) (defcustom org-hlc-hidden-lines-cookie-right-delimiter "]" "Left delimiter of cookie that shows number of hidden lines." :group 'org-hlc :type 'string) (defcustom org-hlc-hidden-lines-cookie-left-signal-char "#" "Left signal character of cookie that shows number of hidden lines." :group 'org-hlc :type 'string) (defcustom org-hlc-hidden-lines-cookie-right-signal-char "" "Right signal character of cookie that shows number of hidden lines." :group 'org-hlc :type 'string) (defvar org-hlc-hidden-lines-cookie-format-regexp (concat "\\( " (regexp-quote org-hlc-hidden-lines-cookie-left-delimiter) (regexp-quote org-hlc-hidden-lines-cookie-left-signal-char) "\\)" "\\([[:digit:]]+\\)" "\\(" (regexp-quote org-hlc-hidden-lines-cookie-right-signal-char) ;; FIXME robust enough? (format "\\%s" org-hlc-hidden-lines-cookie-right-delimiter) "\\)") "Matches cookies that show number of hidden lines for folded subtrees.") ;;;; Functions ;; Calc and show line number of hidden body for all visible headlines (defun org-hlc-write-hidden-lines-cookies () "Show line number of hidden lines in folded headline." (save-excursion (goto-char (point-min)) (and (outline-on-heading-p) (org-hlc-hidden-lines-cookie-status-changed-p) (org-hlc-set-hidden-lines-cookie)) (while (not (eobp)) (outline-next-visible-heading 1) (and (outline-on-heading-p) (org-hlc-hidden-lines-cookie-status-changed-p) (org-hlc-set-hidden-lines-cookie))))) (defun org-hlc-hidden-lines-cookie-status-changed-p () "Return non-nil if hidden-lines cookie needs modification." (save-excursion (save-match-data (or (not (outline-body-visible-p)) (re-search-forward org-hlc-hidden-lines-cookie-format-regexp (line-end-position) 'NO-ERROR))))) (defun org-hlc-set-hidden-lines-cookie () "Calculate and set number of hidden lines in folded headline." (let* ((folded-p (not (outline-body-visible-p))) (line-num-current-header (line-number-at-pos)) (line-num-next-visible-header (save-excursion (outline-next-visible-heading 1) (line-number-at-pos))) (body-lines (1- (- line-num-next-visible-header line-num-current-header)))) (if (re-search-forward org-hlc-hidden-lines-cookie-format-regexp (line-end-position) 'NO-ERROR) (cond ((not folded-p) (replace-match "")) (folded-p (replace-match (format "%s" body-lines) nil nil nil 2))) (show-entry) (save-excursion (end-of-line) (insert (format " %s%s%s%s%s" org-hlc-hidden-lines-cookie-left-delimiter org-hlc-hidden-lines-cookie-left-signal-char body-lines org-hlc-hidden-lines-cookie-right-signal-char org-hlc-hidden-lines-cookie-right-delimiter))) (hide-entry)))) (defun org-hlc-show-hidden-lines-cookies () "Show hidden-lines cookies for all visible and folded headlines." (interactive) (org-hlc-write-hidden-lines-cookies) (setq org-hlc-hidden-lines-cookies-on-p 1)) (defun org-hlc-hide-hidden-lines-cookies () "Delete all hidden-lines cookies." (interactive) (let* ((base-buf (point-marker)) (indirect-buf-name (generate-new-buffer-name (buffer-name (marker-buffer base-buf))))) (clone-indirect-buffer indirect-buf-name nil 'NORECORD) (save-excursion (switch-to-buffer indirect-buf-name) (show-all) (let ((indirect-buf (point-marker))) (org-hlc-write-hidden-lines-cookies) (switch-to-buffer (marker-buffer base-buf)) (kill-buffer (marker-buffer indirect-buf)) (set-marker indirect-buf nil)) (set-marker base-buf nil))) (setq org-hlc-hidden-lines-cookies-on-p nil)) (defun org-hlc-toggle-hidden-lines-cookies () "Toggles status of hidden-lines cookies between shown and hidden." (interactive) (if org-hlc-hidden-lines-cookies-on-p (org-hlc-hide-hidden-lines-cookies) (org-hlc-show-hidden-lines-cookies))) (provide 'org-hlc) ;; Local variables: ;; generated-autoload-file: "org-loaddefs.el" ;; End: ;;; org-hlc.el ends here -- cheers, Thorsten