From: Thorsten Jolitz <tjolitz@gmail.com>
To: emacs-orgmode@gnu.org
Subject: [NEW FEATURE] org-hlc.el - hidden-lines-cookies (hlc) for Org-mode
Date: Wed, 22 May 2013 22:44:55 +0200 [thread overview]
Message-ID: <87zjvmiw1k.fsf@gmail.com> (raw)
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 <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
next reply other threads:[~2013-05-22 20:45 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-05-22 20:44 Thorsten Jolitz [this message]
2013-05-23 7:19 ` [NEW FEATURE] org-hlc.el - hidden-lines-cookies (hlc) for Org-mode Rainer M. Krug
2013-05-23 8:08 ` Carsten Dominik
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=87zjvmiw1k.fsf@gmail.com \
--to=tjolitz@gmail.com \
--cc=emacs-orgmode@gnu.org \
/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).