-
Notifications
You must be signed in to change notification settings - Fork 0
/
slidify-pages.el
104 lines (86 loc) · 3.31 KB
/
slidify-pages.el
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
;;; slidify-pages.el --- Slide-style page navigation -*- lexical-binding: t -*-
;; Copyright © 2015 Eli Naeher <eli@naeher.name>
;; Author: Eli Naeher <eli@naeher.name>
;; URL: https://github.com/enaeher/slidify-pages
;; This file is NOT part of GNU Emacs.
;; 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, 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 GNU Emacs; see the file COPYING. If not, write to the
;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
;; Boston, MA 02110-1301, USA.
;;; Commentary:
;;
;; This dirt-simple minor mide provides slide-style page
;; navigation. It is intended to facilitate using Emacs for
;; presentations that involve code samples and interactive code use,
;; while being sufficiently unobtrusive to co-exist peacefully with
;; your preferred code editing modes.
;;
;;; Code:
(defun slidify-pages--update-mode-line ()
"Sets the mode line lighter to indicate the current page and
the total number of pages. Called after every page change, and
when the mode is first enabled."
(setq slidify-pages-mode-line
(concat " Page " (number-to-string (slidify-pages-current-page-number))
" of " (number-to-string (slidify-pages-total-pages)))))
;;;###autoload
(defun slidify-pages-previous-page ()
"Navigate to the previous page."
(interactive)
(goto-char (point-min))
(widen)
(backward-page)
(backward-page)
(narrow-to-page)
(slidify-pages--update-mode-line))
;;;###autoload
(defun slidify-pages-next-page ()
"Navigate to the next page."
(interactive)
(forward-page)
(narrow-to-page)
(slidify-pages--update-mode-line))
(defun slidify-pages-current-page-number ()
"Returns the 1-indexed number of the page at point."
(save-restriction
(widen)
(1+ (how-many page-delimiter (point-min) (point)))))
(defun slidify-pages-total-pages ()
"Returns the total number of pages in the buffer."
(save-restriction
(widen)
(1+ (how-many page-delimiter (point-min)))))
(defun slidify-pages--enable ()
(narrow-to-page)
(read-only-mode 1))
(defun slidify-pages--disable ()
(widen)
(read-only-mode 0))
(defvar slidify-pages-mode-map (make-sparse-keymap) "Slidify-Pages keymap.")
(define-key slidify-pages-mode-map (kbd "<left>") 'slidify-pages-previous-page)
(define-key slidify-pages-mode-map (kbd "<right>") 'slidify-pages-next-page)
;;;###autoload
(define-minor-mode slidify-pages-mode
"A minor mode allowing slide-style navigation between pages,
with automatic narrowing of the buffer to the current page.
Pages are delimited by the built-in Emacs `page-delimiter'
variable. While in slidify-pages-mode, the buffer is made read-only."
:init-value nil
:lighter slidify-pages-mode-line
:keymap slidify-pages-mode-map
(if slidify-pages-mode
(slidify-pages--enable)
(slidify-pages--disable))
(slidify-pages--update-mode-line))
(provide 'slidify-pages)
;; end of slidify-pages.el