伪所见即所得的 Emacs

Pseudo-WYSIWYG Emacs

文件中只有几行 file.adoc

////
-*-iimage-mode-*-
////

.A PNG smiley
image::smiley.png[]

我可以使用 asciidoctor 生成 HTML,使用 pandoc 生成 MS-word .doc。 这个工具链不处理 SVG,所以它并不完美,但它运行良好,并且 它是免费的。

file.html

虽然有一个障碍:

我希望在加载 file.adoc 时启用 iimage-mode。我的尝试(上面源代码中的前三行)不起作用。你能想出一个办法吗?

.emacs

(set-foreground-color "white")
(set-background-color "black")

(require 'adoc-mode)
(setq auto-mode-alist (cons '("\.adoc\'" . adoc-mode) auto-mode-alist))

评论

我在这里写这些评论是为了能够排版。

  1. Asciidoctor (除了块注释之外,我还使用了用 Ruby) does have (now?) line comments 编写的 asciidoc 语法的高级实现。

  2. 使用

    // -- 模式:iimage --

在第一行有效(谢谢,尼克)。但它取代了 adoc 主要模式(感谢 phils)。

  1. 在文件底部添加:

//// Local Variables:

eval: (iimage-mode 1)

End:

////

切换到次模式 iimage,而主要模式保持 adoc。

  1. phils 使用 my-adoc-mode-hook 的建议很有效。

我是 另一个问题的第二部分。对于一个问题,这个讨论已经足够长了。

更新

使用 asciidoctor + pandoc 可能会生成一个 .doc 文件,该文件可以用最新版本的 MS-Word 正确处理。欢迎评论。 OS X 上的 MS-Word 2011 可以正常打开生成的 .doc 文件,但在 SVG 图像的位置显示错误消息。

如果可行,它将(最终)成为一种向所有坚持使用文件的人发送 .doc 文件的方式,同时在像 Emacs 这样灵活的环境中进行编辑。

  1. 我尝试使用我身边的 JPG,但我没有得到任何伪影。
  2. 规范是 -*- mode: iimage -*- 并且它必须在文件的第一行(如果第一行指定了解释器,它可以在第二行,例如 #! /bin bash ).

如果这对您不起作用,您可以在文件的结尾处使用文件变量:

//// Local Variables:
//// mode: iimage
//// End:

参见File Variables

编辑:有关如何处理次要模式的更正确描述,请参阅@phils 的回答。

Nick 的回答大部分是正确的,但是 iimage-modeminor 模式,在局部变量中使用 mode:... 是(现在)用于 [=仅限 43=] 主要 模式。使用它来启用次要模式已被弃用(即使它在某些情况下仍然有效1)。

而是使用eval:...来调用次要模式函数2:

//// -*- eval: (iimage-mode 1); -*-

//// Local Variables:
//// eval: (iimage-mode 1)
//// End:

另请注意,-*- iimage -*- 等同于 -*- mode: iimage -*-,对于这两种形式,Emacs 都会附加一个 -mode 后缀以获得 actual模式名称。

因此 -*-iimage-mode-*- 要求使用 iimage-mode-mode —— 实际上 Emacs 应该生成消息 "Ignoring unknown mode `iimage-mode-mode'".

最后,如果你想为 所有 adoc-mode 文件启用 iimage-mode,那么你可以在初始化文件中使用模式挂钩而不是使用文件-局部变量:

(add-hook 'adoc-mode-hook 'my-adoc-mode-hook)

(defun my-adoc-mode-hook ()
  "Custom `adoc-mode' behaviours."
  (iimage-mode 1))

1 在这种情况下,如果您 had 使用 -*-iimage-*--*-mode: iimage-*- 作为唯一的局部变量mode 规范,Emacs 会将其视为主要模式,并且不会使用您预期的 adoc-mode 主要模式。

2 我按照 Nick 的回答假设 //// 是正确的行注释前缀,但这个问题让它看起来更像是块注释语法, 所以不知道对不对