X-Git-Url: https://code.delx.au/gnu-emacs-elpa/blobdiff_plain/9fb6072f6df1d572a8d92801caef662af667a8af..e52579348d8529b0cff08a1f0a676cb0cc6f61c3:/company.el diff --git a/company.el b/company.el index 399cd31f0..20aedc834 100644 --- a/company.el +++ b/company.el @@ -45,8 +45,7 @@ ;; ;; (defun company-my-backend (command &optional arg &rest ignored) ;; (pcase command -;; (`prefix (when (looking-back "foo\\>") -;; (match-string 0))) +;; (`prefix (company-grab-symbol)) ;; (`candidates (list "foobar" "foobaz" "foobarbaz")) ;; (`meta (format "This value is named %s" arg)))) ;; @@ -313,9 +312,10 @@ This doesn't include the margins and the scroll bar." company-eclim company-semantic company-clang company-xcode company-cmake company-capf + company-files (company-dabbrev-code company-gtags company-etags company-keywords) - company-oddmuse company-files company-dabbrev) + company-oddmuse company-dabbrev) "The list of active backends (completion engines). Only one backend is used at a time. The choice depends on the order of @@ -334,10 +334,10 @@ of the following: text immediately before point. Returning nil from this command passes control to the next backend. The function should return `stop' if it should complete but cannot (e.g. if it is in the middle of a string). -Instead of a string, the backend may return a cons where car is the prefix -and cdr is used instead of the actual prefix length in the comparison -against `company-minimum-prefix-length'. It must be either number or t, -and in the latter case the test automatically succeeds. +Instead of a string, the backend may return a cons (PREFIX . LENGTH) +where LENGTH is a number used in place of PREFIX's length when +comparing against `company-minimum-prefix-length'. LENGTH can also +be just t, and in the latter case the test automatically succeeds. `candidates': The second argument is the prefix to be completed. The return value should be a list of candidates that match the prefix. @@ -432,7 +432,8 @@ Asynchronous backends The return value of each command can also be a cons (:async . FETCHER) where FETCHER is a function of one argument, CALLBACK. When the data arrives, FETCHER must call CALLBACK and pass it the appropriate return -value, as described above. +value, as described above. That call must happen in the same buffer as +where completion was initiated. True asynchronous operation is only supported for command `candidates', and only during idle completion. Other commands will block the user interface, @@ -805,7 +806,9 @@ means that `company-mode' is always turned on except in `message-mode' buffers." (let ((col (car (posn-col-row posn))) ;; `posn-col-row' doesn't work well with lines of different height. ;; `posn-actual-col-row' doesn't handle multiple-width characters. - (row (cdr (posn-actual-col-row posn)))) + (row (cdr (or (posn-actual-col-row posn) + ;; When position is non-visible for some reason. + (posn-col-row posn))))) (when (and header-line-format (version< emacs-version "24.3.93.3")) ;; http://debbugs.gnu.org/18384 (cl-decf row)) @@ -1184,7 +1187,11 @@ can retrieve meta-data for them." company-candidates-cache (list (cons prefix (company--preprocess-candidates candidates)))) - (company-idle-begin buf win tick pt))))) + (unwind-protect + (company-idle-begin buf win tick pt) + (unless company-candidates + (setq company-backend nil + company-candidates-cache nil))))))) ;; FIXME: Relying on the fact that the callers ;; will interpret nil as "do nothing" is shaky. ;; A throw-catch would be one possible improvement. @@ -1523,14 +1530,8 @@ from the rest of the backends in the group, if any, will be left at the end." (company-call-frontends 'update))) (defun company-cancel (&optional result) - (unwind-protect - (when company-prefix - (if (stringp result) - (progn - (company-call-backend 'pre-completion result) - (run-hook-with-args 'company-completion-finished-hook result) - (company-call-backend 'post-completion result)) - (run-hook-with-args 'company-completion-cancelled-hook result))) + (let ((prefix company-prefix) + (backend company-backend)) (setq company-backend nil company-prefix nil company-candidates nil @@ -1549,7 +1550,16 @@ from the rest of the backends in the group, if any, will be left at the end." (company-echo-cancel t) (company-search-mode 0) (company-call-frontends 'hide) - (company-enable-overriding-keymap nil)) + (company-enable-overriding-keymap nil) + (when prefix + ;; FIXME: RESULT can also be e.g. `unique'. We should call + ;; `company-completion-finished-hook' in that case, with right argument. + (if (stringp result) + (let ((company-backend backend)) + (company-call-backend 'pre-completion result) + (run-hook-with-args 'company-completion-finished-hook result) + (company-call-backend 'post-completion result)) + (run-hook-with-args 'company-completion-cancelled-hook result)))) ;; Make return value explicit. nil) @@ -1637,7 +1647,9 @@ each one wraps a part of the input string." (const :tag "Exact match" regexp-quote) (const :tag "Words separated with spaces" company-search-words-regexp) (const :tag "Words separated with spaces, in any order" - company-search-words-in-any-order-regexp))) + company-search-words-in-any-order-regexp) + (const :tag "All characters in given order, with anything in between" + company-search-flex-regexp))) (defvar-local company-search-string "") @@ -1667,6 +1679,15 @@ each one wraps a part of the input string." permutations "\\|"))) +(defun company-search-flex-regexp (input) + (if (zerop (length input)) + "" + (concat (regexp-quote (string (aref input 0))) + (mapconcat (lambda (c) + (concat "[^" (string c) "]*" + (regexp-quote (string c)))) + (substring input 1) "")))) + (defun company--permutations (lst) (if (not lst) '(nil)