app/present: major rewrite; integrate org-tree-slide for org presentations

This commit is contained in:
Henrik Lissner 2017-04-11 09:24:20 -04:00
parent 0c23ff43a4
commit 6c10567e9e
4 changed files with 158 additions and 15 deletions

View file

@ -1,25 +1,90 @@
;;; app/present/autoload.el ;;; app/present/autoload.el
;; --- impatient-mode -------------------------------------------------------------
;;;###autoload ;;;###autoload
(defun +present/buffer () (defun +present/impatient-mode ()
(interactive) (interactive)
(require 'simple-httpd) (require 'simple-httpd)
(unless (process-status "httpd") (unless (process-status "httpd")
(httpd-start)) (httpd-start))
(unless impatient-mode (impatient-mode)
(impatient-mode +1))) (if impatient-mode
(add-hook 'kill-buffer-hook '+present--cleanup-impatient-mode)
(+present--cleanup-impatient-mode)))
(defun +present--cleanup-impatient-mode ()
(unless (cl-remove-if-not (lambda (buf) (buffer-local-value 'impatient-mode buf))
(doom-buffer-list))
(httpd-stop)
(remove-hook 'kill-buffer-hook '+present--cleanup-impatient-mode)))
;; --- org tree slides ------------------------------------------------------------
(defvar +present--overlays-list nil)
;;;###autoload
(defun +present/org-tree-slides ()
(interactive)
(unless (derived-mode-p 'org-mode)
(error "Not in an org buffer"))
(call-interactively 'org-tree-slide-mode)
(add-hook 'kill-buffer-hook '+present--cleanup-org-tree-slides-mode))
;;;###autoload
(defun +present|add-overlays ()
(add-to-invisibility-spec '(+present))
(save-excursion
;; hide org-mode options starting with #+
(goto-char (point-min))
(while (re-search-forward "^[[:space:]]*\\(#\\+\\)\\(\\(?:BEGIN\\|END\\|ATTR\\)[^[:space:]]+\\).*" nil t)
(+present--make-invisible
(match-beginning 1)
(match-end 0)))
;; hide stars in headings
(goto-char (point-min))
(while (re-search-forward "^\\(\\*+\\s-\\)" nil t)
(+present--make-invisible (match-beginning 1) (match-end 1)))))
;;;###autoload
(defun +present|remove-overlays ()
(mapc 'delete-overlay +present--overlays-list)
(remove-from-invisibility-spec '(+present)))
(defun +present--cleanup-org-tree-slides-mode ()
(unless (cl-remove-if-not (lambda (buf) (buffer-local-value 'org-tree-slide-mode buf))
(doom-buffers-in-mode 'org-mode))
(org-tree-slide-mode -1)
(remove-hook 'kill-buffer-hook '+present--cleanup-org-tree-slides-mode)))
(defun +present--make-invisible (beg end)
(let ((overlay (make-overlay beg end)))
(push overlay +present--overlays-list)
(overlay-put overlay 'invisible '+present)))
(defun +present--detect-slide ()
(outline-show-all)
(if (member "title" (org-get-tags-at))
(text-scale-set 10)
(text-scale-set +present-scale)))
;; --- misc -----------------------------------------------------------------------
(defvar +present--original-font +doom-font)
;;;###autoload ;;;###autoload
(define-minor-mode +present/big-mode (define-minor-mode +present/big-mode
:init-value nil :init-value nil
:lighter " BIG" :lighter " BIG"
:global t :global t
(if +present-big-mode (if +present/big-mode
(set-frame-font +present-big-font t t) (set-frame-font +present-big-font t t)
(set-frame-font +present-original-font t t))) (set-frame-font +present--original-font t t)))
;;;###autoload ;;;###autoload
(defun +present/stream () (defun +present/resize-frame-for-stream ()
"Resize the frame pixelwise, so that it fits directly into my livecoding.tv "Resize the frame pixelwise, so that it fits directly into my livecoding.tv
streaming layout." streaming layout."
(interactive) (interactive)

View file

@ -1,17 +1,25 @@
;;; app/present/config.el ;;; app/present/config.el
;; Sometimes you just get that powerful urge to show off. I don't have a fancy ;; Sometimes you just get that urge to show off. I don't have a fancy car, so
;; car, so Emacs will have to do. ;; my code or Emacs will have to do.
;;
;; Sometimes I stream my work on liveedu.tv, or record it on youtube, or peer
;; program over skype/teamviewer, or present at talks -- for all of this, Emacs
;; is my solution.
;; ;;
;; + `impatient-mode' lets me show off code, as I write it, in real-time over ;; + `impatient-mode' lets me show off code, as I write it, in real-time over
;; HTTP (see `+present/buffer') ;; HTTP (see `+present/buffer')
;; + `ox-reveal' adds a reveal.js exporter to org-mode ;; + `ox-reveal' adds a reveal.js exporter to org-mode
;; + `org-tree-slide' for presenting org buffers as slides, plus some hacks to
;; unclutter them.
;; + and `+present/big-mode' lets me toggle big fonts for streams or ;; + and `+present/big-mode' lets me toggle big fonts for streams or
;; screen-sharing ;; screen-sharing
;; Fonts for `+present/big-mode' (defvar +present-big-font (font-spec :family "Fira Mono" :size 18)
(defvar +present-original-font +doom-font) "Font to use when `+present/big-mode' is enabled.")
(defvar +present-big-font (font-spec :family "Fira Mono" :size 16))
(defvar +present-scale 7
"The `text-scale-amount' for `org-tree-slide-mode'.")
;; ;;
@ -21,12 +29,80 @@
(def-package! impatient-mode (def-package! impatient-mode
:commands impatient-mode) :commands impatient-mode)
;; reveal.js
(when (featurep! :lang org) (def-package! centered-window-mode
:commands centered-window-mode
:config
(setq cwm-use-vertical-padding t
cwm-frame-internal-border 110
cwm-left-fringe-ratio -10
cwm-centered-window-width 240))
(when (featurep! :lang org) ;; reveal.js
(if (bound-and-true-p org-modules-loaded) (if (bound-and-true-p org-modules-loaded)
(require 'ox-reveal) (require 'ox-reveal)
(add-hook! 'org-load (require 'ox-reveal))) (add-hook! 'org-load (require 'ox-reveal)))
(setq org-reveal-root "http://cdn.jsdelivr.net/reveal.js/3.0.0/" (setq org-reveal-root "http://cdn.jsdelivr.net/reveal.js/3.0.0/"
org-reveal-mathjax t)) org-reveal-mathjax t)
(def-package! org-tree-slide
:commands org-tree-slide-mode
:init
(after! org
(map! :map org-mode-map
"<f8>" '+present/org-tree-slides
"<f7>" '+present/next))
:config
(setq org-tree-slide-skip-outline-level 2
org-tree-slide-activate-message " "
org-tree-slide-deactivate-message " "
org-tree-slide-modeline-display nil)
(org-tree-slide-simple-profile)
(map! :map org-tree-slide-mode-map
[right] 'org-tree-slide-move-next-tree
[left] 'org-tree-slide-move-previous-tree)
(add-hook! 'org-tree-slide-mode-after-narrow-hook
'(+present|detect-slide +present|add-overlays org-display-inline-images))
(add-hook! 'org-tree-slide-mode-hook
(doom/window-zoom)
(let ((arg (if org-tree-slide-mode +1 -1)))
(when (featurep 'doom-themes)
(doom-buffer-mode (* arg -1)))
(centered-window-mode arg)
(window-divider-mode (* arg -1))
(doom-hide-modeline-mode arg)
(cond (org-tree-slide-mode
(org-indent-mode -1)
(text-scale-set +present-scale)
(ignore-errors (org-preview-latex-fragment '(4)))
(set-face-attribute 'org-level-2 nil :height 1.4))
(t
(org-indent-mode +1)
(text-scale-set 0)
(org-remove-latex-fragment-image-overlays)
(set-face-attribute 'org-level-2 nil :height 1.0)
(+present|remove-overlays)
(org-remove-inline-images)))))
(defun +present*org-tree-slide-narrow-exclude-header (orig-fn &rest args)
(cl-letf (((symbol-function 'org-narrow-to-subtree)
(lambda () (save-excursion
(save-match-data
(org-with-limited-levels
(narrow-to-region
(progn (org-back-to-heading t)
(forward-line 1)
(point))
(progn (org-end-of-subtree t t)
(when (and (org-at-heading-p) (not (eobp))) (backward-char 1))
(point)))))))))
(apply orig-fn args)))
(advice-add 'org-tree-slide--display-tree-with-narrow
:around '+present*org-tree-slide-narrow-exclude-header)))

View file

@ -1,6 +1,8 @@
;; -*- no-byte-compile: t; -*- ;; -*- no-byte-compile: t; -*-
;;; app/present/packages.el ;;; app/present/packages.el
(package! centered-window-mode)
(package! htmlize) (package! htmlize)
(package! impatient-mode) (package! impatient-mode)
(package! org-tree-slide)
(package! ox-reveal) (package! ox-reveal)

View file

@ -126,7 +126,7 @@
:desc "Fullscreen" :n "f" 'doom/toggle-fullscreen :desc "Fullscreen" :n "f" 'doom/toggle-fullscreen
:desc "Indent guides" :n "i" 'highlight-indentation-mode :desc "Indent guides" :n "i" 'highlight-indentation-mode
:desc "Indent guides (column)" :n "I" 'highlight-indentation-current-column-mode :desc "Indent guides (column)" :n "I" 'highlight-indentation-current-column-mode
:desc "Impatient-mode" :n "h" '+present/buffer :desc "Impatient mode" :n "h" '+present/impatient-mode
:desc "Big mode" :n "b" '+present/big-mode) :desc "Big mode" :n "b" '+present/big-mode)
(:desc "Tmux/Terminal" (:desc "Tmux/Terminal"