From c99a3b90a010448c14475666cb78f05860b0e1c2 Mon Sep 17 00:00:00 2001 From: Dmitry Gutov Date: Tue, 2 May 2017 00:09:09 +0300 Subject: [PATCH] Speed up project-find-regexp for simple regexps * lisp/progmodes/xref.el (xref--regexp-syntax-dependent-p): New function. (xref--collect-matches): Use it. Don't try to enable the appropriate major mode and file-local variables if the regexp does not depend on the buffer's syntax (bug#26710). (xref--collect-matches-1): Don't syntax-propertize in that case either. --- lisp/progmodes/xref.el | 28 ++++++++++++++++++++++------ 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/lisp/progmodes/xref.el b/lisp/progmodes/xref.el index d0636ba6355..c9df450d5f2 100644 --- a/lisp/progmodes/xref.el +++ b/lisp/progmodes/xref.el @@ -1004,6 +1004,17 @@ directory, used as the root of the ignore globs." (match-string 1 str))))) str t t)) +(defun xref--regexp-syntax-dependent-p (str) + "Return non-nil when STR depends on the buffer's syntax. +Such as the current syntax table and the applied syntax properties." + (let ((case-fold-search nil)) + (string-match-p (rx + (or string-start (not (in ?\\))) + (0+ (= 2 ?\\)) + ?\\ + (in ?b ?B ?< ?> ?w ?W ?_ ?s ?S)) + str))) + (defvar xref--last-visiting-buffer nil) (defvar xref--temp-buffer-file-name nil) @@ -1017,7 +1028,8 @@ directory, used as the root of the ignore globs." (defun xref--collect-matches (hit regexp tmp-buffer) (pcase-let* ((`(,line ,file ,text) hit) - (buf (xref--find-buffer-visiting file))) + (buf (xref--find-buffer-visiting file)) + (syntax-needed (xref--regexp-syntax-dependent-p regexp))) (if buf (with-current-buffer buf (save-excursion @@ -1025,12 +1037,14 @@ directory, used as the root of the ignore globs." (forward-line (1- line)) (xref--collect-matches-1 regexp file line (line-beginning-position) - (line-end-position)))) + (line-end-position) + syntax-needed))) ;; Using the temporary buffer is both a performance and a buffer ;; management optimization. (with-current-buffer tmp-buffer (erase-buffer) - (unless (equal file xref--temp-buffer-file-name) + (when (and syntax-needed + (not (equal file xref--temp-buffer-file-name))) (insert-file-contents file nil 0 200) ;; Can't (setq-local delay-mode-hooks t) because of ;; bug#23272, but the performance penalty seems minimal. @@ -1046,11 +1060,13 @@ directory, used as the root of the ignore globs." (goto-char (point-min)) (xref--collect-matches-1 regexp file line (point) - (point-max)))))) + (point-max) + syntax-needed))))) -(defun xref--collect-matches-1 (regexp file line line-beg line-end) +(defun xref--collect-matches-1 (regexp file line line-beg line-end syntax-needed) (let (matches) - (syntax-propertize line-end) + (when syntax-needed + (syntax-propertize line-end)) ;; FIXME: This results in several lines with the same ;; summary. Solve with composite pattern? (while (and -- 2.39.5