我基本上属于是那种什么事都想用Emacs来完成的人, 最近我打造除了一套独有的Org Mode展示工具.
其实这套东西并不复杂:它引入了两个函数, org-next-slide
及 org-prev-slide
, 我将它们的快捷键分别设置为 PgUp
与 PgDown
(Emacs的键码分别对应 <prior>
及 <next>
).
它还会将文本放大同时缩小左边距的空隙.
(defun org-next-slide () ;; move forward to the next top-level heading
(interactive)
(beginning-of-buffer) ;; navigate to the beginning of this header
(forward-char)
(widen) ;; expand to see the whole buffer
(if (search-forward-regexp ;; if we can find another header,
(rx line-start "* ") nil t)
(progn
(org-narrow-to-subtree) ;; go to it, narrow to it,
(show-all)) ;; and show all its sub-trees
(progn
(org-narrow-to-subtree) ;; otherwise let the user know we're
(beginning-of-buffer) ;; on the last slide
(message "Last slide"))))
(defun org-prev-slide () ;; as `org-next-slide`, but searching backwards
(interactive)
(beginning-of-buffer)
(widen)
(if (search-backward-regexp
(rx line-start "* ") nil t)
(progn
(org-narrow-to-subtree)
(show-all))
(progn
(org-narrow-to-subtree)
(beginning-of-buffer)
(message "First slide"))))
(defvar org-slides-mode-keymap ;; bind functions to page-up and page-down
(let ((map (make-sparse-keymap)))
(define-key map (kbd "<next>") 'org-next-slide)
(define-key map (kbd "<prior>") 'org-prev-slide)
map))
(define-minor-mode org-slides-mode ;; Synthesize into a minor mode
"View org-mode sub-trees as slides."
:lighter " Slides"
:keymap org-slides-mode-keymap
(progn
(set-face-attribute 'default nil :height 300) ;; big font
(set-variable 'left-margin-width '2 t) ;; little margin
(set-window-buffer (selected-window) (current-buffer)))) ;; don't change windows
Emacs的narrow-mode 可以只显示你关注的那部分文档内容. 这套工具就借助narrow-mode的这个特性,一次只展示一个 top-level heading
,结果就好像slides一样!
用Emacs作展示的想法来自于我最近在 Vancouver函数式编程会议 上作的一场关于Emacs Lisp的演示. 当时主要是想使用Org Mode中code-blocks 的功能.
Code blocks
允许你直接在Org文件中高亮显示代码,还能跳到一个临时buffer上用恰当的mode在平常的编程环境中修改代码.
Org Slides Mode
也有它的弱点: 它不支持显示图片与动画,只能显示出文本而已.
而且你还需要手工调整配色.
同时还没有备注,也不支持远程操控(这一点也许只要设置好快捷键就能搞定,只是麻烦了点).
不过一场展示中最核心的部分是现场编码(live-coding),交叉式的现场编码(interleaving living code),以及普通文本说明,这些东西用这种方式的展示效果还蛮不错的. 至于如何运用这些能力来做一场生动的演讲就看你的了.
Nat Knight — 2015-10-10