diff --git a/modules/config/default/+evil-bindings.el b/modules/config/default/+evil-bindings.el index 8bf7742be..efd62d817 100644 --- a/modules/config/default/+evil-bindings.el +++ b/modules/config/default/+evil-bindings.el @@ -615,7 +615,7 @@ :desc "Indent style" "I" #'doom/toggle-indent-style :desc "Line numbers" "l" #'doom/toggle-line-numbers (:when (featurep! :lang org +present) - :desc "org-tree-slide mode" "p" #'+org-present/start) + :desc "org-tree-slide mode" "p" #'org-tree-slide-mode) :desc "Read-only mode" "r" #'read-only-mode (:when (featurep! :checkers spell) :desc "Flyspell" "s" #'flyspell-mode) diff --git a/modules/lang/org/autoload/contrib-present.el b/modules/lang/org/autoload/contrib-present.el index 0a4925146..6f40b31af 100644 --- a/modules/lang/org/autoload/contrib-present.el +++ b/modules/lang/org/autoload/contrib-present.el @@ -9,10 +9,13 @@ if (buffer-local-value 'org-tree-slide-mode buf) return t) (org-tree-slide-mode -1) - (remove-hook 'kill-buffer-hook #'+org-present--cleanup-org-tree-slides-mode))) + (remove-hook 'kill-buffer-hook #'+org-present--cleanup-org-tree-slides-mode + 'local))) (defun +org-present--make-invisible (beg end) - (let ((overlay (make-overlay beg end))) + (unless (assq '+org-present buffer-invisibility-spec) + (add-to-invisibility-spec '(+org-present))) + (let ((overlay (make-overlay beg (1+ end)))) (push overlay +org-present--overlays) (overlay-put overlay 'invisible '+org-present))) @@ -21,19 +24,21 @@ ;;; Hooks ;;;###autoload -(defun +org-present-add-overlays-h () - "TODO" - (add-to-invisibility-spec '(+org-present)) +(defun +org-present-hide-blocks-h () + "Hide org #+ constructs." (save-excursion - ;; hide org-mode options starting with #+ (goto-char (point-min)) (while (re-search-forward "^[[:space:]]*\\(#\\+\\)\\(\\(?:BEGIN\\|END\\|ATTR\\)[^[:space:]]+\\).*" nil t) (+org-present--make-invisible (match-beginning 1) - (match-end 0))) - ;; hide stars in headings + (match-end 0))))) + +;;;###autoload +(defun +org-present-hide-leading-stars-h () + "Hide leading stars in headings." + (save-excursion (goto-char (point-min)) - (while (re-search-forward "^\\(\\*+\\s-\\)" nil t) + (while (re-search-forward "^\\(\\*+\\)" nil t) (+org-present--make-invisible (match-beginning 1) (match-end 1))))) ;;;###autoload @@ -55,43 +60,35 @@ (defvar cwm-left-fringe-ratio) (defvar cwm-centered-window-width) ;;;###autoload -(defun +org-present-init-org-tree-window-h () +(defun +org-present-prettify-slide-h () "TODO" "Set up the org window for presentation." (doom/window-maximize-buffer) (let ((arg (if org-tree-slide-mode +1 -1))) (when (fboundp 'centered-window-mode) - (let ((cwm-use-vertical-padding t) - (cwm-frame-internal-border 110) - (cwm-left-fringe-ratio -10) - (cwm-centered-window-width 240)) - (centered-window-mode arg))) - (window-divider-mode (* arg -1)) + (setq-local cwm-use-vertical-padding t) + (setq-local cwm-frame-internal-border 100) + (setq-local cwm-left-fringe-ratio -10) + (setq-local cwm-centered-window-width 300) + (centered-window-mode arg)) (hide-mode-line-mode arg) (+org-pretty-mode arg) (cond (org-tree-slide-mode - (org-indent-mode -1) + (set-window-fringes nil 0 0) + (when (bound-and-true-p solaire-mode) + (solaire-mode -1) + (fringe-mode 0)) + (when (bound-and-true-p flyspell-mode) + (flyspell-mode -1)) + (add-hook 'kill-buffer-hook #'+org-present--cleanup-org-tree-slides-mode + nil 'local) (text-scale-set +org-present-text-scale) - (ignore-errors (org-latex-preview '(4))) - (set-face-attribute 'org-level-2 nil :height 1.4)) + (ignore-errors (org-latex-preview '(4)))) (t - (org-indent-mode +1) (text-scale-set 0) + (set-window-fringes nil fringe-mode fringe-mode) (org-clear-latex-preview) - (set-face-attribute 'org-level-2 nil :height 1.0) (+org-present-remove-overlays-h) - (org-remove-inline-images))))) - - -;; -;;; Commands - -(defvar +org-present--overlays nil) -;;;###autoload -(defun +org-present/start () - "TODO" - (interactive) - (unless (derived-mode-p 'org-mode) - (error "Not in an org buffer")) - (call-interactively #'org-tree-slide-mode) - (add-hook 'kill-buffer-hook #'+org-present--cleanup-org-tree-slides-mode)) + (org-remove-inline-images) + (org-mode))) + (redraw-display))) diff --git a/modules/lang/org/contrib/present.el b/modules/lang/org/contrib/present.el index c882c4435..b6c329b02 100644 --- a/modules/lang/org/contrib/present.el +++ b/modules/lang/org/contrib/present.el @@ -1,7 +1,7 @@ ;;; lang/org/contrib/present.el -*- lexical-binding: t; -*- ;;;###if (featurep! +present) -(defvar +org-present-text-scale 7 +(defvar +org-present-text-scale 6 "The `text-scale-amount' for `org-tree-slide-mode'.") (after! ox @@ -24,31 +24,37 @@ (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-modeline-display nil + org-tree-slide-heading-emphasis t) - (map! :map org-tree-slide-mode-map - :n [right] #'org-tree-slide-move-next-tree - :n [left] #'org-tree-slide-move-previous-tree) + (add-hook 'org-tree-slide-mode-after-narrow-hook #'org-display-inline-images) + (add-hook! 'org-tree-slide-mode-hook + #'+org-present-hide-blocks-h + #'+org-present-prettify-slide-h) - (add-hook! 'org-tree-slide-mode-after-narrow-hook - #'+org-present-detect-slide-h - #'+org-present-add-overlays-h - #'org-display-inline-images) - - (add-hook 'org-tree-slide-mode-hook #'+org-present-init-org-tree-window-h) + (when (featurep! :editor evil) + (map! :map org-tree-slide-mode-map + :n [C-right] #'org-tree-slide-move-next-tree + :n [C-left] #'org-tree-slide-move-previous-tree) + (add-hook 'org-tree-slide-mode-hook #'evil-normalize-keymaps)) (defadvice! +org-present--narrow-to-subtree-a (orig-fn &rest args) "Narrow to the target subtree when you start the presentation." :around #'org-tree-slide--display-tree-with-narrow (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))))))))) + (lambda () + (save-excursion + (save-match-data + (org-with-limited-levels + (narrow-to-region + (progn + (when (org-before-first-heading-p) + (org-next-visible-heading 1)) + (ignore-errors (org-up-heading-all 99)) + (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))))