2017-02-03 6 views
4

나는 내 텍스트의 특정 부분을 줄이기 위해 아래 코드를 사용하여 은선 수를 표시합니다.오버레이로 인해 이맥스가 실제로 느려짐

그러나 파일이 충분히 크면 (예 : C++ 또는 LaTeX) 모든 영역이 축소되므로 (수십 개의 오버레이가 생성됨) Emacs는 사용할 수 없을 정도로 느려집니다. 마커를 한 줄에서 다른 줄로 움직여도 1/2 초 정도 걸립니다.

해결 방법이 있습니까?

(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) 

편집 : 이유 이맥스 때문에 숨기기 쇼로 붕괴되는 (숨겨진) 오버레이의 수천을 생성 LINUM 작은 모드의 매우 느린됩니다 밝혀졌습니다. 이 문제를 해결할 수있는 방법이 있습니까? 아니면 더 나은 줄 번호 모드?

+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 '를하는 것은 일을 가속화했지만 크게는하지 않았습니다. 내가 이해하지 못하는 것은 필자가 보여준 코드가 이맥을 느리게 만드는 이유이지만,이 코드가 없으면 (즉, hide-show의 원래 오버레이와 함께) 이맥은 여전히 ​​충분히 반응 적이다. – Tohiko