]> code.delx.au - gnu-emacs-elpa/commitdiff
Don't assign to company-point in company-abort and company-finish
authorDmitry Gutov <dgutov@yandex.ru>
Tue, 24 Jun 2014 03:21:05 +0000 (06:21 +0300)
committerDmitry Gutov <dgutov@yandex.ru>
Tue, 24 Jun 2014 03:21:05 +0000 (06:21 +0300)
* Closes #143

* Rename `company-begin' to `company--perform'.

* Drop `company-begin-commands' checks from `company--should-complete', they
  should be satisfied at that point already.

* When creating timer, replace company-point comparison check with disallowing
  this-command to come from company- namespace.

NEWS.md
company.el

diff --git a/NEWS.md b/NEWS.md
index e9738c882705ea797f18ac511c5bf683cc86a28d..c0ea782bd096e99bfb1f67cc843f522c2713454c 100644 (file)
--- a/NEWS.md
+++ b/NEWS.md
@@ -2,6 +2,7 @@
 
 ## Next
 
+* The meaning of `company-begin-commands` value t has slightly changed.
 * New transformer, `company-sort-by-backend-importance`.
 * When grouped back-ends are used, the back-end of the current candidate is
   indicated in the mode-line, enclosed in angle brackets.
index ae05d32e793b874b6397c9e95e5b18944622af1b..973328bf099c76e5eb06233d9977a3dfba5595ba 100644 (file)
@@ -548,8 +548,8 @@ immediately when a prefix of `company-minimum-prefix-length' is reached."
 
 (defcustom company-begin-commands '(self-insert-command org-self-insert-command)
   "A list of commands after which idle completion is allowed.
-If this is t, it can show completions after any command.  See
-`company-idle-delay'.
+If this is t, it can show completions after any command except those in the
+`company-' namespace.  See `company-idle-delay'.
 
 Alternatively, any command with a non-nil `company-begin' property is
 treated as if it was on this list."
@@ -1006,17 +1006,18 @@ can retrieve meta-data for them."
     candidate))
 
 (defun company--should-complete ()
-  (and (not (or buffer-read-only overriding-terminal-local-map
+  (and (eq company-idle-delay t)
+       (not (or buffer-read-only overriding-terminal-local-map
                 overriding-local-map))
        ;; Check if in the middle of entering a key combination.
        (or (equal (this-command-keys-vector) [])
            (not (keymapp (key-binding (this-command-keys-vector)))))
-       (eq company-idle-delay t)
-       (or (eq t company-begin-commands)
-           (memq this-command company-begin-commands)
-           (and (symbolp this-command) (get this-command 'company-begin)))
        (not (and transient-mark-mode mark-active))))
 
+(defsubst company--this-command-p ()
+  (and (symbolp this-command)
+       (string-match-p "\\`company-" (symbol-name this-command))))
+
 (defun company--should-continue ()
   (or (eq t company-begin-commands)
       (eq t company-continue-commands)
@@ -1024,7 +1025,7 @@ can retrieve meta-data for them."
           (not (memq this-command (cdr company-continue-commands)))
         (or (memq this-command company-begin-commands)
             (memq this-command company-continue-commands)
-            (string-match-p "\\`company-" (symbol-name this-command))))))
+            (company--this-command-p)))))
 
 (defun company-call-frontends (command)
   (dolist (frontend company-frontends)
@@ -1254,10 +1255,9 @@ from the rest of the back-ends in the group, if any, will be left at the end."
 (defun company-auto-begin ()
   (and company-mode
        (not company-candidates)
-       (let ((company-idle-delay t)
-             (company-begin-commands t))
+       (let ((company-idle-delay t))
          (condition-case-unless-debug err
-             (company-begin)
+             (company--perform)
            (error (message "Company: An error occurred in auto-begin")
                   (message "%s" (error-message-string err))
                   (company-cancel))
@@ -1414,7 +1414,7 @@ from the rest of the back-ends in the group, if any, will be left at the end."
             (company-call-frontends 'show)))
         (cl-return c)))))
 
-(defun company-begin ()
+(defun company--perform ()
   (or (and company-candidates (company--continue))
       (and (company--should-complete) (company--begin-new)))
   (when company-candidates
@@ -1470,15 +1470,11 @@ from the rest of the back-ends in the group, if any, will be left at the end."
 
 (defun company-abort ()
   (interactive)
-  (company-cancel t)
-  ;; Don't start again, unless started manually.
-  (setq company-point (point)))
+  (company-cancel t))
 
 (defun company-finish (result)
   (company--insert-candidate result)
-  (company-cancel result)
-  ;; Don't start again, unless started manually.
-  (setq company-point (point)))
+  (company-cancel result))
 
 (defsubst company-keep (command)
   (and (symbolp command) (get command 'company-keep)))
@@ -1503,13 +1499,11 @@ from the rest of the back-ends in the group, if any, will be left at the end."
     (condition-case err
         (progn
           (unless (equal (point) company-point)
-            (company-begin))
+            (company--perform))
           (if company-candidates
               (company-call-frontends 'post-command)
             (and (numberp company-idle-delay)
-                 (or (eq t company-begin-commands)
-                     (memq this-command company-begin-commands))
-                 (not (equal (point) company-point))
+                 (company--should-idle-begin)
                  (setq company-timer
                        (run-with-timer company-idle-delay nil
                                        'company-idle-begin
@@ -1520,6 +1514,15 @@ from the rest of the back-ends in the group, if any, will be left at the end."
              (company-cancel))))
   (company-install-map))
 
+(defun company--should-idle-begin ()
+  (if (eq t company-begin-commands)
+      ;; Cheap check against starting after `company-abort',
+      ;; `company-complete-selection', etc.
+      (not (company--this-command-p))
+    (or
+     (memq this-command company-begin-commands)
+     (and (symbolp this-command) (get this-command 'company-begin)))))
+
 ;;; search ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
 (defvar-local company-search-string nil)