Emacs org-mode Python源块不能用python-mode.el导出

时间:2014-03-21 17:19:37

标签: python emacs org-mode

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

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

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

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

(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

以下是我在消息中看到的内容:

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

2 个答案:

答案 0 :(得分:1)

在我的配置中,

  • GNU Emacs 24.3.1,
  • python-mode 6.1.3,
  • org 20141006

我有同样的问题。当我追踪导致此错误的原因时,我发现org-html-fontifiy-code中的ox-html.el会导致此错误。特别是下面的代码块:

(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)),放置text属性(不会更改 point ) ,然后调用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邮件列表吗?

答案 1 :(得分:0)

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

这是出口商的问题。