Emacs org-mode中的Python代码块在python-mode.el下无法导出

1 投票
2 回答
730 浏览
提问于 2025-04-17 23:19

我最近把我的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

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

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-codeox-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)),然后放置文本属性(这不会改变光标位置),接着调用 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 的邮件列表上?

撰写回答