emacs-orgmode@gnu.org archives
 help / color / mirror / code / Atom feed
From: Carsten Dominik <carsten.dominik@gmail.com>
To: Thorsten Jolitz <tjolitz@gmail.com>
Cc: emacs-orgmode@gnu.org
Subject: Re: [NEW FEATURE] org-hlc.el - hidden-lines-cookies (hlc) for Org-mode
Date: Thu, 23 May 2013 10:08:01 +0200	[thread overview]
Message-ID: <6219E7E2-9951-4B05-A977-DE0DD1B120BE@gmail.com> (raw)
In-Reply-To: <87zjvmiw1k.fsf@gmail.com>

[-- Attachment #1: Type: text/plain, Size: 9135 bytes --]

Hi Thorsten,

On 22 mei 2013, at 22:44, Thorsten Jolitz <tjolitz@gmail.com> wrote:

> 
> 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]
> `---------------------------------------------------------------------



This is is definitely a nice feature.  Herbert Sitz has
this in his vimorganizer implementation for vi,

http://vimeo.com/16543959

and we have been jealous of this feature ever since.


However, I don't think the implementation is the right
one.  Modifying the file to display this does not seem right.
I would say it should use text properties or maybe
overlays for display, and it should be hooked somehow into the
folding/unfolding routines to auto-update.

Cheers!

- Carsten

> 
> 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
> 
> 
> 
> 
> -- 
> cheers,
> Thorsten
> 
> 
> 


[-- Attachment #2: Type: text/html, Size: 12411 bytes --]

  parent reply	other threads:[~2013-05-23  8:08 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-05-22 20:44 [NEW FEATURE] org-hlc.el - hidden-lines-cookies (hlc) for Org-mode Thorsten Jolitz
2013-05-23  7:19 ` Rainer M. Krug
2013-05-23  8:08 ` Carsten Dominik [this message]
2013-05-23 10:30   ` Thorsten Jolitz
2013-05-24  5:34     ` Nick Dokos
2013-05-24 13:56       ` Thorsten Jolitz
2013-05-24 13:52   ` Thorsten Jolitz
2013-05-24 15:49     ` François Pinard
2013-05-24 17:45       ` Thorsten Jolitz

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://www.orgmode.org/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=6219E7E2-9951-4B05-A977-DE0DD1B120BE@gmail.com \
    --to=carsten.dominik@gmail.com \
    --cc=emacs-orgmode@gnu.org \
    --cc=tjolitz@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs/org-mode.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).