From: Russell Adams <RLAdams@AdamsInfoServ.Com>
To: emacs-orgmode@gnu.org
Subject: Re: Read only org view mode
Date: Mon, 24 Jan 2022 12:11:40 +0100 [thread overview]
Message-ID: <Ye6JbBwo0Wzqpq/X@maokai> (raw)
In-Reply-To: <AM9PR09MB49775555B99A79C761BAAEEA965D9@AM9PR09MB4977.eurprd09.prod.outlook.com>
Why not just do an ASCII export to a temporary read only buffer for
viewing?
I always thought the point of Org was to have minimal markup so that
the native file was plainly legible.
On Sun, Jan 23, 2022 at 08:19:12AM +0100, Arthur Miller wrote:
> Hi mailing list,
>
> is something like this of interest to add to org-mode?
>
> Attached is a prototype to a read-only view mode. It tries to hide as much of
> markup as possible to make it more "readable". It uses built-in view-mode to
> make the buffer read only and enable some common commands. I plan to add more
> "dired like" movement though.
>
> I don't claim it is very well written or efficient; I appreciate input on that
> regard. To note is that I use minor-modes as "toggles", to make the
> functionality avialable as "solo pieces" as well as a code generation tool.
>
> I am just checking interest here. More info and a screencast are avialable at:
>
> https://github.com/amno1/org-view-mode
>
> ;;; org-view-mode.el --- Read-only viewer with less markup clutter in org mode files -*- lexical-binding: t; -*-
>
> ;; Copyright (C) 2021 Arthur Miller
>
> ;; Author: Arthur Miller <arthur.miller@live.com>
> ;; Keywords: convenience, outlines, tools
>
> ;; This program 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.
>
> ;; This program 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 this program. If not, see <https://www.gnu.org/licenses/>.
>
> ;; Author: Arthur Miller
> ;; Version: 0.0.1
> ;; Keywords: tools convenience
> ;; Package-Requires: ((emacs "24.1"))
> ;; URL: https://github.com/amno1/org-view-mode
>
> ;;; Commentary:
>
> ;; A minor mode to help reduce clutter in org-mode files by
> ;; hiding/unhiding org-mode markup language
> ;;
> ;; To turn it on execute:
> ;;
> ;; `M-x org-view-mode'.
> ;;
> ;; To turn it off execute the same command.
>
> ;;; Issues
>
> ;;; Code:
> (require 'org)
>
> (defgroup org-view nil
> "Hide tags in org-headings."
> :prefix "org-view-"
> :group 'org)
>
> (defvar-local org-view-center-credentials nil
> "Whether to align title and author in center or not.
>
> Centering is done pixel wise relative to window width.")
>
> (defcustom org-view-diminish-mode t
> "Hide lighters for individual minor modes when org-view-mode is on."
> :type 'boolean
> :group 'org-view)
>
> (defvar org-view-stars-re "^[ \t]*\\*+"
> "Regex used to recognize leading stars in org-headings.")
>
> (defvar org-view-credentials-re "[ \t]*#\\+\\(TITLE\\|AUTHOR\\):"
> "Regex used to update author and title lines.")
>
> (defun org-view--update-tags (visibility)
> "Update invisible property to VISIBILITY for tags in the current buffer."
> (save-excursion
> (goto-char (point-min))
> (with-silent-modifications
> (while (re-search-forward org-view-stars-re nil t)
> (goto-char (line-end-position))
> (when (re-search-backward org-tag-line-re (line-beginning-position) t)
> (put-text-property
> (match-beginning 1) (match-end 1) 'invisible visibility))
> (forward-line)))))
>
> (defun org-view--update-keywords (visibility)
> "Set VISIBILITY for each line starting with a keyword from KEYWORDS list."
> (org-with-wide-buffer
> (save-excursion
> (with-silent-modifications
> (goto-char (point-min))
> (while (re-search-forward "^[ \t]*#\\+.*$" nil t)
> (goto-char (match-beginning 0))
> (unless (looking-at-p org-view-credentials-re)
> (put-text-property
> (1- (match-beginning 0)) (match-end 0) 'invisible visibility))
> (goto-char (match-end 0)))))))
>
> (defun org-view--update-properties (visibility)
> "Set invisible property to VISIBILITY for properties in the current buffer."
> (org-with-wide-buffer
> (save-excursion
> (with-silent-modifications
> (goto-char (point-min))
> (while (re-search-forward org-property-drawer-re nil t)
> (put-text-property
> (match-beginning 0) (match-end 0) 'invisible visibility))
> (goto-char (point-min))
> (while (re-search-forward "^[ \t]*#\\+PROPERTY:.*$" nil t)
> (put-text-property
> (1- (match-beginning 0)) (1+ (match-end 0)) 'invisible visibility))))))
>
> (defun org-view--update-stars (visibility)
> "Update invisible property to VISIBILITY for markers in the current buffer."
> (org-with-wide-buffer
> (save-excursion
> (goto-char (point-min))
> (with-silent-modifications
> (while (re-search-forward org-view-stars-re nil t)
> (put-text-property
> (match-beginning 0) (match-end 0) 'invisible visibility))))))
>
> (defun org-view--update-credentials (visibility)
> "Set invisible property to VISIBILITY for export settings."
> (org-with-wide-buffer
> (save-excursion
> (with-silent-modifications
> (goto-char (point-min))
> (while (re-search-forward org-view-credentials-re nil t)
> (put-text-property
> (match-beginning 0) (match-end 0) 'invisible visibility)
> (when org-view-center-credentials
> (org-view--center-in-window visibility)))
> (goto-char (point-min))))))
>
> (defun org-view--center-in-window (center)
> "Center a line in a window pixel wise."
> (save-excursion
> (goto-char (line-beginning-position))
> (let ((end (line-end-position))
> (beg (line-beginning-position)))
> (if center
> (let* ((line (buffer-substring beg end))
> (length (/ (string-pixel-width line) 2)))
> (put-text-property
> beg (1+ beg) 'display `(space :align-to (- center (,length)))))
> (remove-text-properties beg (1+ beg) '(display nil))))))
>
> ;;;###autoload
> (define-minor-mode org-view-hide-tags-mode
> "Hide/show tags in org-headings."
> :global nil :lighter " org-htm"
> (unless (derived-mode-p 'org-mode)
> (error "Not in org-mode"))
> (org-view--update-tags org-view-hide-tags-mode))
>
> ;;;###autoload
> (define-minor-mode org-view-hide-stars-mode
> "Hide/show leading stars in org-headings."
> :global nil :lighter " org-hsm"
> (unless (derived-mode-p 'org-mode)
> (error "Not in org-mode"))
> (org-view--update-stars org-view-hide-stars-mode))
>
> ;;;###autoload
> (define-minor-mode org-view-hide-keywords-mode
> "Hide/show leading stars in org-headings."
> :global nil :lighter " org-hkm"
> (unless (derived-mode-p 'org-mode)
> (error "Not in org-mode"))
> (org-view--update-keywords org-view-hide-stars-mode))
>
> ;;;###autoload
> (define-minor-mode org-view-hide-properties-mode
> "Hide/show properties and property drawers."
> :global nil :lighter " org-hpm"
> (unless (derived-mode-p 'org-mode)
> (error "Not in org-mode"))
> (org-view--update-properties org-view-hide-properties-mode))
>
> ;;;###autoload
> (define-minor-mode org-view-pretty-credentials-mode
> "Prettify credentials in org-buffers."
> :global nil :lighter " org-pcm"
> (unless (derived-mode-p 'org-mode)
> (error "Not in org-mode"))
> (org-view--update-credentials org-view-pretty-credentials-mode))
>
> (defun org-view-quit ()
> (interactive)
> (org-view-mode -1)
> (message "org-view mode disabled in current buffer"))
>
> (defvar-keymap org-view-mode-map
> :doc "Keymap for ‘ORG-view-mode’"
> "c" #'org-view-quit
> "C" #'org-view-quit
> "e" #'org-view-quit
> "E" #'org-view-quit
> "q" #'org-view-quit
> "Q" #'org-view-quit)
>
> ;;;###autoload
> (define-minor-mode org-view-mode
> "Hide/show babel source code blocks on demand."
> :global nil :lighter " org-view" :keymap org-view-mode-map
> (unless (derived-mode-p 'org-mode)
> (error "Not in org-mode"))
> (cond (org-view-mode
> (org-view-hide-tags-mode org-view-mode)
> (org-view-hide-stars-mode org-view-mode)
> (org-view-hide-keywords-mode org-view-mode)
> (org-view-hide-properties-mode org-view-mode)
> (org-view-pretty-credentials-mode org-view-mode)
> (when org-view-diminish-mode
> (dolist (mode '(org-view-hide-tags-mode
> org-view-hide-stars-mode
> org-view-hide-keywords-mode
> org-view-hide-properties-mode
> org-view-pretty-credentials-mode))
> (let ((mode-str (cdr (assq mode minor-mode-alist))))
> (setcar mode-str ""))))
> (view-mode +1))
> (t (view-mode -1)
> (org-view-hide-tags-mode -1)
> (org-view-hide-stars-mode -1)
> (org-view-hide-keywords-mode -1)
> (org-view-hide-properties-mode -1)
> (org-view-pretty-credentials-mode -1))))
>
> (provide 'org-view-mode)
>
> ;;; org-view-mode.el ends here
------------------------------------------------------------------
Russell Adams RLAdams@AdamsInfoServ.com
PGP Key ID: 0x1160DCB3 http://www.adamsinfoserv.com/
Fingerprint: 1723 D8CA 4280 1EC9 557F 66E8 1154 E018 1160 DCB3
next prev parent reply other threads:[~2022-01-24 11:13 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-01-23 7:19 Read only org view mode Arthur Miller
2022-01-24 6:20 ` Marcin Borkowski
2022-01-24 10:30 ` Neil Jerram
2022-01-24 11:11 ` Russell Adams [this message]
2022-01-24 11:40 ` Neil Jerram
2022-01-24 12:58 ` Russell Adams
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=Ye6JbBwo0Wzqpq/X@maokai \
--to=rladams@adamsinfoserv.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).