蚊章汇 - John Goerzen
type: channel
link: https://linuxcn.bwsl.wang/author/885/
description: John Goerzen
items: Emacs 系列（五）：Org 模式之文档与演示稿
items: Emacs 系列（四）：使用 Org 模式自动管理邮件及同步文档
items: Emacs 系列（三）： Org 模式的补充
items: Emacs 系列（二）：Org 模式介绍
items: Emacs 系列（一）：抛掉一切，投入 Emacs 和 Org 模式的怀抱
items: Docker 容器中的老式 DOS BBS

Emacs 系列（五）：Org 模式之文档与演示稿
type: item
date: 2018-12-13T06:59:00+08:00
description: 这是 Emacs 和 Org 模式系列的第五篇。这篇博文是由 Org 模式的源文件生成的，其有几种格式：博客页面、演示稿 和 PDF 文档。1 Org 模式的输出1.1 背景Org 模式不仅仅只是一个议程生成程序，它也能输出许多不同的格式： LaTeX、PDF、Beamer、iCalendar（议程）、HTML、Markdown、ODT、普通文本、手册页和其它更多的复杂的格式，比如说网页文件。这也不只是一些事后的想法，这是 Org 模式的设计核心部分并且集成的很好。这一个文件可以同时是源代码、自动生成的输出、任务列表、文档和展示。有些人将 Org 模式作为他们首选的标记格式，甚至对于 LaTeX 文档也是如此。Org 模式手册中的 输出一节 有更详细的介绍。1.2 开始对于任意的 Org 模式的文档，只要按下 C-c C-e 键，就会弹出一个让你选择多种输出格式和选项的菜单。这些选项通常是次键选择，所以很容易设置和执行。例如：要输出一个 PDF 文档，按 C-c C-e l p，要输出 HMTL 格式的， 按 C-c C-e h h。对于所有的输出选项，都有许多可用的设置；详情参见手册。事实上，使用 LaTeX 格式相当于同时使用 LaTeX 和 HTML 模式，在不同的模式中插入任意的前言和设置等。1.3 第三方插件ELPA 中也包含了许多额外的输出格式，详情参见 ELPA。2 Org 模式的 Beamer 演示2.1 关于 BeamerBeamer) 是一个生成演示稿的 LaTeX 环境. 它包括了以下特性：在演示稿中自动生成结构化的元素（例如 Marburg 主题)。 在演示稿中，这个特性可以为观众提供了视觉参考。对组织演示稿有很大的帮助。主题完全支持 LaTeX2.2 Org 模式中 Beamer 的优点在 Org 模式中用 Beamer 有很多好处，总的来说：Org 模式很简单而且对可视化支持的很好，同时改变结构可以快速的重组你的材料。与 org-babel 绑定在一起，实时语法高亮源码和内嵌结果。语法通常更容易使用。我已经完全用 Org 模式和 beamer 替换掉使用 LibreOffice/Powerpoint/GoogleDocs。事实上，当我必须使用其中一种工具时，这是相当令人沮丧的，因为它们在可视化表示演讲稿结构方面远远比不上 Org 模式。2.3 标题层次Org 模式的 Beamer 会将你文档中的部分（文中定义了标题的）转换成幻灯片。当然，问题是：哪些部分？这是由 H 输出设置（org-export-headline-levels）决定的。针对不同的人，有许多不同的方法。我比较喜欢我的演示稿这样：#+OPTIONS: H:2 #+BEAMER_HEADER: \AtBeginSection{\frame{\sectionpage}}这将为每个主题提供了独立部分，以突出主题的改变然后使用级别 2（两个星号）的标题来设置幻灯片。许多 Beamer 主题也有第三个间接层次，所以你可以将 H 设为 3。2.4 主题和配置你可以在 Org 模式的文件顶部来插入几行来配置 Beamer 和 LaTeX。在本文中，例如，你可以这样定义：#+TITLE: Documents and presentations with org-mode #+AUTHOR: John Goerzen #+BEAMER_HEADER: \institute{The Changelog} #+PROPERTY: comments yes #+PROPERTY: header-args :exports both :eval never-export #+OPTIONS: H:2 #+BEAMER_THEME: CambridgeUS #+BEAMER_COLOR_THEME: default2.5 高级设置我比教喜欢修改颜色、项目符号样式等。我的配置如下：# We can't just +BEAMER_INNER_THEME: default because that picks the theme default. # Override per https://tex.stackexchange.com/questions/11168/change-bullet-style-formatting-in-beamer #+BEAMER_INNER_THEME: default #+LaTeX_CLASS_OPTIONS: [aspectratio=169] #+BEAMER_HEADER: \definecolor{links}{HTML}{0000A0} #+BEAMER_HEADER: \hypersetup{colorlinks=,…

