2017-02-03 4 views
4

私はhide-showを使用してテキストの一部を崩壊させ、以下のコードを使って隠線の数を表示します。オーバーレイは本当に遅くなります

しかし、ファイルが十分に大きい(たとえばC++やLaTeXなど)場合、すべての領域が折りたたまれて(数十のオーバーレイが作成される)、Emacsは実際には使用できなくなるほど遅くなります。 1つの行から別の行にマーカーを移動するにも0.5秒かかります。

解決方法はありますか?

(defun display-code-line-counts (ov) 
    (overlay-put ov 'display 
       (format "...%d..." 
         (count-lines (overlay-start ov) 
             (overlay-end ov)) 
         )) 
    (overlay-put ov 'face '(:foreground "red" :box (:line-width 1 :style none))) 
) 

(setq hs-set-up-overlay 'display-code-line-counts) 

EDIT:理由emacsのが原因で非表示のショーで崩壊している(隠された)オーバーレイの数千人を作成し、アママイナーモードである非常に遅くなっ判明します。これを修正する方法はありますか?または、より良い行番号モード?

+0

コードをプロファイリングしてみましたか? – Nick

+0

ありがとうございます。私はそれをして、私は主な犯人を見つけたと思う。私の編集を参照してください – Tohiko

+1

http://emacs.stackexchange.com/q/30563との相互参照 – phils

答えて

3

あなたのタイトルで言ったように、オーバーレイはEmacsを遅くする可能性があります。

場合によっては、現在のcursonの位置(point)の周りにオーバーレイのセットを再入力することができます。あなたはそれを使用して関数 overlay-recenterを実行します。 elispのマニュアルとして

、ノードManaging Overlaysはあなたに伝えます:

この機能は 位置POS周りの現在のバッファのオーバーレイをrecenters。これにより、 POSに近い位置ではオーバーレイ検索が速くなりますが、POSからはるかに離れた位置ではオーバーレイ検索が遅くなります。

バッファをスキャンしてオーバーレイを作成するループは、(overlay-recenter (point-max))を最初に実行すると、より速く を実行できます。

+0

ありがとう。 'overlay-recenter'を実行すると、それほど大きなものはありません。私が理解できないのは、私が示したコードがemacsを遅くする理由ですが、それがなければ(すなわち、hide-showの元のオーバーレイで)emacsはまだ十分に応答しています。 – Tohiko

関連する問題