[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
bug#11906: 24.1; completion-at-point failures
From: |
Dmitry Gutov |
Subject: |
bug#11906: 24.1; completion-at-point failures |
Date: |
Thu, 05 Dec 2013 05:23:37 +0200 |
User-agent: |
Gnus/5.13 (Gnus v5.13) Emacs/24.3.50 (gnu/linux) |
Stefan Monnier <monnier@iro.umontreal.ca> writes:
> Probably, yes. It would turn test-completion and try-completion into
> calls to all-completions and then cache one "arg+result" of
> all-completions (this pair would be sufficient to cover all calls to
> test/try/all-completion for any argument string which has `arg' as its
> prefix).
How does this patch look?
(The Octave part is 100% untested).
=== modified file 'lisp/minibuffer.el'
--- lisp/minibuffer.el 2013-11-24 14:08:02 +0000
+++ lisp/minibuffer.el 2013-12-05 03:22:09 +0000
@@ -190,6 +190,24 @@
(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
=== modified file 'lisp/progmodes/octave.el'
--- lisp/progmodes/octave.el 2013-12-02 07:13:01 +0000
+++ lisp/progmodes/octave.el 2013-12-05 03:15:06 +0000
@@ -838,21 +838,13 @@
;; `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 @@
(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 @@
(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 @@
(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
- bug#11906: 24.1; completion-at-point failures,
Dmitry Gutov <=
- bug#11906: 24.1; completion-at-point failures, Stefan Monnier, 2013/12/04
- bug#11906: 24.1; completion-at-point failures, Dmitry Gutov, 2013/12/05
- bug#11906: 24.1; completion-at-point failures, Leo Liu, 2013/12/05
- bug#11906: 24.1; completion-at-point failures, Dmitry Gutov, 2013/12/05
- bug#11906: 24.1; completion-at-point failures, Leo Liu, 2013/12/06
- bug#11906: 24.1; completion-at-point failures, Dmitry Gutov, 2013/12/06
- bug#11906: 24.1; completion-at-point failures, Leo Liu, 2013/12/06
- bug#11906: 24.1; completion-at-point failures, Stefan Monnier, 2013/12/06
- bug#11906: 24.1; completion-at-point failures, Leo Liu, 2013/12/06
- bug#11906: 24.1; completion-at-point failures, Stefan Monnier, 2013/12/07