Emacs 系列（四）：使用 Org 模式自动管理邮件及同步文档
type: item
date: 2018-12-11T21:05:44+08:00
description: 这是 Emacs 和 Org 模式系列的第四篇。至今为止，你已经见识到了 Org 模式的强大和高效，如果你像我一样，你可能会想：“我真的很想让它在我所有的设备上同步。”或者是说：“我能在 Org 模式中转发邮件吗？”答案当然是肯定的，因为这就是 Emacs。同步由于 Org 模式只使用文本文件，所以使用任意工具都可以很容易地实现同步。我使用的是 git 的 git-remote-gcrypt。由于 git-remote-gcrypt 的一些限制，每台机器都倾向于推到自己的分支，并使用命令来控制。每台机器都会先合并其它所有的分支，然后再将合并后的结果推送到主干上。cron 作业可以实现将机器上的分支推送上去，而 elisp 会协调这一切 —— 确保在同步之前保存缓冲区，在同步之后从磁盘刷新缓冲区，等等。这篇文章的代码有点多，所以我将把它链接到 github 上，而不是写在这里。我有一个用来存放我所有的 Org 模式的文件的目录 $HOME/org，在 ~/org 目录下有个 Makefile 文件来处理同步。该文件定义了以下目标：push： 添加、提交和推送到以主机命名的分支上fetch： 一个简单的 git fetch 操作sync： 添加、提交和拉取远程的修改，合并，并（假设合并成功）将其推送到以主机命名的分支和主干上现在，在我的用户 crontab 中有这个：*/15 * * * * make -C $HOME/org push fetch 2>&1 | logger --tag 'orgsync'与之相关的 elisp 代码 定义了一个快捷键（C-c s）来调用同步。多亏了 cronjob，只要文件被保存 —— 即使我没有在另一个机器上同步 —— 它们也会被拉取进来。我发现这个设置非常好用。用 Org 模式发邮件在继续下去之前，首先要问自己一下：你真的需要它吗？ 我用的是带有 mu4e 的 Org 模式，而且它集成的也很好；任何 Org 模式的任务都可以通过 Message-id 链接到电子邮件，这很理想 —— 它可以让一个人做一些事情，比如提醒他在一周内回复一条消息。然而，Org 模式不仅仅只有提醒。它还是一个知识库、创作系统等，但是并不是我所有的邮件客户端都使用 mu4e。(注意：移动设备中有像 MobileOrg 这样的应用)。我并没有像我想的那样经常使用它，但是它有它的用途，所以我认为我也应该在这里记录它。现在我不仅想处理纯文本电子邮件。我希望能够处理附件、HTML 邮件等。这听起来很快就有问题了 —— 但是通过使用 ripmime 和 pandoc 这样的工具，情况还不错。第一步就是要用某些方法将获取到的邮件放入指定的文件夹下。扩展名、特殊用户等。然后我用一个 fetchmail 配置 来将它拉取下来并运行我自己的 insorgmail 脚本。这个脚本就是处理所有有趣的部分了。它开始用 ripmime 处理消息，用 pandoc 将 HTML 的部分转换为 Org 模式的格式。 Org 模式的层次结构是用来尽可能最好地表示 email 的结构。使用 HTML 和其他工具时，email 可能会变得相当复杂，但我发现这对于我来说是可以接受的。下一篇我最后一篇关于 Org 模式的文章将讨论如何使用它来编写文档和准备幻灯片 —— 我发现自己对 Org 模式的使用非常满意，但这需要一些调整。via: http://changelog.complete.org/archives/9898-emacs-4-automated-emails-to-org-mode-and-org-mode-syncing作者：John Goerzen 译者：oneforalone 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出

