From: Stefan Monnier Date: Tue, 2 Oct 2012 03:49:28 +0000 (-0400) Subject: * lisp/vc/diff-mode.el (diff--auto-refine-data): New var. X-Git-Tag: emacs-24.2.90~241^2~42 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=6be9197e60358c3036552eadabd6b49975a87e3d;p=emacs.git * lisp/vc/diff-mode.el (diff--auto-refine-data): New var. (diff-hunk): Use it to delay refinement. (diff-mode): Remove overlays when we turn off font-lock. --- diff --git a/lisp/ChangeLog b/lisp/ChangeLog index fe1bde3b45a..ec975c42e01 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,5 +1,9 @@ 2012-10-02 Stefan Monnier + * vc/diff-mode.el (diff--auto-refine-data): New var. + (diff-hunk): Use it to delay refinement. + (diff-mode): Remove overlays when we turn off font-lock. + * textmodes/table.el: Use lexical-binding, dolist, define-minor-mode. (table-initialize-table-fixed-width-mode) (table-set-table-fixed-width-mode): Remove functions. diff --git a/lisp/vc/diff-mode.el b/lisp/vc/diff-mode.el index 586dd2b75e2..0e79c962b47 100644 --- a/lisp/vc/diff-mode.el +++ b/lisp/vc/diff-mode.el @@ -565,11 +565,24 @@ next hunk if TRY-HARDER is non-nil; otherwise signal an error." (goto-char (match-beginning 1)) (beginning-of-line))) +(defvar diff--auto-refine-data nil) + ;; Define diff-{hunk,file}-{prev,next} (easy-mmode-define-navigation diff-hunk diff-hunk-header-re "hunk" diff-end-of-hunk diff-restrict-view - (if diff-auto-refine-mode - (condition-case-unless-debug nil (diff-refine-hunk) (error nil)))) + (when diff-auto-refine-mode + (setq diff--auto-refine-data (cons (current-buffer) (point-marker))) + (run-at-time 0.0 nil + (lambda () + (when diff--auto-refine-data + (let ((buffer (car diff--auto-refine-data)) + (point (cdr diff--auto-refine-data))) + (setq diff--auto-refine-data nil) + (with-local-quit + (when (buffer-live-p buffer) + (with-current-buffer buffer + (goto-char point) + (diff-refine-hunk)))))))))) (easy-mmode-define-navigation diff-file diff-file-header-re "file" diff-end-of-file) @@ -1317,6 +1330,9 @@ a diff with \\[diff-reverse-direction]. \\{diff-mode-map}" (set (make-local-variable 'font-lock-defaults) diff-font-lock-defaults) + (add-hook 'font-lock-mode-hook + (lambda () (remove-overlays nil nil 'diff-mode 'fine)) + nil 'local) (set (make-local-variable 'outline-regexp) diff-outline-regexp) (set (make-local-variable 'imenu-generic-expression) diff-imenu-generic-expression) @@ -1390,6 +1406,8 @@ modified lines of the diff." (set (make-local-variable 'whitespace-style) '(face trailing)) (let ((style (save-excursion (goto-char (point-min)) + ;; FIXME: For buffers filled from async processes, this search + ;; will simply fail because the buffer is still empty :-( (when (re-search-forward diff-hunk-header-re nil t) (goto-char (match-beginning 0)) (diff-hunk-style)))))