From: Dmitry Gutov <dgutov@yandex.ru>
To: Stefan Monnier <monnier@IRO.UMontreal.CA>, Eli Zaretskii <eliz@gnu.org>
Cc: 20629@debbugs.gnu.org
Subject: bug#20629: 25.0.50; Regression: TAGS broken, can't find anything in C++ files.
Date: Thu, 28 May 2015 15:59:20 +0300 [thread overview]
Message-ID: <55671128.3080607@yandex.ru> (raw)
In-Reply-To: <55670209.9080608@yandex.ru>
And here's an attempt to simplify the regexp and use the input string.
It brings us down to 200ms in the best case (completions for "get_"),
and that can be improved further, but the worst case (completions for
"") gets considerably worse: 3 seconds.
diff --git a/lisp/progmodes/etags.el b/lisp/progmodes/etags.el
index 9ff164e..230fffa 100644
--- a/lisp/progmodes/etags.el
+++ b/lisp/progmodes/etags.el
@@ -753,31 +753,18 @@ Assumes the tags table is the current buffer."
(setq tags-included-tables (funcall
tags-included-tables-function))))
\f
(defun tags-completion-table ()
- "Build `tags-completion-table' on demand.
+ "Return tags completion table.
The tags included in the completion table are those in the current
tags table and its (recursively) included tags tables."
- (or tags-completion-table
- ;; No cached value for this buffer.
- (condition-case ()
- (let (current-table combined-table)
- (message "Making tags completion table for %s..." buffer-file-name)
- (save-excursion
- ;; Iterate over the current list of tags tables.
- (while (visit-tags-table-buffer (and combined-table t))
- ;; Find possible completions in this table.
- (setq current-table (funcall tags-completion-table-function))
- ;; Merge this buffer's completions into the combined table.
- (if combined-table
- (mapatoms
- (lambda (sym) (intern (symbol-name sym) combined-table))
- current-table)
- (setq combined-table current-table))))
- (message "Making tags completion table for %s...done"
- buffer-file-name)
- ;; Cache the result in a buffer-local variable.
- (setq tags-completion-table combined-table))
- (quit (message "Tags completion table construction aborted.")
- (setq tags-completion-table nil)))))
+ (completion-table-with-cache
+ (lambda (string)
+ (let (cont tables)
+ (save-excursion
+ ;; Iterate over the current list of tags tables.
+ (while (visit-tags-table-buffer (or cont (progn (setq cont t)
nil)))
+ ;; Find possible completions in this table.
+ (push (funcall tags-completion-table-function string) tables)))
+ (nreverse (apply #'nconc tables))))))
;;;###autoload
(defun tags-lazy-completion-table ()
@@ -1218,7 +1205,7 @@ buffer-local values of tags table format variables."
(mapc (lambda (elt) (set (make-local-variable (car elt)) (cdr
elt)))
'((file-of-tag-function . etags-file-of-tag)
(tags-table-files-function . etags-tags-table-files)
- (tags-completion-table-function . etags-tags-completion-table)
+ (tags-completion-table-function . etags-tags-completions)
(snarf-tag-function . etags-snarf-tag)
(goto-tag-location-function . etags-goto-tag-location)
(find-tag-regexp-search-function . re-search-forward)
@@ -1255,12 +1242,9 @@ buffer-local values of tags table format variables."
(expand-file-name str (file-truename default-directory))))))
-(defun etags-tags-completion-table () ; Doc string?
- (let ((table (make-vector 511 0))
- (progress-reporter
- (make-progress-reporter
- (format "Making tags completion table for %s..." buffer-file-name)
- (point-min) (point-max))))
+(defun etags-tags-completions (string) ; Doc string?
+ (let ((table nil)
+ (re (format "[\n \t()=,;\177]%s" (regexp-quote string))))
(save-excursion
(goto-char (point-min))
;; This monster regexp matches an etags tag line.
@@ -1271,18 +1255,16 @@ buffer-local values of tags table format variables."
;; \5 is the explicitly-specified tag name.
;; \6 is the line to start searching at;
;; \7 is the char to start searching at.
- (while (re-search-forward
- "^\\(\\([^\177]+[^-a-zA-Z0-9_+*$:\177]+\\)?\
-\\([-a-zA-Z0-9_+*$?:]+\\)[^-a-zA-Z0-9_+*$?:\177]*\\)\177\
-\\(\\([^\n\001]+\\)\001\\)?\\([0-9]+\\)?,\\([0-9]+\\)?\n"
- nil t)
- (intern (prog1 (if (match-beginning 5)
- ;; There is an explicit tag name.
- (buffer-substring (match-beginning 5) (match-end 5))
- ;; No explicit tag name. Best guess.
- (buffer-substring (match-beginning 3) (match-end 3)))
- (progress-reporter-update progress-reporter (point)))
- table)))
+ (while (re-search-forward re nil t)
+ (save-excursion
+ (goto-char (match-beginning 0))
+ (let ((match-re (if (eq (char-after) ?\177)
+ ;; Explicit tag name.
+ "\177\\([^\001]+\\)\001"
+ ;; Implicit tag name.
+ "[\n \t()=,;]\\([^\177 \t()=,;]+\\)\177")))
+ (when (looking-at match-re)
+ (push (match-string 1) table))))))
table))
(defun etags-snarf-tag (&optional use-explicit) ; Doc string?
next prev parent reply other threads:[~2015-05-28 12:59 UTC|newest]
Thread overview: 93+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-05-22 5:57 bug#20629: 25.0.50; Regression: TAGS broken, can't find anything in C++ files Jan D.
2015-05-23 11:54 ` Jan Djärv
2015-05-23 12:04 ` Dmitry Gutov
2015-05-23 12:15 ` Jan Djärv
2015-05-23 12:18 ` Dmitry Gutov
2015-05-23 12:28 ` Jan Djärv
2015-05-23 12:39 ` Dmitry Gutov
2015-05-23 13:51 ` Eli Zaretskii
2015-05-23 13:50 ` Eli Zaretskii
2015-05-23 14:46 ` Eli Zaretskii
2015-05-23 15:56 ` Eli Zaretskii
2015-05-25 15:15 ` Eli Zaretskii
2015-05-25 21:17 ` Dmitry Gutov
2015-05-26 2:35 ` Eli Zaretskii
2015-05-26 10:16 ` Dmitry Gutov
2015-05-26 15:06 ` Eli Zaretskii
2015-05-26 19:00 ` Dmitry Gutov
2015-05-26 19:23 ` Eli Zaretskii
2015-05-26 21:01 ` Stefan Monnier
2015-05-28 11:54 ` Dmitry Gutov
2015-05-28 12:59 ` Dmitry Gutov [this message]
2015-05-26 23:56 ` Dmitry Gutov
2015-05-27 14:28 ` Eli Zaretskii
2015-05-27 15:28 ` Dmitry Gutov
2015-05-27 15:46 ` Eli Zaretskii
2015-05-27 15:54 ` Dmitry Gutov
2015-05-27 16:23 ` Eli Zaretskii
2015-05-27 23:50 ` Dmitry Gutov
2015-05-28 2:50 ` Eli Zaretskii
2015-05-28 10:22 ` Dmitry Gutov
2015-05-28 14:56 ` Eli Zaretskii
2015-05-28 15:32 ` Dmitry Gutov
2015-05-28 16:34 ` Eli Zaretskii
2015-05-29 0:09 ` Dmitry Gutov
2015-05-29 6:48 ` Glenn Morris
2015-05-29 8:09 ` Eli Zaretskii
2015-05-29 12:34 ` Francesco Potortì
2015-05-29 9:27 ` Dmitry Gutov
2015-05-29 8:12 ` Eli Zaretskii
2015-05-29 14:05 ` Dmitry Gutov
2015-05-29 16:51 ` Stefan Monnier
2015-05-29 17:12 ` Dmitry Gutov
2015-05-29 19:19 ` Stefan Monnier
2015-05-29 20:33 ` Dmitry Gutov
2015-05-29 21:41 ` etags completion table (was: bug#20629: 25.0.50; Regression: TAGS broken, can't find anything in C++ files) Stefan Monnier
2015-05-29 23:58 ` etags completion table Dmitry Gutov
2015-05-30 4:00 ` Stefan Monnier
2015-05-30 11:50 ` Dmitry Gutov
2015-05-31 0:57 ` Stefan Monnier
2015-05-29 18:28 ` bug#20629: 25.0.50; Regression: TAGS broken, can't find anything in C++ files Eli Zaretskii
2015-05-29 20:01 ` Dmitry Gutov
2015-05-29 20:35 ` Eli Zaretskii
2015-05-29 22:36 ` Dmitry Gutov
2015-05-30 6:52 ` Eli Zaretskii
2015-05-30 12:52 ` Dmitry Gutov
2015-05-30 13:03 ` Eli Zaretskii
2015-05-30 14:21 ` Francesco Potortì
2015-05-30 14:44 ` Dmitry Gutov
2015-05-28 11:35 ` Francesco Potortì
2015-05-28 11:46 ` Dmitry Gutov
2015-05-28 12:16 ` Francesco Potortì
2015-05-28 13:00 ` Dmitry Gutov
2015-05-28 13:12 ` Francesco Potortì
2015-05-28 15:04 ` Eli Zaretskii
2015-05-28 15:14 ` Francesco Potortì
2015-05-28 15:29 ` Francesco Potortì
2015-05-29 17:13 ` Dmitry Gutov
2015-05-30 12:06 ` Eli Zaretskii
2015-05-30 12:30 ` Dmitry Gutov
2015-05-30 12:46 ` Eli Zaretskii
2015-05-30 13:42 ` Dmitry Gutov
2015-05-30 14:31 ` Eli Zaretskii
2015-05-30 15:03 ` Dmitry Gutov
2015-05-30 16:37 ` Eli Zaretskii
2015-05-30 17:46 ` Dmitry Gutov
2015-05-30 18:46 ` Eli Zaretskii
2015-05-30 19:42 ` Dmitry Gutov
2015-11-26 3:23 ` Dmitry Gutov
2015-11-26 15:43 ` Eli Zaretskii
2015-11-26 16:12 ` Dmitry Gutov
2015-11-26 16:32 ` Eli Zaretskii
2015-11-27 3:54 ` Dmitry Gutov
2016-03-19 18:45 ` Eli Zaretskii
2015-05-30 17:01 ` Francesco Potortì
2015-05-30 18:13 ` Dmitry Gutov
2015-05-30 18:42 ` Eli Zaretskii
2015-05-30 19:35 ` Francesco Potortì
2015-05-30 20:04 ` Dmitry Gutov
2015-05-30 22:35 ` Francesco Potortì
2015-05-31 0:34 ` Dmitry Gutov
2015-05-31 21:46 ` bug#20629: Fwd: bug#20703: 24.4; Stack overflow in regexp matcher Francesco Potortì
2015-05-31 22:20 ` Dmitry Gutov
2015-05-31 22:40 ` Francesco Potortì
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=55671128.3080607@yandex.ru \
--to=dgutov@yandex.ru \
--cc=20629@debbugs.gnu.org \
--cc=eliz@gnu.org \
--cc=monnier@IRO.UMontreal.CA \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this external index
https://git.savannah.gnu.org/cgit/emacs.git
https://git.savannah.gnu.org/cgit/emacs/org-mode.git
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.