【问题标题】:Emacs org-mode Python source blocks don't export with python-mode.elEmacs org-mode Python 源代码块不使用 python-mode.el 导出
【发布时间】:2014-03-21 17:19:37
【问题描述】:

我最近将我的 Emacs 设置配置为使用 python-mode.el 而不是 python.el。这种变化显然导致 org 模式不再能够导出 python 源代码块,因为我得到了

org-export-format-source-code-or-example: "End of buffer"

作为导出后的唯一消息,不生成导出文件。

我想知道为什么会这样,以及我能做些什么来解决它。我的 python-mode.el 是通过 el-get 安装的(我认为这并不重要)。它像这样加载到我的初始化文件中:

(add-to-list 'load-path "~/.emacs.d/el-get/python-mode/")
(autoload 'python-mode "python-mode" "Python Mode." t)
(add-to-list 'auto-mode-alist '("\\.py\\'" . python-mode))
(add-to-list 'interpreter-mode-alist '("python" . python-mode))

这是产生此错误的示例:

This is a test.

#+BEGIN_SRC python
  print "Hello, World"
#+END_SRC

这是我在 Messages 中看到的内容:

Export buffer: 
Exporting...
org-babel-exp processing...
org-export-format-source-code-or-example: End of buffer

【问题讨论】:

    标签: python emacs org-mode


    【解决方案1】:

    在我的配置中,

    • GNU Emacs 24.3.1,
    • python 模式 6.1.3,
    • 组织 20141006

    我也有同样的问题。当我追踪导致这个错误的原因时,我发现ox-html.el 中的org-html-fontifiy-code 导致了这个错误。尤其是下面的代码块:

    (save-excursion
      (let ((beg (point-min))
            (end (point-max)))
        (goto-char beg)
        (while (progn (end-of-line) (< (point) end))
           (put-text-property (point) (1+ (point)) 'face nil)
           (forward-char 1))))
    

    通常,在while循环的最后一次迭代中,put-text-property之前的点通常具有(1- (point-max))的值,放置文本属性(不会改变),然后它调用forward-char 将点移动到 (point-max),并停止 while 循环。

    奇怪的是,在 python 源代码块中,put-text-property 将点移动到了(1+ (point))。所以在最后一次迭代中,put-text-property 将点移动到(1+ (point)),因此该点已经在(point-max),因此调用forward-char 将失败并出现“缓冲区结束”错误。

    我在 python-mode 中闻到鱼的味道;也许他们安装了一些钩子函数或其他东西来使put-text-property 移动点?我不知道。对于猴子补丁,这里是上面代码块的脏补丁:

    (save-excursion
      (let ((beg (point-min))
            (end (point-max)))
        (goto-char beg)
        (while (progn (end-of-line) (< (point) end))
          (let ((oldpos (point)))
            (put-text-property (point) (1+ (point)) 'face nil)
            (goto-char oldpos))
          (forward-char 1))))
    

    抱歉我的懒惰,但有人可以将这个发布到 org-mode/python-mode 邮件列表吗?

    【讨论】:

    • 似乎是纯粹的组织模式问题。
    【解决方案2】:

    AFAIS 导出源代码时,不查询语言模式。

    这是出口商的问题。

    【讨论】: