6

比較的大きな TAGS ファイルでany-c-etags-selectコマンドを実行すると、Emacs のミニ バッファー内の正規表現マッチャーでスタック オーバーフローのようなエラー メッセージが常に表示されます。バッファには*Messages*、次のようなログ メッセージが表示されます。

File TAGS is large (9MB), really open? (y or n) 
Loading tag file...70%
and: Stack overflow in regexp matcher

Emacs には、タグ データ全体を読み取るのに十分なスタック サイズがないようです。Emacs のスタックサイズを増やす方法はありますか?

2つのバージョンのEmacsでこれを試しました:

  • Emacs for Mac OS X 24.1 (ユニバーサル バイナリ)
  • Emacs for Mac OS X 23.4 (ユニバーサル バイナリ)

しかし、どちらも同じエラーメッセージを表示しました。

前もって感謝します!

4

2 に答える 2

1

おそらく簡単な回避策:

いっそのこと: [\0-\377[:nonascii:]]* は、巨大なテキスト (> 34k など) の「正規表現マッチャーでのスタック オーバーフロー」を回避します。

...および/または...

タグ テーブルは、使用しているコードに応じて、さまざまな場所にあります。環境変数 $DEVELOP が作業中のディレクトリを指すようにするのは簡単だと思いました。このディレクトリには、Emacs のタグと vi のタグがあります。

于 2012-06-29T21:35:48.557 に答える
0

string-match関数の第 2 引数が大きすぎると、関数が引数を処理できないことを確認しました。次のように関数の制限を追加しました。

$ git diff
diff --git a/lisp/anything/anything-config.el b/lisp/anything/anything-config.el
index 23f00e5..cee5e13 100644
--- a/lisp/anything/anything-config.el
+++ b/lisp/anything/anything-config.el
@@ -7001,7 +7001,7 @@ If not found in CURRENT-DIR search in upper directory."
                        (anything-aif (string-match "\177" i)
                            (substring i 0 it)
                          i))
-           do (cond ((and elm (string-match "^\\(.+\\),[0-9]+" elm))
+           do (cond ((and elm (< (length elm) 2000) (string-match "^\\(.+\\),[0-9]+" elm))
                      (setq fname (match-string 1 elm)))
                     (elm (setq cand (concat fname ": " elm)))
                     (t (setq cand nil)))

これは手早く汚いハックのようなものだと思いますが、現在はうまく機能しています。

于 2012-06-30T07:27:38.190 に答える