emacs-orgmode
[Top][All Lists]
Advanced

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

Re: [O] [NEW FEATURE] org-hlc.el - hidden-lines-cookies (hlc) for Org-mo


From: Rainer M. Krug
Subject: Re: [O] [NEW FEATURE] org-hlc.el - hidden-lines-cookies (hlc) for Org-mode
Date: Thu, 23 May 2013 09:19:30 +0200
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/24.3 (gnu/linux)


Thorsten Jolitz <address@hidden> writes:

> Hi List, 
>
> I ported this from outshine.el (i.e. outline-minor-mode) to Org-mode,
> hope it is useful. 

That looks very nice indeed and a very nice addition to the ellipsis
shown - I would definitely support that it is included in org and I
would use it.

Cheers,

Rainer


>
> 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 <tjolitz at gmail dot com>
> ;; 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 <http://www.gnu.org/licenses/>.
>
> ;;; 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

-- 
Rainer M. Krug

Attachment: pgpNMsAd6Ywui.pgp
Description: PGP signature


reply via email to

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