2017-02-03 7 views
4

Я использую hide-show, чтобы свернуть некоторые части моего текста, и я использую приведенный ниже код, чтобы показать количество скрытых строк.Наложения делают emacs очень медленными

Однако, если файл достаточно велик (например, C++ или LaTeX), и я разрушаю все регионы (таким образом создавая десятки наложений), Emacs становится очень медленным до невозможности использования. Даже перемещение маркера с одной линии на другую занимает полсекунды или около того.

Есть ли способ разрешить это?

(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 становится очень медленной из-за незначительным режимом Linum, который создает тысячи (скрытые) накладок, которые разрушились с укрытием шоу. Есть ли способ исправить это? Или лучший режим номера линии?

+0

Вы пробовали профилировать код? – Nick

+0

Спасибо. Я сделал это, и я думаю, что нашел главного виновника. См. Мои изменения – Tohiko

+1

Перекрестные ссылки на http://emacs.stackexchange.com/q/30563 – phils

ответ

3

Как вы сказали в своем названии, наложения могут сделать Emacs медленным.

Одна вещь, которую вы можете сделать, которая иногда может помочь, заключается в повторном наборе наложений вокруг текущей позиции курсора (point). Вы делаете это, используя функцию overlay-recenter.

В руководстве Elisp, узел Managing Overlays говорит вам:

Эта функция центрирует пометок текущего буфера вокруг позиции POS. Это делает поиск наложения более быстрым для позиций около POS, но медленнее для позиций вдали от POS.

Петля, которая сканирует буфер вперед, создает наложения, может работать быстрее, если вы делаете (overlay-recenter (point-max)).

+0

Спасибо. Выполнение 'overlay-recenter' ускорило ситуацию, но не значительно. Я не понимаю, почему код, который я показал, делает emacs медленным, но без него (т. Е. С оригинальными наложениями hide-show) emacs все еще достаточно отзывчив. – Tohiko