]> code.delx.au - gnu-emacs/commitdiff
Add caching variant of `completion-table-dynamic'
authorDmitry Gutov <dgutov@yandex.ru>
Fri, 6 Dec 2013 00:48:52 +0000 (02:48 +0200)
committerDmitry Gutov <dgutov@yandex.ru>
Fri, 6 Dec 2013 00:48:52 +0000 (02:48 +0200)
* 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
lisp/ChangeLog
lisp/minibuffer.el
lisp/progmodes/octave.el

index a8c3f273a4bbeaf9a1156313e00654391b0fd78e..27a7e75ccef59a7d9fb220b20ba3c1a2ce1ccbe6 100644 (file)
@@ -1,3 +1,11 @@
+2013-12-06  Dmitry Gutov  <dgutov@yandex.ru>
+
+       * 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  <camdez@gmail.com>  (tiny change)
 
        * emacs-lisp/regexp-opt.el (regexp-opt-charset): Fix ^ (bug#16046).
index 4f445855739849093ccdc48c6d67530e311f9241..178f87c768b5cc5e7d7146f12cbffcd67caa45f1 100644 (file)
@@ -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
index 7b9d7c97f856e4f60cab121ea66cec4a3b33898d..4246b46e238418dcbbea000955567c62b4adbf67 100644 (file)
@@ -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