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

Emacs bibtex-mode unable to parse un-visited file

我不确定用什么方式来表达这个问题,但希望我的例子能说明发生了什么。

我有一些代码,我想在临时缓冲区中插入一个 bibtex 文件的内容,并一次一个地移动条目,使用 bibtex-parse-entry 获取条目供以后使用。但是,每当我 运行 我在这个 emacs 会话期间没有访问过的 bibtex 文件上的代码时,bibtex-parse-entry returns 一个 (wrong-type-argument stringp nil) 错误。

访问文件后,即使关闭缓冲区,代码 运行s 也没有任何问题。如果我删除 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},
}

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

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

我不是这方面的专家。我只是稍微调试了一下情况(在这种情况下尝试 M-x toggle-debug-on-error)并找到了一个带有 nil 值的对 looking-at 的调用。堆栈跟踪告诉我们问题出在 bibtex 函数 bibtex-valid-entry 中。在那里,我找到了变量 bibtex-entry-maybe-empty-head,根据它的文档字符串,它是由 bibtex-set-dialect.

设置的

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

希望,这是有道理的并且有所帮助。

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