EMACS-DOCUMENT

=============>集思广益

用Emacs作展示

我基本上属于是那种什么事都想用Emacs来完成的人, 最近我打造除了一套独有的Org Mode展示工具. 其实这套东西并不复杂:它引入了两个函数, org-next-slideorg-prev-slide, 我将它们的快捷键分别设置为 PgUpPgDown (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