Emacs 系列（三）： Org 模式的补充
type: item
date: 2018-12-10T03:50:15+08:00
description: 这是 Emacs 和 Org 模式系列的第三篇。Todo 的跟进及关键字当你使用 Org 模式来跟进你的 TODO 时，它有多种状态。你可以用 C-c C-t 来快速切换状态。我将它设为这样：(setq org-todo-keywords '( (sequence "TODO(t!)" "NEXT(n!)" "STARTED(a!)" "WAIT(w@/!)" "OTHERS(o!)" "|" "DONE(d)" "CANCELLED(c)") ))在这里，我设置了一个任务未完成的五种状态：TODO、NEXT、STARTED、WAIT 及 OTHERS。每一个状态都有单个字的快捷键（t、n、a 等）。管道符（|）之后的状态被认为是“完成”的状态。我有两个“完成”状态：DONE（已经完成）及 CANCELLED（还没完成，但由于其它的原因无法完成）。! 的含义是记录某项更改为状态的时间。我不把这个添加到完成的状态，是因为它们已经被记录了。@ 符号表示带理由的提示，所以当切换到 WAIT 时，Org 模式会问我为什么，并将这个添加到笔记中。以下是项目状态发生变化的例子：** DONE This is a test CLOSED: [2018-03-02 Fri 03:05] - State "DONE" from "WAIT" [2018-03-02 Fri 03:05] - State "WAIT" from "TODO" [2018-03-02 Fri 03:05] \\ waiting for pigs to fly - State "TODO" from "NEXT" [2018-03-02 Fri 03:05] - State "NEXT" from "TODO" [2018-03-02 Fri 03:05]在这里，最新的项目在最上面。议程模式，日程及期限当你处在一个待办事项时，C-c C-s 或 C-c C-d 可以为其设置相应的日程或期限。这些都是在议程模式中的功能。它们的区别在于其意图和表现。日程是你希望在某个时候完成的事情，而期限是在某个特定的时间应该完成的事情。默认情况下，议程视图将在项目的截止日期前提醒你。在此过程中，议程视图将显示即将出现的项目，提供了一种基于纯文本或标记搜索项目的方法，甚至可以进行跨多个文件处理项目的批量操作。我在本系列的第 2 部分中介绍了为议程模式配置。标签Org 模式当然也支持标签了。你可以通过 C-c C-q 快速的建立标签。你可能会想为一些常用的标签设置快捷键。就像这样: (setq org-tag-persistent-alist '(("@phone" . ?p) ("@computer" . ?c) ("@websurfing" . ?w) ("@errands" . ?e) ("@outdoors" . ?o) ("MIT" . ?m) ("BIGROCK" . ?b) ("CONTACTS" . ?C) ("INBOX" . ?i) ))你还可以按文件向该列表添加标记，也可以按文件为某些内容设置标记。我就在我的 inbox.org 和 email.org 文件中设置了一个 INBOX 的标签。然后我可以每天从日程视图中查看所有标记为 INBOX 的项目，像将它们重新归档到其他文件中的这样的简单操作将让它们去掉 INBOX 标记。重新归档“重新归档”就是在文件中或其他地方移动。它是使用标题来完成的。C-c C-w 就是做这个的。我设置成这样:(setq org-outline-path-complete-in-steps nil) ; Refile in a single go (setq org-refile-use-outline-path 'file)归档分类一段时间后，你的文件就会被已经完成的事情弄得乱七八糟。Org 模式有一个归档特性，可以将主 .org 文件移到其他文件中，以备将来参考。如果你在 git 或其他软件中 有 Org 文件，你可能希望删除这些其他文件，因为无论如何都会在历史中拥有这些文件，但是我发现它们对于析取和搜索非常方便。我会定期检查并归档文件中的所有内容。基于 stackoverflow 的讨论，我有以下代码：(defun org-archive-done-tasks () (interactive) (org-map-entries (lambda () (org-archive-subtree) (setq org-map-continue-from (outline-previous-heading))) "/DONE" 'file) (org-map-entries (lambda () (org-archive-subtree) (…

Emacs 系列（二）：Org 模式介绍
type: item
date: 2018-12-05T06:30:00+08:00
description: 在我 Emacs 系列中的第一篇文章里，我介绍了我在用了几十年的 vim 后转向了 Emacs，Org 模式就是我为什么这样做的原因。Org 模式的精简和高效真的震惊了我，它真的是个“杀手”应用。所以，Org 模式到底是什么呢？这是我昨天写的：它是一个组织信息的平台，它的主页上这样写着：“一切都是纯文本：Org 模式用于记笔记、维护待办事项列表、计划项目和使用快速有效的纯文本系统编写文档。”这是事实，但并不是很准确。Org 模式是一个你用来组织事务的小工具。它有一些非常合理的默认设置，但也允许你自己定制。主要突出在这几件事上：维护待办事项列表：项目可以分散在 Org 文件中，包含附件，有标签、截止日期、时间表。有一个方便的“日程”视图，显示需要做什么。项目也可以重复。编写文档：Org 模式有个特殊的功能来生成 HTML、LaTeX、幻灯片（用 LaTeX beamer）和其他所有的格式。它也支持直接在缓冲区中运行和以 Emacs 所支持的的语言进行 文学编程 literate programming 。如果你想要深入了解这项功能的话，参阅这篇文学式 DevOps 的文章。而 整个 Worg 网站 是用 Org 模式开发的。记笔记：对，它也能做笔记。通过全文搜索，文件的交叉引用（类似 wiki），UUID，甚至可以与其他的系统进行交互（通过 Message-ID 与 mu4e 交互，通过 ERC 的日志等等……）。入门我强烈建议去阅读 Carsten Dominik 关于 Org 模式的一篇很棒的 Google 讲话。那篇文章真的很赞。在 Emacs 中带有 Org 模式，但如果你想要个比较新的版本的话，Debian 用户可以使用命令 apt-get install org-mode 来更新，或者使用 Emacs 的包管理系统命令 M-x package-install RET org-mode RET。现在，你可能需要阅读一下 Org 模式的精简版教程中的导读部分，特别注意，你要设置下启动部分中提到的那些键的绑定。一份好的教程我会给出一些好的教程和介绍的链接，但这篇文章不会是一篇教程。特别是在本文末尾，有两个很不错的视频链接。我的一些配置我将在这里记录下一些我的配置并介绍它的作用。你没有必要每行每句将它拷贝到你的配置中 —— 这只是一个参考，告诉你哪些可以配置，要怎么在手册中查找，或许只是一个“我现在该怎么做”的参考。首先，我将 Emacs 的编码默认设置为 UTF-8。(prefer-coding-system 'utf-8) (set-language-environment "UTF-8")Org 模式中可以打开 URL。默认的，它会在 Firefox 中打开，但我喜欢用 Chromium。(setq browse-url-browser-function 'browse-url-chromium)我把基本的键的绑定和设为教程里的一样，再加上 M-RET 的操作的配置。(global-set-key "\C-cl" 'org-store-link) (global-set-key "\C-ca" 'org-agenda) (global-set-key "\C-cc" 'org-capture) (global-set-key "\C-cb" 'org-iswitchb) (setq org-M-RET-may-split-line nil)捕获配置我可以在 Emacs 的任何模式中按 C-c c，按下后它就会帮我捕获某些事，其中包括一个指向我正在处理事务的链接。你可以通过定义捕获模板来配置它。我将保存两个日志文件，作为会议、电话等的通用记录。一个是私人用的，一个是办公用的。如果我按下 C-c c j,它就会帮我捕获为私人项. 下面包含 %a 的配置是表示我当前的位置（或是我使用 C-c l 保存的链接）的链接。(setq org-default-notes-file "~/org/tasks.org") (setq org-capture-templates '( ("t" "Todo" entry (file+headline "inbox.org" "Tasks") "* TODO %?\n %i\n %u\n %a") ("n" "Note/Data" entry (file+headline "inbox.org" "Notes/Data") "* %? \n %i\n %u\n %a") ("j" "Journal" entry (file+datetree "~/org/journal.org") "* %?\nEntered on %U\n %i\n %a") ("J" "Work-Journal" en…

Emacs 系列（一）：抛掉一切，投入 Emacs 和 Org 模式的怀抱
type: item
date: 2018-12-01T07:19:00+08:00
description: 我必须承认，在使用了几十年的 vim 后， 我被 Emacs 吸引了。长期以来，我一直对如何组织安排事情感到沮丧。我也有用过 GTD 和 ZTD 之类的方法，但是像邮件或是大型文件这样的事务真的很难来组织安排。我一直在用 Asana 处理任务，用 Evernote 做笔记，用 Thunderbird 处理邮件，把 ikiwiki 和其他的一些项目组合作为个人知识库，而且还在电脑的归档了各种文件。当我的新工作需要将 Slack 也加入进来时，我终于忍无可忍了。许多 TODO 管理工具与电子邮件集成的很差。当你想做“提醒我在一周内回复这个邮件”之类的事时，很多时候是不可能的，因为这个工具不能以一种能够轻松回复的方式存储邮件。而这个问题在 Slack 上更为严重。就在那时，我偶然发现了 Carsten Dominik 在 Google Talk 上关于 Org 模式的讲话。Carsten 是 Org 模式的作者，即便是这个讲话已经有 10 年了，但它仍然很具有参考价值。我之前有用过 Org 模式，但是每次我都没有真正的深入研究它， 因为我当时的反应是“一个大纲编辑器？但我需要的是待办事项列表”。我就这么错过了它。但实际上 Org 模式就是我所需要的。什么是 Emacs？什么是 Org 模式？Emacs 最初是一个文本编辑器，现在依然是一个文本编辑器，而且这种传统无疑贯穿始终。但是说 Emacs 是个编辑器是很不公平的。Emacs 更像一个平台或是工具包。你不仅可以用它来编辑源代码，而且配置 Emacs 本身也是编程，里面有很多模式。就像编写一个 Firefox 插件一样简单，只要几行代码，然后，模式里的操作就改变了。Org 模式也一样。确实，它是一个大纲编辑器，但它真正所包含的不止如此。它是一个信息组织平台。它的网站上写着，“你可以用纯文本来记录你的生活：你可以用 Org 模式来记笔记，处理待办事项，规划项目和使用快速有效的纯文本系统编写文档。”捕获如果你读过基于 GTD 的生产力指南，那么他们强调的一件事就是毫不费力地获取项目。这个想法是，当某件事突然出现在你的脑海里时，把它迅速输入一个受信任的系统，这样你就可以继续做你正在做的事情。Org 模式有一个专门的捕获系统。我可以在 Emacs 的任何地方按下 C-c c 键，它就会空出一个位置来记录我的笔记。最关键的是，自动嵌入到笔记中的链接可以链接到我按下 C-c c 键时正在编辑的那一行。如果我正在编辑文件，它会链回到那个文件和我所在的行。如果我正在浏览邮件，它就会链回到那封邮件（通过邮件的 Message-Id，这样它就可以在任何一个文件夹中找到邮件）。聊天时也一样，甚至是当你在另一个 Org 模式中也可也这样。这样我就可以做一个笔记，它会提醒我在一周内回复某封邮件，当我点击这个笔记中的链接时，它会在我的邮件阅读器中弹出这封邮件 —— 即使我随后将它从收件箱中存档。没错，这正是我要找的！工具套件一旦你开始使用 Org 模式，很快你就会想将所有的事情都集成到里面。有可以从网络上捕获内容的浏览器插件，也有多个 Emacs 邮件或新闻阅读器与之集成，ERC（IRC 客户端）也不错。所以我将自己从 Thunderbird 和 mairix + mutt （用于邮件归档）换到了 mu4e，从 xchat + slack 换到了 ERC。你可能不明白，我喜欢这些基于 Emacs 的工具，而不是具有相同功能的单独的工具。一个小花絮：我又在使用离线 IMAP 了！我甚至在很久以前就用过 GNUS。用一个 Emacs 进程来管理我以前也经常使用 Emacs，那时，Emacs 是一个“大”的程序（现在显示电源状态的小程序占用的内存要比 Emacs 多）。当时存在在启动时间过长的问题，但是现在已经有连接到一个正在运行的 Emacs 进程的解决方法。我喜欢用 Mod-p（一个 xmonad) 中 dzen 菜单栏的快捷方式，但是在大多数传统的桌面环境中该功能的快捷键是 Alt-F2）来启动程序（LCTT 译注：xmonad 是一种平铺桌面；dzen 是 X11 窗口下管理消息、提醒和菜单的程序）。这个设置在不运行多个 emacs 们 emacsen 时很方便，因为这样就不会在试图捕获另一个打开的文件时出问题。这中方法很简单：创建一个叫 em 的脚本并将它放到我自己的环境变量中。就像这样：#!/bin/bash exec emacsclient -c -a "" "$@"如果没有 emacs 进程存在的话，就会创建一个新的 emacs 进程，否则的话就直接使用已存在的进程。这样做还有一个好处：-nw 之类的参数工作的很好，它实际上就像在 shell 提示符下输入 emacs 一样。它很适合用于设置 EDI…

Docker 容器中的老式 DOS BBS
type: item
date: 2018-03-14T08:17:00+08:00
description: 不久前，我写了一篇我的 Debian Docker 基本映像。我决定进一步扩展这个概念：在 Docker 中运行 DOS 程序。但首先，来看看题图。事实证明这是可能的，但很难。我使用了所有三种主要的 DOS 模拟器（dosbox、qemu 和 dosemu）。我让它们都能在 Docker 容器中运行，但有很多有趣的问题需要解决。都要做的事是在 DOS 环境下提供一个伪造的调制解调器。它需要作为 TCP 端口暴露在容器外部。有很多方法可以做到 —— 我使用的是 tcpser。dosbox 有一个 TCP 调制解调器接口，但事实证明，这样做太问题太多了。挑战来自你希望能够一次接受多个传入 telnet（或 TCP）连接。DOS 不是一个多任务操作系统，所以当时有很多黑客式的方法。一种是有多台物理机，每个有一根传入电话线。或者它们可能会在 DESQview、OS/2 甚至 Windows 3.1 等多任务层下运行多个伪 DOS 实例。（注意：我刚刚了解到 DESQview/X，它将 DESQview 与 X11R5 集成在一起，并取代了 Windows 3 驱动程序来把 Windows 作为 X 应用程序运行。）出于各种原因，我不想尝试在 Docker 中运行其中任何一个系统。这让我模拟了原来的多物理节点设置。从理论上讲，非常简单 —— 运行一组 DOS 实例，每个实例最多使用 1MB 的模拟 RAM，这就行了。但是这里面临挑战。在多物理节点设置中，你需要某种文件共享，因为你的节点需要访问共享的消息和文件存储。在老式的 DOS 时代，有很多笨重的方法可以做到这一点 —— Netware、LAN manager，甚至一些 PC NFS 客户端。我没有访问 Netware。我尝试了 DOS 中的 Microsoft LM 客户端，与在 Docker 容器内运行的 Samba 服务器交互。这样可以使用，但 LM 客户端即使有各种高内存技巧还是占用了很多内存，BBS 软件也无法运行。我无法在多个 dosbox 实例中挂载底层文件系统，因为 dosbox 缓存不兼容。这就是为什么我使用 dosemu 的原因。除了有比 dosbox 更完整的模拟器之外，它还有一种共享主机文件系统的方式。所以，所有这一切都在此：jgoerzen/docker-bbs-renegade。我还为其他想做类似事情的人准备了构建块：docker-dos-bbs 和底层 docker-dosemu。意外的收获是，我也试图了在 Joyent 的 Triton（基于 Solaris 的 SmartOS）下运行它。让我感到高兴的印象是，几乎可以在这下面工作。是的，在 Solaris 机器上的一个基于 Linux 的 DOS 模拟器的容器中运行 Renegade DOS BBS。via: http://changelog.complete.org/archives/9836-an-old-dos-bbs-in-a-docker-container作者：John Goerzen 译者：geekpi 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出