Emacs bibtex-mode无法解析未访问的文件

时间:2016-09-29 04:02:24

标签: emacs bibtex

我不确定说出这个问题的最好方法,但希望我的例子能说明发生了什么。

我有一些代码,我希望在临时缓冲区中插入bibtex文件的内容,并逐个浏览条目,使用bibtex-parse-entry获取条目以供日后使用。但是,每当我在此emacs会话期间未访问的bibtex文件上运行代码时,bibtex-parse-entry都会返回(wrong-type-argument stringp nil)错误。

一旦我访问该文件,即使我然后关闭缓冲区,代码运行也没有任何问题。如果我删除bibtex-parse-entry来电,则bibtex-kill-entry会遇到同样的问题。

这是我正在使用的elisp代码:

(with-temp-buffer
  (insert-file-contents "~/test.bib")
  (goto-char (point-min))
  (bibtex-mode)
  (while (not (eobp))
    (let* ((entry (bibtex-parse-entry t)))
      (message "i'm here"))
    (bibtex-kill-entry)
    (bibtex-beginning-of-entry)
    )
  )

和一个虚拟.bib文件:

@Article{test,
  author =   {joe shmo},
  title =    {lorem ipsum},
  journal =      {something},
  year =     {1990},
}

有了这些,您应该能够重现我的错误。

我不知道发生了什么,所以我非常感谢任何帮助!

1 个答案:

答案 0 :(得分:1)

我不是真正的专家。我刚刚调试了一下情况(在这种情况下尝试M-x toggle-debug-on-error)并找到looking-at的{​​{1}}值调用。堆栈跟踪告诉我们问题出在bibtex函数nil中。在那里,我发现变量bibtex-valid-entry - 根据其docstring--由bibtex-entry-maybe-empty-head设置。

因此,在调用bibtex-set-dialect后向您的函数添加对bibtex-set-dialect的调用似乎可以解决问题。我真的不知道,到底想要达到什么目标,我不确定它是否真正解决了你的问题。至少该函数不再引发错误。

希望,这是有道理和有帮助的。

bibtex-mode