mirror of
git://git.sv.gnu.org/emacs.git
synced 2025-12-15 10:30:25 -08:00
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.
This commit is contained in:
parent
80407a2d3f
commit
c99a3b90a0
1 changed files with 22 additions and 6 deletions
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue