From: João Távora Date: Wed, 26 May 2021 14:21:06 +0000 (+0100) Subject: Again speed up directory watching X-Git-Tag: emacs-29.0.90~1616^2~524^2~4^2~133 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=78e994d85517ab0d0f2c053b5e6c3598bdfe7718;p=emacs.git Again speed up directory watching Previously, given a number of globs, Eglot would try to place system watchers only in those subdirectories that could potentially be matched by a glob. This meant traversing the whole tree, which could be impractical. Just place watchers in every subdirectory of the project (you may run out of watchers). * eglot.el (eglot-register-capability): Simplify. (eglot--files-recursively): Delete. (eglot--directories-recursively): Fix. GitHub-reference: fix https://github.com/joaotavora/eglot/issues/697 GitHub-reference: fix https://github.com/joaotavora/eglot/issues/645 --- diff --git a/lisp/progmodes/eglot.el b/lisp/progmodes/eglot.el index a739419e9dc..706fa92522e 100644 --- a/lisp/progmodes/eglot.el +++ b/lisp/progmodes/eglot.el @@ -2777,7 +2777,7 @@ at point. With prefix argument, prompt for ACTION-KIND." (eglot--glob-compile globPattern t t)) watchers)) (dirs-to-watch - (eglot--directories-matched-by-globs default-directory globs))) + (eglot--directories-recursively default-directory))) (cl-labels ((handle-event (event) @@ -2878,37 +2878,14 @@ If NOERROR, return predicate, else erroring function." (when (eq ?! (aref arg 1)) (aset arg 1 ?^)) `(,self () (re-search-forward ,(concat "\\=" arg)) (,next))) -(defun eglot--files-recursively (&optional dir) - "Because `directory-files-recursively' isn't complete in 26.3." - (cons (setq dir (expand-file-name (or dir default-directory))) - (cl-loop with default-directory = dir - with completion-regexp-list = '("^[^.]") - for f in (file-name-all-completions "" dir) - if (file-directory-p f) append (eglot--files-recursively f) - else collect (expand-file-name f)))) - (defun eglot--directories-recursively (&optional dir) "Because `directory-files-recursively' isn't complete in 26.3." (cons (setq dir (expand-file-name (or dir default-directory))) (cl-loop with default-directory = dir with completion-regexp-list = '("^[^.]") for f in (file-name-all-completions "" dir) - if (file-directory-p f) append (eglot--files-recursively f) - else collect (expand-file-name f)))) - -(defun eglot--directories-matched-by-globs (dir globs) - "Discover subdirectories of DIR with files matched by one of GLOBS. -Each element of GLOBS is either an uncompiled glob-string or a -compiled glob." - (setq globs (cl-loop for g in globs - collect (if (stringp g) (eglot--glob-compile g t t) g))) - (cl-loop for f in (eglot--files-recursively dir) - for fdir = (file-name-directory f) - when (and - (not (member fdir dirs)) - (cl-loop for g in globs thereis (funcall g f))) - collect fdir into dirs - finally (cl-return (delete-dups dirs)))) + if (file-directory-p f) + append (eglot--directories-recursively f)))) ;;; Rust-specific