2016-09-29 5 views
0

私はこの質問にフレーズする最良の方法はわかりませんが、私の例では何が起きているのかを明確にします。Emacs bibtex-modeは訪問していないファイルを解析できません

一時バッファにビブテックスファイルの内容を挿入し、一度に1つずつエントリを移動し、後で使用するためにbibtex-parse-entryを使用してエントリを取得するコードがあります。しかし、私がこのemacsセッション中に訪れていないbibtexファイルでコードを実行すると、bibtex-parse-entry(wrong-type-argument stringp nil)エラーを返します。

私がファイルを訪問すると、バッファを閉じてもコードは問題なく実行されます。 bibtex-parse-entryコールを削除すると、bibtex-kill-entryに同じ問題が発生します。

(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}, 
} 

をあなたは私のエラーを再現することができるはずです。ここ

は、私が使用しているelispのコードです。

何が起こっているのかわからないので、何か助けていただければ幸いです。

答えて

1

私は本当にこれで専門家ではありません。私はちょうど少し状況をデバッグしました(M-x toggle-debug-on-errorこのような場合に)looking-atへのコールがnilの値で見つけました。 stack-traceは、問題がbibtex関数bibtex-valid-entryにあることを示しています。そこでは、bibtex-entry-maybe-empty-headという変数が見つかりました。これはそのdocstringに応じて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))) 
+0

これはうまくいきました。ご協力いただきありがとうございます。私はデバッグしようとしていましたが、まだelispコードをデバッグしているわけではありません(私の経験の大半は、PythonとMatlabが非常に異なっています)。 –

関連する問題