From: Dmitry Gutov Date: Fri, 6 Dec 2013 00:48:52 +0000 (+0200) Subject: Add caching variant of `completion-table-dynamic' X-Git-Tag: emacs-24.3.90~173^2^2~42^2~45^2~387^2~545 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=16588fadd0bf0b0a19a3ccc279944ed0220b915c;p=emacs.git Add caching variant of `completion-table-dynamic' * lisp/minibuffer.el (completion-table-with-cache): New function. * lisp/progmodes/octave.el (inferior-octave-completion-table): Turn back into function, use `completion-table-with-cache'. Update all references. Fixes: debbugs:11906 --- diff --git a/lisp/ChangeLog b/lisp/ChangeLog index a8c3f273a4b..27a7e75ccef 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,11 @@ +2013-12-06 Dmitry Gutov + + * progmodes/octave.el (inferior-octave-completion-table): Turn + back into function, use `completion-table-with-cache' + (Bug#11906). Update all references. + + * minibuffer.el (completion-table-with-cache): New function. + 2013-12-05 Cameron Desautels (tiny change) * emacs-lisp/regexp-opt.el (regexp-opt-charset): Fix ^ (bug#16046). diff --git a/lisp/minibuffer.el b/lisp/minibuffer.el index 4f445855739..178f87c768b 100644 --- a/lisp/minibuffer.el +++ b/lisp/minibuffer.el @@ -190,6 +190,24 @@ that can be used as the COLLECTION argument to `try-completion' and (current-buffer))) (complete-with-action action (funcall fun string) string pred))))) +(defun completion-table-with-cache (fun &optional ignore-case) + "Create dynamic completion table from FUN, with cache. +This wraps `completion-table-dynamic', but saves the last +argument-result pair from FUN, so that several lookups with the +same argument (or with an argument that starts with the first one) +only need to call FUN once. Most useful when FUN performs a relatively +slow operation, such as calling an external process (see Bug#11906). +When IGNORE-CASE is non-nil, FUN is expected to be case-insensitive." + (let* (last-arg last-result + (new-fun + (lambda (arg) + (if (and last-arg (string-prefix-p last-arg arg ignore-case)) + last-result + (prog1 + (setq last-result (funcall fun arg)) + (setq last-arg arg)))))) + (completion-table-dynamic new-fun))) + (defmacro lazy-completion-table (var fun) "Initialize variable VAR as a lazy completion table. If the completion table VAR is used for the first time (e.g., by passing VAR diff --git a/lisp/progmodes/octave.el b/lisp/progmodes/octave.el index 7b9d7c97f85..4246b46e238 100644 --- a/lisp/progmodes/octave.el +++ b/lisp/progmodes/octave.el @@ -838,21 +838,13 @@ startup file, `~/.emacs-octave'." ;; `comint-history-isearch-backward-regexp'. Bug#14433. (comint-send-string proc "\n"))) -(defvar inferior-octave-completion-table - ;; - ;; Use cache to avoid repetitive computation of completions due to - ;; bug#11906 - http://debbugs.gnu.org/11906 - which may cause - ;; noticeable delay. CACHE: (CMD . VALUE). - (let ((cache)) - (completion-table-dynamic - (lambda (command) - (unless (equal (car cache) command) - (inferior-octave-send-list-and-digest - (list (format "completion_matches ('%s');\n" command))) - (setq cache (cons command - (delete-consecutive-dups - (sort inferior-octave-output-list 'string-lessp))))) - (cdr cache))))) +(defun inferior-octave-completion-table () + (completion-table-with-cache + (lambda (command) + (inferior-octave-send-list-and-digest + (list (format "completion_matches ('%s');\n" command))) + (delete-consecutive-dups + (sort inferior-octave-output-list 'string-lessp))))) (defun inferior-octave-completion-at-point () "Return the data to complete the Octave symbol at point." @@ -864,7 +856,7 @@ startup file, `~/.emacs-octave'." (end (point))) (when (and beg (> end beg)) (list beg end (completion-table-in-turn - inferior-octave-completion-table + (inferior-octave-completion-table) 'comint-completion-file-name-table)))))) (define-obsolete-function-alias 'inferior-octave-complete @@ -1022,7 +1014,7 @@ directory and makes this the current buffer's default directory." (completing-read (format (if def "Function (default %s): " "Function: ") def) - inferior-octave-completion-table + (inferior-octave-completion-table) nil nil nil nil def))) (defun octave-goto-function-definition (fn) @@ -1406,7 +1398,7 @@ The block marked is the one that contains point or follows point." (setq end (point)))) (when (> end beg) (list beg end (or (and (inferior-octave-process-live-p) - inferior-octave-completion-table) + (inferior-octave-completion-table)) octave-reserved-words))))) (define-obsolete-function-alias 'octave-complete-symbol