------------------------------------------------------------ revno: 373 committer: Dmitry Gutov <dgu...@yandex.ru> branch nick: elpa timestamp: Sat 2013-03-23 08:19:13 +0400 message: company: Release 0.6.1 modified: packages/company/.dir-locals.el packages/company/company-clang.el packages/company/company-eclim.el packages/company/company-pkg.el packages/company/company-template.el packages/company/company-tests.el packages/company/company.el
=== modified file 'packages/company/.dir-locals.el' --- a/packages/company/.dir-locals.el 2013-03-19 03:47:51 +0000 +++ b/packages/company/.dir-locals.el 2013-03-23 04:19:13 +0000 @@ -1,2 +1,4 @@ ((nil . ((indent-tabs-mode . nil) - (fill-column . 80)))) + (fill-column . 80) + (sentence-end-double-space . t) + (emacs-lisp-docstring-fill-column . t))))
=== modified file 'packages/company/company-clang.el' --- a/packages/company/company-clang.el 2013-03-19 03:47:51 +0000 +++ b/packages/company/company-clang.el 2013-03-23 04:19:13 +0000 @@ -181,34 +181,42 @@ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -(defconst company-clang-required-version "1.1") +(defconst company-clang-required-version 1.1) (defsubst company-clang-version () "Return the version of `company-clang-executable'." (with-temp-buffer (call-process company-clang-executable nil t nil "--version") (goto-char (point-min)) - (if (re-search-forward "clang version \\([0-9.]+\\)" nil t) - (match-string-no-properties 1) - "0"))) + (if (re-search-forward "clang\\(?: version \\|-\\)\\([0-9.]+\\)" nil t) + (let ((ver (string-to-number (match-string-no-properties 1)))) + (if (> ver 100) + (/ ver 100) + ver)) + 0))) (defun company-clang-objc-templatify (selector) (let* ((end (point)) (beg (- (point) (length selector))) - (templ (company-template-declare-template beg end))) + (templ (company-template-declare-template beg end)) + (cnt 0)) (save-excursion (goto-char beg) (while (search-forward ":" end t) - (replace-match ": ") - (incf end 2) - (company-template-add-field templ (1- (match-end 0)) "<arg>")) - (delete-char -1)) + (let* ((name (format "arg%d" cnt)) + (len (length name))) + (incf end len) + (company-template-add-field templ (match-end 0) name) + (goto-char (+ (match-end 0) len)) + (when (< (point) end) + (insert " ") + (incf end)) + (incf cnt)))) (company-template-move-to-first templ))) (defun company-clang (command &optional arg &rest ignored) "A `company-mode' completion back-end for clang. -Clang is a parser for C and ObjC. The unreleased development version of -clang (1.1) is required. +Clang is a parser for C and ObjC. Clang version 1.1 or newer is required. Additional command line arguments can be specified in `company-clang-arguments'. Prefix files (-include ...) can be selected @@ -220,11 +228,11 @@ (interactive (list 'interactive)) (case command (interactive (company-begin-backend 'company-clang)) - (init (unless company-clang-executable - (error "Company found no clang executable")) - (when (version< (company-clang-version) - company-clang-required-version) - (error "Company requires clang version 1.1"))) + (init (when (memq major-mode company-clang-modes) + (unless company-clang-executable + (error "Company found no clang executable")) + (when (< (company-clang-version) company-clang-required-version) + (error "Company requires clang version 1.1")))) (prefix (and (memq major-mode company-clang-modes) buffer-file-name company-clang-executable @@ -237,6 +245,9 @@ "#]" " " (replace-regexp-in-string "[<{[]#\\|#[>}]" "" meta t) t)))) + (crop (and (derived-mode-p 'objc-mode) + (string-match ":" arg) + (substring arg 0 (match-beginning 0)))) (post-completion (and (derived-mode-p 'objc-mode) (string-match ":" arg) (company-clang-objc-templatify arg))))) === modified file 'packages/company/company-eclim.el' --- a/packages/company/company-eclim.el 2013-03-19 03:47:51 +0000 +++ b/packages/company/company-eclim.el 2013-03-23 04:19:13 +0000 @@ -60,7 +60,7 @@ (defvar company-eclim--project-dir 'unknown) (make-variable-buffer-local 'company-eclim--project-dir) -(defvar company-eclim--project-name 'unknown) +(defvar company-eclim--project-name nil) (make-variable-buffer-local 'company-eclim--project-name) (defvar company-eclim--doc nil) @@ -93,15 +93,16 @@ company-eclim--project-dir)) (defun company-eclim--project-name () - (if (eq company-eclim--project-name 'unknown) - (setq company-eclim--project-name - (let ((project (find-if (lambda (project) - (equal (cdr (assoc 'path project)) - (company-eclim--project-dir))) - (company-eclim--project-list)))) - (when project - (cdr (assoc 'name project))))) - company-eclim--project-name)) + (or company-eclim--project-name + (let ((dir (company-eclim--project-dir))) + (when dir + (setq company-eclim--project-name + (let ((project (find-if (lambda (project) + (equal (cdr (assoc 'path project)) + dir)) + (company-eclim--project-list)))) + (when project + (cdr (assoc 'name project))))))))) (defun company-eclim--candidates (prefix) (interactive "d") @@ -116,25 +117,37 @@ "-p" (company-eclim--project-name) "-f" project-file)) (setq company-eclim--doc - (cdr (assoc 'completions - (company-eclim--call-process - "java_complete" "-p" (company-eclim--project-name) - "-f" project-file - "-o" (number-to-string (1- (point))) - "-e" "utf-8" - "-l" "standard"))))) + (make-hash-table :test 'equal)) + (dolist (item (cdr (assoc 'completions + (company-eclim--call-process + "java_complete" "-p" (company-eclim--project-name) + "-f" project-file + "-o" (number-to-string (1- (point))) + "-e" "utf-8" + "-l" "standard")))) + (let* ((meta (cdr (assoc 'info item))) + (completion meta)) + (when (string-match " [:-]" completion) + (setq completion (substring completion 0 (match-beginning 0)))) + (puthash completion meta company-eclim--doc)))) (let ((completion-ignore-case nil)) - ;; TODO: Handle overloaded methods somehow. Show one candidate per overload? - ;; That would look nice, but kinda useless: a bunch of candidates for the - ;; same completion. Maybe do expansion like `company-clang-objc-templatify'. - (all-completions prefix (mapcar (lambda (item) (cdr (assoc 'completion item))) - company-eclim--doc)))) + (all-completions prefix company-eclim--doc))) (defun company-eclim--meta (candidate) - (cdr (assoc 'info (find-if - (lambda (item) (equal (cdr (assoc 'completion item)) - arg)) - company-eclim--doc)))) + (gethash candidate company-eclim--doc)) + +(defun company-eclim--templatify (call) + (let* ((end (point)) + (beg (- (point) (length call))) + (templ (company-template-declare-template beg end))) + (save-excursion + (goto-char beg) + (while (re-search-forward "\\([(,] ?\\)\\([^ ]+ \\)\\([^ ,)]*\\)" end t) + (let ((name (match-string 3))) + (replace-match "\\1" t) + (decf end (length (match-string 2))) + (company-template-add-field templ (point) name)))) + (company-template-move-to-first templ))) (defun company-eclim (command &optional arg &rest ignored) "A `company-mode' completion back-end for eclim. @@ -153,9 +166,12 @@ (or (company-grab-symbol) 'stop))) (candidates (company-eclim--candidates arg)) (meta (company-eclim--meta arg)) - (duplicates t) ;; because "" doesn't return everything - (no-cache (equal arg "")))) + (no-cache (equal arg "")) + (crop (when (string-match "(" arg) + (substring arg 0 (match-beginning 0)))) + (post-completion (when (string-match "([^)]" arg) + (company-eclim--templatify arg))))) (provide 'company-eclim) ;;; company-eclim.el ends here === modified file 'packages/company/company-pkg.el' --- a/packages/company/company-pkg.el 2013-03-19 14:45:31 +0000 +++ b/packages/company/company-pkg.el 2013-03-23 04:19:13 +0000 @@ -1,1 +1,1 @@ -(define-package "company" "0.6" "Modular in-buffer completion framework") +(define-package "company" "0.6.1" "Modular in-buffer completion framework") === modified file 'packages/company/company-template.el' --- a/packages/company/company-template.el 2013-03-19 03:47:51 +0000 +++ b/packages/company/company-template.el 2013-03-23 04:19:13 +0000 @@ -31,14 +31,12 @@ (defvar company-template-nav-map (let ((keymap (make-sparse-keymap))) - (define-key keymap [remap forward-word] 'company-template-forward-field) - (define-key keymap [remap subword-forward] 'company-template-forward-field) - ;; M-n + (define-key keymap [tab] 'company-template-forward-field) keymap)) ;; interactive ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -(defsubst company-template-templates-at (pos) +(defun company-template-templates-at (pos) (let (os) (dolist (o (overlays-at pos)) (when (overlay-get o 'company-template-fields) @@ -53,19 +51,22 @@ (defun company-template-forward-field () (interactive) - (let* ((templates (company-template-templates-at (point))) + (let* ((start (point)) + (templates (company-template-templates-at (point))) (minimum (apply 'max (mapcar 'overlay-end templates))) - (fields (apply 'append - (mapcar (lambda (templ) - (overlay-get templ 'company-template-fields)) - templates)))) + (fields (loop for templ in templates + append (overlay-get templ 'company-template-fields)))) (dolist (pos (mapcar 'overlay-start fields)) (and pos (> pos (point)) (< pos minimum) (setq minimum pos))) (push-mark) - (goto-char minimum))) + (goto-char minimum) + (let ((field (loop for ovl in (overlays-at start) + when (overlay-get ovl 'company-template-parent) + return ovl))) + (company-template-remove-field field)))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -76,6 +77,7 @@ (let ((ov (make-overlay beg end))) ;; (overlay-put ov 'face 'highlight) (overlay-put ov 'keymap company-template-nav-map) + (overlay-put ov 'priority 101) (overlay-put ov 'evaporate t) (push ov company-template--buffer-templates) (add-hook 'post-command-hook 'company-template-post-command nil t) @@ -91,42 +93,47 @@ (defun company-template-add-field (templ pos text) (assert templ) (save-excursion - ;; (goto-char pos) - (let ((ov (make-overlay pos pos)) - (siblings (overlay-get templ 'company-template-fields)) - (label (propertize text 'face 'company-template-field - 'company-template-parent templ))) - (overlay-put ov 'face 'highlight) - (add-text-properties 0 1 '(cursor t) label) - (overlay-put ov 'after-string label) + (save-excursion + (goto-char pos) + (insert text) + (when (> (point) (overlay-end templ)) + (move-overlay templ (overlay-start templ) (point)))) + (let ((ov (make-overlay pos (+ pos (length text)))) + (siblings (overlay-get templ 'company-template-fields))) ;; (overlay-put ov 'evaporate t) (overlay-put ov 'intangible t) + (overlay-put ov 'face 'company-template-field) (overlay-put ov 'company-template-parent templ) - (overlay-put ov 'insert-in-front-hooks '(company-template-remove)) + (overlay-put ov 'insert-in-front-hooks '(company-template-insert-hook)) (push ov siblings) (overlay-put templ 'company-template-fields siblings)))) -(defun company-template-remove-field (field) - (when (overlayp field) - ;; (delete-region (overlay-start field) (overlay-end field)) - (delete-overlay field)) - ;; TODO: unlink - ) +(defun company-template-remove-field (ovl &optional clear) + (when (overlayp ovl) + (when (overlay-buffer ovl) + (when clear + (delete-region (overlay-start ovl) (overlay-end ovl))) + (delete-overlay ovl)) + (let* ((templ (overlay-get ovl 'company-template-parent)) + (siblings (overlay-get templ 'company-template-fields))) + (setq siblings (delq ovl siblings)) + (overlay-put templ 'company-template-fields siblings)))) (defun company-template-clean-up (&optional pos) "Clean up all templates that don't contain POS." (unless pos (setq pos (point))) (let ((local-ovs (overlays-in (- pos 2) pos))) (dolist (templ company-template--buffer-templates) - (unless (memq templ local-ovs) + (unless (and (memq templ local-ovs) + (overlay-get templ 'company-template-fields)) (company-template-remove-template templ))))) ;; hooks ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -(defun company-template-remove (overlay after-p beg end &optional r) +(defun company-template-insert-hook (ovl after-p &rest ignore) "Called when a snippet input prompt is modified." - (when after-p - (delete-overlay overlay))) + (unless after-p + (company-template-remove-field ovl t))) (defun company-template-post-command () (company-template-clean-up) === modified file 'packages/company/company-tests.el' --- a/packages/company/company-tests.el 2013-03-19 14:15:57 +0000 +++ b/packages/company/company-tests.el 2013-03-23 04:19:13 +0000 @@ -1,6 +1,6 @@ ;;; company-tests.el --- company-mode tests -;; Copyright (C) 2011 Free Software Foundation, Inc. +;; Copyright (C) 2011, 2013 Free Software Foundation, Inc. ;; Author: Nikolaj Schumacher @@ -29,7 +29,7 @@ (require 'company) (require 'company-keywords) -(ert-deftest sorted-keywords () +(ert-deftest company-sorted-keywords () "Test that keywords in `company-keywords-alist' are in alphabetical order." (dolist (pair company-keywords-alist) (when (consp (cdr pair)) @@ -38,3 +38,39 @@ (should (not (equal prev next))) (should (string< prev next)) (setq prev next)))))) + +(ert-deftest company-good-prefix () + (let ((company-minimum-prefix-length 5) + company--explicit-action) + (should (eq t (company--good-prefix-p "!@#$%"))) + (should (eq nil (company--good-prefix-p "abcd"))) + (should (eq nil (company--good-prefix-p 'stop))) + (should (eq t (company--good-prefix-p '("foo" . 5)))) + (should (eq nil (company--good-prefix-p '("foo" . 4)))))) + +(ert-deftest company-multi-backend-with-lambdas () + (let ((company-backend + (list (lambda (command &optional arg &rest ignore) + (case command + (prefix "z") + (candidates '("a" "b")))) + (lambda (command &optional arg &rest ignore) + (case command + (prefix "z") + (candidates '("c" "d"))))))) + (should (equal (company-call-backend 'candidates "z") '("a" "b" "c" "d"))))) + +(ert-deftest company-begin-backend-failure-doesnt-break-company-backends () + (with-temp-buffer + (insert "a") + (company-mode) + (should-error + (company-begin-backend (lambda (command &rest ignore)))) + (let ((company-backends + (list (lambda (command &optional arg) + (case command + (prefix "a") + (candidates '("a" "ab" "ac"))))))) + (company-complete) + (setq this-command 'company-complete) + (should (eq 3 company-candidates-length))))) === modified file 'packages/company/company.el' --- a/packages/company/company.el 2013-03-19 14:45:31 +0000 +++ b/packages/company/company.el 2013-03-23 04:19:13 +0000 @@ -4,7 +4,7 @@ ;; Author: Nikolaj Schumacher ;; Maintainer: Dmitry Gutov <dgu...@yandex.ru> -;; Version: 0.6 +;; Version: 0.6.1 ;; Keywords: abbrev, convenience, matching ;; URL: http://company-mode.github.com/ ;; Compatibility: GNU Emacs 22.x, GNU Emacs 23.x, GNU Emacs 24.x @@ -65,93 +65,7 @@ ;; ;;; Change Log: ;; -;; 2013-03-19 (0.6) -;; Switching between tag files now works correctly with `company-etags'. -;; Clang completions now include macros and are case-sensitive. -;; Added `company-capf': completion adapter using -;; `completion-at-point-functions'. (Stefan Monnier) -;; `company-elisp' has some improvements. -;; Instead of `overrriding-terminal-local-map', we're now using -;; `emulation-mode-map-alists' (experimental). This largely means that when -;; the completion keymap is active, other minor modes' keymaps are still -;; used, so, for example, it's not as easy to circumvent `paredit-mode' -;; accidentally when it's enabled. -;; Fixed two old tooltip annoyances. -;; Some performance improvements. -;; `company-clang' now shows meta information, too. -;; Candidates from grouped back-ends are merged more conservatively: only -;; back-ends that return the same prefix at point are used. -;; Loading of `nxml', `semantic', `pymacs' and `ropemacs' is now deferred. -;; `company-pysmell' is not used by default anymore. -;; Across-the-board bugfixing. -;; -;; 2010-02-24 (0.5) -;; `company-ropemacs' now provides location and docs. (Fernando H. Silva) -;; Added `company-with-candidate-inserted' macro. -;; Added `company-clang' back-end. -;; Added new mechanism for non-consecutive insertion. -;; (So far only used by clang for ObjC.) -;; The semantic back-end now shows meta information for local symbols. -;; Added compatibility for CEDET in Emacs 23.2 and from CVS. (Oleg Andreev) -;; -;; 2009-05-07 (0.4.3) -;; Added `company-other-backend'. -;; Idle completion no longer interrupts multi-key command input. -;; Added `company-ropemacs' and `company-pysmell' back-ends. -;; -;; 2009-04-25 (0.4.2) -;; In C modes . and -> now count towards `company-minimum-prefix-length'. -;; Reverted default front-end back to `company-preview-if-just-one-frontend'. -;; The pseudo tooltip will no longer be clipped at the right window edge. -;; Added `company-tooltip-minimum'. -;; Windows compatibility fixes. -;; -;; 2009-04-19 (0.4.1) -;; Added `global-company-mode'. -;; Performance enhancements. -;; Added `company-eclim' back-end. -;; Added safer workaround for Emacs `posn-col-row' bug. -;; -;; 2009-04-18 (0.4) -;; Automatic completion is now aborted if the prefix gets too short. -;; Added option `company-dabbrev-time-limit'. -;; `company-backends' now supports merging back-ends. -;; Added back-end `company-dabbrev-code' for generic code. -;; Fixed `company-begin-with'. -;; -;; 2009-04-15 (0.3.1) -;; Added 'stop prefix to prevent dabbrev from completing inside of symbols. -;; Fixed issues with tabbar-mode and line-spacing. -;; Performance enhancements. -;; -;; 2009-04-12 (0.3) -;; Added `company-begin-commands' option. -;; Added abbrev, tempo and Xcode back-ends. -;; Back-ends are now interactive. You can start them with M-x backend-name. -;; Added `company-begin-with' for starting company from elisp-code. -;; Added hooks. -;; Added `company-require-match' and `company-auto-complete' options. -;; -;; 2009-04-05 (0.2.1) -;; Improved Emacs Lisp back-end behavior for local variables. -;; Added `company-elisp-detect-function-context' option. -;; The mouse can now be used for selection. -;; -;; 2009-03-22 (0.2) -;; Added `company-show-location'. -;; Added etags back-end. -;; Added work-around for end-of-buffer bug. -;; Added `company-filter-candidates'. -;; More local Lisp variables are now included in the candidates. -;; -;; 2009-03-21 (0.1.5) -;; Fixed elisp documentation buffer always showing the same doc. -;; Added `company-echo-strip-common-frontend'. -;; Added `company-show-numbers' option and M-0 ... M-9 default bindings. -;; Don't hide the echo message if it isn't shown. -;; -;; 2009-03-20 (0.1) -;; Initial release. +;; See NEWS.md in the repository. ;;; Code: @@ -406,6 +320,14 @@ user that choice with `company-require-match'. Return value 'never overrides that option the other way around. +`init': Called once for each buffer, the back-end can check for external +programs and files and load any required libraries. Raising an error here will +show up in message log once, and the backend will not be used for completion. + +`post-completion': Called after a completion candidate has been inserted into +the buffer. The second argument is the candidate. Can be used to modify it, +e.g. to expand a snippet. + The back-end should return nil for all commands it does not support or does not know about. It should also be callable interactively and use `company-begin-backend' to start itself in that case." @@ -544,8 +466,8 @@ (define-key keymap "\C-g" 'company-abort) (define-key keymap (kbd "M-n") 'company-select-next) (define-key keymap (kbd "M-p") 'company-select-previous) - (define-key keymap (kbd "<down>") 'company-select-next) - (define-key keymap (kbd "<up>") 'company-select-previous) + (define-key keymap (kbd "<down>") 'company-select-next-or-abort) + (define-key keymap (kbd "<up>") 'company-select-previous-or-abort) (define-key keymap [down-mouse-1] 'ignore) (define-key keymap [down-mouse-3] 'ignore) (define-key keymap [mouse-1] 'company-complete-mouse) @@ -733,14 +655,16 @@ (apply 'company--multi-backend-adapter company-backend args))) (defun company--multi-backend-adapter (backends command &rest args) - (let ((backends (remove-if (lambda (b) (eq 'failed (get b 'company-init))) + (let ((backends (remove-if (lambda (b) + (and (symbolp b) + (eq 'failed (get b 'company-init)))) backends))) (case command (candidates (loop for backend in backends when (equal (funcall backend 'prefix) (car args)) - nconc (apply backend 'candidates args))) + append (apply backend 'candidates args))) (sorted nil) (duplicates t) (otherwise @@ -782,6 +706,10 @@ "Non-nil, if explicit completion took place.") (make-variable-buffer-local 'company--explicit-action) +(defvar company--auto-completion nil + "Non-nil when current candidate is being completed automatically. +Controlled by `company-auto-complete'.") + (defvar company--point-max nil) (make-variable-buffer-local 'company--point-max) @@ -873,10 +801,15 @@ (push (cons company-prefix company-candidates) company-candidates-cache) ;; Calculate common. (let ((completion-ignore-case (company-call-backend 'ignore-case))) - (setq company-common (try-completion company-prefix company-candidates))) + (setq company-common (company--safe-candidate + (try-completion company-prefix company-candidates)))) (when (eq company-common t) (setq company-candidates nil))) +(defun company--safe-candidate (str) + (or (company-call-backend 'crop str) + str)) + (defun company-calculate-candidates (prefix) (let ((candidates (cdr (assoc prefix company-candidates-cache))) (ignore-case (company-call-backend 'ignore-case))) @@ -909,9 +842,9 @@ (or (cdr candidates) (not (eq t (compare-strings (car candidates) nil nil prefix nil nil ignore-case))))) - ;; Don't start when already completed and unique. candidates - ;; Not the right place? maybe when setting? + ;; Already completed and unique; don't start. + ;; FIXME: Not the right place? maybe when setting? (and company-candidates t)))) (defun company-idle-begin (buf win tick pos) @@ -1006,7 +939,8 @@ ;; auto-complete (save-excursion (goto-char company-point) - (company-complete-selection) + (let ((company--auto-completion t)) + (company-complete-selection)) nil)) ((and (company--string-incremental-p company-prefix new-prefix) (company-require-match-p)) @@ -1022,8 +956,9 @@ (defun company--good-prefix-p (prefix) (and (or (company-explicit-action-p) - (>= (or (cdr-safe prefix) (length prefix)) - company-minimum-prefix-length)) + (unless (eq prefix 'stop) + (>= (or (cdr-safe prefix) (length prefix)) + company-minimum-prefix-length))) (stringp (or (car-safe prefix) prefix)))) (defun company--continue () @@ -1277,9 +1212,7 @@ (interactive) (company-search-assert-enabled) (company-search-mode 0) - (when last-input-event - (clear-this-command-keys t) - (setq unread-command-events (list last-input-event)))) + (company--unread-last-input)) (defvar company-search-map (let ((i 0) @@ -1288,7 +1221,7 @@ (set-char-table-range (nth 1 keymap) (cons #x100 (max-char)) 'company-search-printing-char) (with-no-warnings - ;; obselete in Emacs 23 + ;; obsolete in Emacs 23 (let ((l (generic-character-list)) (table (nth 1 keymap))) (while l @@ -1383,6 +1316,24 @@ (when (company-manual-begin) (company-set-selection (1- company-selection)))) +(defun company-select-next-or-abort () + "Select the next candidate if more than one, else abort +and invoke the normal binding." + (interactive) + (if (> company-candidates-length 1) + (company-select-next) + (company-abort) + (company--unread-last-input))) + +(defun company-select-previous-or-abort () + "Select the previous candidate if more than one, else abort +and invoke the normal binding." + (interactive) + (if (> company-candidates-length 1) + (company-select-previous) + (company-abort) + (company--unread-last-input))) + (defun company-select-mouse (event) "Select the candidate picked by the mouse." (interactive "e") @@ -1402,7 +1353,10 @@ "Complete the selected candidate." (interactive) (when (company-manual-begin) - (company-finish (nth company-selection company-candidates)))) + (let ((result (nth company-selection company-candidates))) + (when company--auto-completion + (setq result (company--safe-candidate result))) + (company-finish result)))) (defun company-complete-common () "Complete the common part of all candidates." @@ -1501,9 +1455,12 @@ (while (memq (setq cmd (key-binding (vector (list (read-event))))) company--electric-commands) (call-interactively cmd)) - (when last-input-event - (clear-this-command-keys t) - (setq unread-command-events (list last-input-event))))))) + (company--unread-last-input))))) + +(defun company--unread-last-input () + (when last-input-event + (clear-this-command-keys t) + (setq unread-command-events (list last-input-event)))) (defun company-show-doc-buffer () "Temporarily show a buffer with the complete documentation for the selection." @@ -1565,7 +1522,9 @@ (setq company-backend backend) ;; Return non-nil if active. (or (company-manual-begin) - (error "Cannot complete at point"))) + (progn + (setq company-backend nil) + (error "Cannot complete at point")))) (defun company-begin-with (candidates &optional prefix-length require-match callback) @@ -1819,8 +1778,7 @@ args)) (overlay-put ov 'company-column column) - (overlay-put ov 'company-height (abs height)) - (overlay-put ov 'window (selected-window)))))) + (overlay-put ov 'company-height (abs height)))))) (defun company-pseudo-tooltip-show-at-point (pos) (let ((col-row (company--col-row pos)))