僕はいつも通り最新 org-mode で文章を書いていたのだが、
衝撃的な事実がわかったのでブログすることにします。

orgフォーマット軽量マークアップ言語 の一種で、
org-modeはorg文書を読み書きするためのメジャーモードです。

そして、軽量マークアップ言語とは読み書きしやすい形式で
文書構造を表現するものです。

つまり、 可読性が命 なんです。

今回の発見はorgフォーマットの可読性に激震が走るものです。

さりげなく以下の文書を書いて、HTMLに変換したところ…

* example

#+begin_example
, * 2
, ** 3
これを埋め込みます。
#+end_example

#+begin_example
* 2
** 3
これを埋め込みます。
#+end_example

↓org8(最新版)で変換したら
http://rubikitch.com/f/141013074111-org8.html

20141013074958.png
Fig1: org8ではめちゃくちゃ!

なんとめちゃくちゃに変換されたのでしょうか!!!!

ちなみにEmacs24.3標準添付のorg-7.9.3fでは
意図通りに変換してくれます。

http://rubikitch.com/f/141013074111-org7.html

20141013075004.png
Fig2: org7では正しい

「#+BEGIN_SRC〜#+END_SRC」、「#+BEGIN_EXAMPLE〜#+END_EXAMPLE」は
本来ならば囲まれた部分をそのまま出力する指令です。

つまり、記述する側に立ってみれば
これらのブロックはまさに 結界に守られた聖域 であり、
ENDが来るまでブロックの内容には手が加えられないはずでした。

「#+END_SRC」なんて、org-modeそのものの解説でもなければ
ブロック内部に現れるなんてことはありません。

そのため聖域の中では何でも自由に書ける安心がありました。

しかし、この挙動の変化により結界が破られ
安心してブロックの内容を書けなくなりました。

これは仕様変更なんだろうかと思い
orgmode.orgのRelease Note を見てみましたが
該当する記述は見当たりませんでした。

Emacs 24.3同梱のorgは7.9.3fであり、
8.0.3で大きく変更されたことから8.0.3で試したところ
上記のような現象が起きました。

Git最新版にしても解決していません。

人ん家に土足で踏み入っていいのか?

正直、この変更に対して僕はどん引きした上に 怒り心頭 です。

例えてみれば、性格も仕事も素晴しい日本人の友人がいるとして、
彼が土足で(日本)人の家に上がったようなものです。

本来、軽量マークアップ言語で書かれた文書は
将来のバージョンにわたっても
修正なしで正しく変換されるべきものですが、
この変更により文書の変更が強要されます。

しかも、行頭の「*」はorg以外の文書ならば
いつ出てきてもおかしくありません。

それなのになぜ醜悪この上ない「,」をつける必要があるのでしょうか。

SRC・EXAMPLEブロックは上述の通り聖域であり、
このようなエスケープは聖域を侵す行為
土足で人ん家に侵入する行為に他なりません。

安心してブロックを記述できなくなり、
可読性にも大きく傷がつきました。

対処法

対処法はINCLUDEを使うことです。

#+INCLUDE example.txt example

このように書けば、example.txtの行頭に「*」が来ても正しく変換されます。

なお、ブロック内エスケープされるのは行頭に
「*」「#+」「,*」「,#+」が来る場合です。

以下の関数参照してください。

  • org-escape-code-in-region
  • org-escape-code-in-string

本日もお読みいただき、ありがとうございました。参考になれば嬉しいです。