Org-mode 在导出 html 和 markdown 的时候出错:

使用的是 doom emacs 的配置。在导出 Org 文件到 html 报错 (wrong-type-argument stringp nil)

具体的错误信息如下:

Debugger entered--Lisp error: (wrong-type-argument stringp nil)
  file-name-nondirectory(nil)
  file-name-extension(nil)
  (member (file-name-extension (buffer-file-name)) (quote ("org" "md" "markdown" "txt" "rtf")))
  (not (member (file-name-extension (buffer-file-name)) (quote ("org" "md" "markdown" "txt" "rtf"))))
  (and (not (member (file-name-extension (buffer-file-name)) (quote ("org" "md" "markdown" "txt" "rtf")))) (let* ((i 1) (--cl-var-- (min 30 (count-lines (point-min) (point-max)))) (--cl-var-- t) --cl-var--) (while (and (<= i --cl-var--) (if (> (get-nth-line-length i) 1000) (setq --cl-var-- t --cl-var-- nil) t)) (setq i (+ i 1))) (if --cl-var-- (progn (quote nil)) --cl-var--)))

不用 doom 不知道具体细节。不过你是不是可以说下你导出时用的什么函数以及具体过程?这样有用 doom 的朋友应该可以更好地帮你解决问题

直接调用 C-c C-e 导出的…

跟着 backtrace 的话发现 (buffer-file-name) 返回 nil,表示当前 buffer 没有关联文件,一般保存下就 OK 了。

不行唉,我导出之前特意 C-x C-s 保存了一下,导出依然没有成功。

报错的时候,读给出的 backtrace,它会告诉你什么地方出错了。

第一行是错误本身。第二行到结尾是由内而外触发这个错误的代码。xxx(nil) 表示 (xxx nil)。

查看了 buffer-file-name 发现值其实是不为空的。单独测试 (file-name-extension (buffer-file-name)) 发现会触发 (wrong-type-argument stringp nil) 的错误。

M-x toggle-debug-on-error然后再导出一次,取backtrace

然后顺藤摸瓜发现 file-name-extension 的定义是这样的:

(defun file-name-extension (filename &optional period)
  (save-match-data
    (let ((file (file-name-sans-versions (file-name-nondirectory filename))))
      (if (and (string-match "\\.[^.]*\\'" file)
	       (not (eq 0 (match-beginning 0))))
          (substring file (+ (match-beginning 0) (if period 0 1)))
        (if period
            "")))))

分别测试了 (file-name-sans-versions (file-name-nondirectory (buffer-file-name))) 发现是能够获得当前 buffer 的名字 的。

然后接着测试 match 部分: (string-match "\\.[^.]*\\'" "test.org") 返回值为 4

运行 (and (string-match "\\.[^.]*\\'" file) (not (eq 0 (match-beginning 0))) 返回的是 t。运行 (substring "test.org" (+ (match-beginning 0) 1)) 返回的是 est.org

所以不明白是哪里出现了 (wrong-type-argument sringp nil) 的错误?

buffer在没有关联文件的时候,buffer-name返回nil。所以很可能是在执行export语句的时候,你的emacs被lisp指令控制不知跑去了哪个buffer里,建议你给出复现步骤。

完整的抓了一次 backtrace 如下:

https://paste.ubuntu.com/p/zH8JDYXyHB/