Upgrade company package to 0.8.5

This commit is contained in:
Gergely Polonkai 2014-10-05 16:31:58 +02:00
parent 20bf94ef4f
commit cffda58dca
36 changed files with 282 additions and 177 deletions

View File

@ -1,2 +0,0 @@
*.elc
ert.el

View File

@ -19,8 +19,5 @@ install:
sudo apt-get install -qq emacs-snapshot;
fi
before_script:
make downloads
script:
make test-batch EMACS=${EMACS}

View File

@ -1,3 +1,15 @@
2014-09-14 Dmitry Gutov <dgutov@yandex.ru>
Merge commit 'fa4ba155a3e22ddc4b8bc33fcbf8cc69ef8f0043' from company
2014-09-13 Dmitry Gutov <dgutov@yandex.ru>
Merge commit '2ef6263c65a109b4d36503e6484fdbf4cb307d0f' from company
2014-08-27 Dmitry Gutov <dgutov@yandex.ru>
Merge commit 'f4ffe2b47cf6854ff3bc3ca1717efe1258c01547' from company
2014-07-26 Dmitry Gutov <dgutov@yandex.ru>
Merge commit 'b1d019a4c815ac8bdc240d69eaa74eb4e34640e8' from

View File

@ -1,6 +1,4 @@
EMACS=emacs
CURL=curl --silent
ERT_URL=http://git.savannah.gnu.org/cgit/emacs.git/plain/lisp/emacs-lisp/ert.el?h=emacs-24.3
.PHONY: ert test test-batch
@ -29,9 +27,5 @@ test-batch:
${EMACS} -Q --batch -L . -l company-tests.el -l company-elisp-tests.el \
--eval "(ert-run-tests-batch-and-exit '(not (tag interactive)))"
downloads:
${EMACS} -Q --batch -l ert || \
${CURL} ${ERT_URL} > ert.el
compile:
${EMACS} -Q --batch -L . -f batch-byte-compile company.el company-*.el

View File

@ -1,5 +1,19 @@
# History of user-visible changes
## 2014-08-13 (0.8.4)
* `company-ropemacs` is only used when `ropemacs-mode` is on.
* `company-gtags` is enabled in all `prog-mode` derivatives by default.
* `company-end-of-buffer-workaround` is not used anymore.
* `company-begin-commands` includes several `cc-mode` commands.
## 2014-08-27 (0.8.3)
* On Emacs 24.4 or newer, tooltip positioning takes line-spacing into account.
* New face `company-tooltip-search`, used for the search string in the tooltip.
* The default value of `company-dabbrev-minimum-length` is set to 4, independent
of the `company-minimum-prefix-length` value.
## 2014-07-26 (0.8.2)
* New user option `company-occurrence-weight-function`, allowing to tweak the

View File

@ -4,7 +4,7 @@
;;;### (autoloads (global-company-mode company-mode) "company" "company.el"
;;;;;; (21475 23817 56009 901000))
;;;;;; (21553 22041 719690 945000))
;;; Generated autoloads from company.el
(autoload 'company-mode "company" "\
@ -58,7 +58,7 @@ See `company-mode' for more information on Company mode.
;;;***
;;;### (autoloads (company-abbrev) "company-abbrev" "company-abbrev.el"
;;;;;; (21475 23816 615018 715000))
;;;;;; (21553 22041 262700 327000))
;;; Generated autoloads from company-abbrev.el
(autoload 'company-abbrev "company-abbrev" "\
@ -69,7 +69,7 @@ See `company-mode' for more information on Company mode.
;;;***
;;;### (autoloads (company-bbdb) "company-bbdb" "company-bbdb.el"
;;;;;; (21475 23817 97009 82000))
;;;;;; (21553 22041 760690 102000))
;;; Generated autoloads from company-bbdb.el
(autoload 'company-bbdb "company-bbdb" "\
@ -79,8 +79,8 @@ See `company-mode' for more information on Company mode.
;;;***
;;;### (autoloads (company-css) "company-css" "company-css.el" (21475
;;;;;; 23816 641018 195000))
;;;### (autoloads (company-css) "company-css" "company-css.el" (21553
;;;;;; 22041 295699 650000))
;;; Generated autoloads from company-css.el
(autoload 'company-css "company-css" "\
@ -91,7 +91,7 @@ See `company-mode' for more information on Company mode.
;;;***
;;;### (autoloads (company-dabbrev) "company-dabbrev" "company-dabbrev.el"
;;;;;; (21475 23816 683017 356000))
;;;;;; (21553 22041 336698 811000))
;;; Generated autoloads from company-dabbrev.el
(autoload 'company-dabbrev "company-dabbrev" "\
@ -102,7 +102,7 @@ dabbrev-like `company-mode' completion back-end.
;;;***
;;;### (autoloads (company-dabbrev-code) "company-dabbrev-code" "company-dabbrev-code.el"
;;;;;; (21475 23817 330004 425000))
;;;;;; (21553 22041 992685 338000))
;;; Generated autoloads from company-dabbrev-code.el
(autoload 'company-dabbrev-code "company-dabbrev-code" "\
@ -115,7 +115,7 @@ comments or strings.
;;;***
;;;### (autoloads (company-elisp) "company-elisp" "company-elisp.el"
;;;;;; (21475 23816 807014 878000))
;;;;;; (21553 22041 461696 242000))
;;; Generated autoloads from company-elisp.el
(autoload 'company-elisp "company-elisp" "\
@ -126,7 +126,7 @@ comments or strings.
;;;***
;;;### (autoloads (company-etags) "company-etags" "company-etags.el"
;;;;;; (21475 23816 392023 172000))
;;;;;; (21553 22041 55704 578000))
;;; Generated autoloads from company-etags.el
(autoload 'company-etags "company-etags" "\
@ -137,7 +137,7 @@ comments or strings.
;;;***
;;;### (autoloads (company-files) "company-files" "company-files.el"
;;;;;; (21475 23816 847014 78000))
;;;;;; (21553 22041 511695 221000))
;;; Generated autoloads from company-files.el
(autoload 'company-files "company-files" "\
@ -148,7 +148,7 @@ comments or strings.
;;;***
;;;### (autoloads (company-gtags) "company-gtags" "company-gtags.el"
;;;;;; (21475 23817 379003 447000))
;;;;;; (21553 22042 50684 150000))
;;; Generated autoloads from company-gtags.el
(autoload 'company-gtags "company-gtags" "\
@ -159,7 +159,7 @@ comments or strings.
;;;***
;;;### (autoloads (company-ispell) "company-ispell" "company-ispell.el"
;;;;;; (21475 23816 351023 991000))
;;;;;; (21553 22041 3705 646000))
;;; Generated autoloads from company-ispell.el
(autoload 'company-ispell "company-ispell" "\
@ -170,7 +170,7 @@ comments or strings.
;;;***
;;;### (autoloads (company-keywords) "company-keywords" "company-keywords.el"
;;;;;; (21475 23816 426022 492000))
;;;;;; (21553 22041 88703 901000))
;;; Generated autoloads from company-keywords.el
(autoload 'company-keywords "company-keywords" "\
@ -181,7 +181,7 @@ comments or strings.
;;;***
;;;### (autoloads (company-nxml) "company-nxml" "company-nxml.el"
;;;;;; (21475 23816 467021 673000))
;;;;;; (21553 22041 130703 38000))
;;; Generated autoloads from company-nxml.el
(autoload 'company-nxml "company-nxml" "\
@ -192,7 +192,7 @@ comments or strings.
;;;***
;;;### (autoloads (company-oddmuse) "company-oddmuse" "company-oddmuse.el"
;;;;;; (21475 23816 881013 399000))
;;;;;; (21553 22041 544694 537000))
;;; Generated autoloads from company-oddmuse.el
(autoload 'company-oddmuse "company-oddmuse" "\
@ -203,7 +203,7 @@ comments or strings.
;;;***
;;;### (autoloads (company-pysmell) "company-pysmell" "company-pysmell.el"
;;;;;; (21475 23816 990011 221000))
;;;;;; (21553 22041 652692 320000))
;;; Generated autoloads from company-pysmell.el
(autoload 'company-pysmell "company-pysmell" "\
@ -215,7 +215,7 @@ This requires pysmell.el and pymacs.el.
;;;***
;;;### (autoloads (company-semantic) "company-semantic" "company-semantic.el"
;;;;;; (21475 23817 594999 129000))
;;;;;; (21553 22042 308678 850000))
;;; Generated autoloads from company-semantic.el
(autoload 'company-semantic "company-semantic" "\
@ -226,7 +226,7 @@ This requires pysmell.el and pymacs.el.
;;;***
;;;### (autoloads (company-tempo) "company-tempo" "company-tempo.el"
;;;;;; (21475 23817 172007 583000))
;;;;;; (21553 22041 835688 555000))
;;; Generated autoloads from company-tempo.el
(autoload 'company-tempo "company-tempo" "\
@ -237,7 +237,7 @@ This requires pysmell.el and pymacs.el.
;;;***
;;;### (autoloads (company-xcode) "company-xcode" "company-xcode.el"
;;;;;; (21475 23817 247006 84000))
;;;;;; (21553 22041 901687 207000))
;;; Generated autoloads from company-xcode.el
(autoload 'company-xcode "company-xcode" "\
@ -248,7 +248,7 @@ This requires pysmell.el and pymacs.el.
;;;***
;;;### (autoloads (company-yasnippet) "company-yasnippet" "company-yasnippet.el"
;;;;;; (21475 23817 487001 288000))
;;;;;; (21553 22042 158681 930000))
;;; Generated autoloads from company-yasnippet.el
(autoload 'company-yasnippet "company-yasnippet" "\
@ -281,7 +281,7 @@ shadow back-ends that come after it. Recommended usages:
;;;### (autoloads nil nil ("company-capf.el" "company-clang.el" "company-cmake.el"
;;;;;; "company-eclim.el" "company-elisp-tests.el" "company-pkg.el"
;;;;;; "company-ropemacs.el" "company-template.el" "company-tests.el")
;;;;;; (21475 23817 679245 801000))
;;;;;; (21553 22042 393632 690000))
;;;***

View File

@ -28,7 +28,20 @@
(require 'company)
(require 'cl-lib)
(defvar company--capf-cache nil)
(defun company--capf-data ()
(let ((cache company--capf-cache))
(if (and (equal (current-buffer) (car cache))
(equal (point) (car (setq cache (cdr cache))))
(equal (buffer-chars-modified-tick) (car (setq cache (cdr cache)))))
(cadr cache)
(let ((data (company--capf-data-real)))
(setq company--capf-cache
(list (current-buffer) (point) (buffer-chars-modified-tick) data))
data))))
(defun company--capf-data-real ()
(cl-letf* (((default-value 'completion-at-point-functions)
;; Ignore tags-completion-at-point-function because it subverts
;; company-etags in the default value of company-backends, where

View File

@ -66,7 +66,7 @@ See also `company-dabbrev-code-time-limit'."
:type 'boolean)
(defcustom company-dabbrev-code-ignore-case nil
"Non-nil to ignore case in completion candidates."
"Non-nil to ignore case when collecting completion candidates."
:type 'boolean)
(defsubst company-dabbrev-code--make-regexp (prefix)

View File

@ -51,7 +51,9 @@ See also `company-dabbrev-time-limit'."
:type 'regexp)
(defcustom company-dabbrev-ignore-case 'keep-prefix
"The value of `ignore-case' returned by `company-dabbrev'.")
"Non-nil to ignore case when collecting completion candidates.
When it's `keep-prefix', the text before point will remain unchanged after
candidate is inserted, even some of its characters have different case.")
(defcustom company-dabbrev-downcase 'case-replace
"Whether to downcase the returned candidates.
@ -63,9 +65,11 @@ Any other value means downcase.
If you set this value to nil, you may also want to set
`company-dabbrev-ignore-case' to any value other than `keep-prefix'.")
(defcustom company-dabbrev-minimum-length (1+ company-minimum-prefix-length)
"The minimum length for the string to be included."
:type 'integer)
(defcustom company-dabbrev-minimum-length 4
"The minimum length for the completion candidate to be included.
This variable affects both `company-dabbrev' and `company-dabbrev-code'."
:type 'integer
:package-version '(company . "0.8.3"))
(defmacro company-dabrev--time-limit-while (test start limit &rest body)
(declare (indent 3) (debug t))
@ -95,7 +99,7 @@ If you set this value to nil, you may also want to set
start limit
(setq match (match-string-no-properties 0))
(if (and ignore-comments (company-in-string-or-comment))
(re-search-backward "\\s<\\|\\s!\\|\\s\"\\|\\s|" nil t)
(goto-char (nth 8 (syntax-ppss)))
(when (>= (length match) company-dabbrev-minimum-length)
(push match symbols))))
(goto-char (or pos (point-min)))
@ -135,14 +139,15 @@ If you set this value to nil, you may also want to set
(interactive (company-begin-backend 'company-dabbrev))
(prefix (company-grab-word))
(candidates
(let ((words (company-dabbrev--search (company-dabbrev--make-regexp arg)
company-dabbrev-time-limit
(pcase company-dabbrev-other-buffers
(`t (list major-mode))
(`all `all))))
(downcase-p (if (eq company-dabbrev-downcase 'case-replace)
case-replace
company-dabbrev-downcase)))
(let* ((case-fold-search company-dabbrev-ignore-case)
(words (company-dabbrev--search (company-dabbrev--make-regexp arg)
company-dabbrev-time-limit
(pcase company-dabbrev-other-buffers
(`t (list major-mode))
(`all `all))))
(downcase-p (if (eq company-dabbrev-downcase 'case-replace)
case-replace
company-dabbrev-downcase)))
(if downcase-p
(mapcar 'downcase words)
words)))

View File

@ -48,7 +48,12 @@
(defvar-local company-gtags--tags-available-p 'unknown)
(defvar company-gtags-modes '(c-mode c++-mode jde-mode java-mode php-mode))
(defcustom company-gtags-modes '(prog-mode jde-mode)
"Modes that use `company-gtags'.
In all these modes (and their derivatives) `company-gtags' will perform
completion."
:type '(repeat (symbol :tag "Major mode"))
:package-version '(company . "0.8.4"))
(defun company-gtags--tags-available-p ()
(if (eq company-gtags--tags-available-p 'unknown)
@ -90,7 +95,7 @@
(cl-case command
(interactive (company-begin-backend 'company-gtags))
(prefix (and company-gtags-executable
(memq major-mode company-gtags-modes)
(apply #'derived-mode-p company-gtags-modes)
(not (company-in-string-or-comment))
(company-gtags--tags-available-p)
(or (company-grab-symbol) 'stop)))

View File

@ -1,2 +1,2 @@
;; Generated package description from company.el
(define-package "company" "0.8.2" "Modular text completion framework" '((emacs "24.1") (cl-lib "0.5")) :url "http://company-mode.github.io/" :keywords '("abbrev" "convenience" "matching"))
(define-package "company" "0.8.5" "Modular text completion framework" '((emacs "24.1") (cl-lib "0.5")) :url "http://company-mode.github.io/" :keywords '("abbrev" "convenience" "matching"))

View File

@ -1,6 +1,6 @@
;;; company-ropemacs.el --- company-mode completion back-end for ropemacs
;; Copyright (C) 2009-2011, 2013 Free Software Foundation, Inc.
;; Copyright (C) 2009-2011, 2013-2014 Free Software Foundation, Inc.
;; Author: Nikolaj Schumacher
@ -56,15 +56,11 @@
"`company-mode' completion back-end for ropemacs.
Depends on third-party code: Pymacs (both Python and Emacs packages),
rope, ropemacs and ropemode."
rope, ropemacs and ropemode. Requires `ropemacs-mode' to be on."
(interactive (list 'interactive))
(cl-case command
(init (when (and (derived-mode-p 'python-mode)
(not (fboundp 'rope-completions)))
(require 'pymacs)
(pymacs-load "ropemacs" "rope-")))
(interactive (company-begin-backend 'company-ropemacs))
(prefix (and (derived-mode-p 'python-mode)
(prefix (and (bound-and-true-p ropemacs-mode)
(not (company-in-string-or-comment))
(company-ropemacs--grab-symbol)))
(candidates (mapcar (lambda (element) (concat arg element))

View File

@ -30,6 +30,9 @@
(require 'company-keywords)
(require 'company-clang)
(defun company--column (&optional pos)
(car (company--col-row pos)))
;;; Core
(ert-deftest company-sorted-keywords ()
@ -395,7 +398,7 @@
(let (this-command)
(company-call 'complete))
(company-call 'open-line 1)
(should (eq 2 (overlay-start company-pseudo-tooltip-overlay)))))))
(should (eq 1 (overlay-start company-pseudo-tooltip-overlay)))))))
(ert-deftest company-pseudo-tooltip-show ()
:tags '(interactive)
@ -415,8 +418,8 @@
;; FIXME: Make it 2?
(should (eq (overlay-get ov 'company-height) company-tooltip-limit))
(should (eq (overlay-get ov 'company-column) col))
(should (string= (overlay-get ov 'company-after)
" 123 \nc 45 c\nddd\n")))))))
(should (string= (overlay-get ov 'company-display)
"\n 123 \nc 45 c\nddd\n")))))))
(ert-deftest company-pseudo-tooltip-edit-updates-width ()
:tags '(interactive)
@ -445,8 +448,10 @@
(let ((company-candidates-length 1)
(company-candidates '("123")))
(company-preview-show-at-point (point))
(let ((ov company-preview-overlay))
(should (string= (overlay-get ov 'display) "123\n")))))))
(let* ((ov company-preview-overlay)
(str (overlay-get ov 'after-string)))
(should (string= str "123"))
(should (eq (get-text-property 0 'cursor str) t)))))))
(ert-deftest company-pseudo-tooltip-show-with-annotations ()
:tags '(interactive)
@ -465,8 +470,8 @@
(let ((ov company-pseudo-tooltip-overlay))
;; With margins.
(should (eq (overlay-get ov 'company-width) 8))
(should (string= (overlay-get ov 'company-after)
" 123(4) \n 45 \n")))))))
(should (string= (overlay-get ov 'company-display)
"\n 123(4) \n 45 \n")))))))
(ert-deftest company-pseudo-tooltip-show-with-annotations-right-aligned ()
:tags '(interactive)
@ -486,8 +491,8 @@
(let ((ov company-pseudo-tooltip-overlay))
;; With margins.
(should (eq (overlay-get ov 'company-width) 13))
(should (string= (overlay-get ov 'company-after)
" 123 (4) \n 45 \n 67 (891011) \n")))))))
(should (string= (overlay-get ov 'company-display)
"\n 123 (4) \n 45 \n 67 (891011) \n")))))))
(ert-deftest company-create-lines-shows-numbers ()
(let ((company-show-numbers t)
@ -522,24 +527,84 @@
(format " %s " (make-string (- ww 2) ?4)))
(company--create-lines 0 999))))))
(ert-deftest company-create-lines-truncates-common-part ()
(let* ((ww (company--window-width))
(company-candidates-length 2)
(company-tooltip-margin 1)
(company-backend #'ignore))
(let* ((company-common (make-string (- ww 3) ?1))
(company-candidates `(,(concat company-common "2")
,(concat company-common "3"))))
(should (equal (list (format " %s2 " (make-string (- ww 3) ?1))
(format " %s3 " (make-string (- ww 3) ?1)))
(company--create-lines 0 999))))
(let* ((company-common (make-string (- ww 2) ?1))
(company-candidates `(,(concat company-common "2")
,(concat company-common "3"))))
(should (equal (list (format " %s " company-common)
(format " %s " company-common))
(company--create-lines 0 999))))
(let* ((company-common (make-string ww ?1))
(company-candidates `(,(concat company-common "2")
,(concat company-common "3")))
(res (company--create-lines 0 999)))
(should (equal (list (format " %s " (make-string (- ww 2) ?1))
(format " %s " (make-string (- ww 2) ?1)))
res))
(should (eq 'company-tooltip-common-selection
(get-text-property (- ww 2) 'face
(car res))))
(should (eq 'company-tooltip-selection
(get-text-property (1- ww) 'face
(car res))))
)))
(ert-deftest company-column-with-composition ()
:tags '(interactive)
(with-temp-buffer
(insert "lambda ()")
(compose-region 1 (1+ (length "lambda")) "\\")
(should (= (company--column) 4))))
(save-window-excursion
(set-window-buffer nil (current-buffer))
(insert "lambda ()")
(compose-region 1 (1+ (length "lambda")) "\\")
(should (= (company--column) 4)))))
(ert-deftest company-column-with-line-prefix ()
:tags '(interactive)
(with-temp-buffer
(insert "foo")
(put-text-property (point-min) (point) 'line-prefix " ")
(should (= (company--column) 5))))
(save-window-excursion
(set-window-buffer nil (current-buffer))
(insert "foo")
(put-text-property (point-min) (point) 'line-prefix " ")
(should (= (company--column) 5)))))
(ert-deftest company-column-wth-line-prefix-on-empty-line ()
(ert-deftest company-column-with-line-prefix-on-empty-line ()
:tags '(interactive)
(with-temp-buffer
(insert "\n")
(forward-char -1)
(put-text-property (point-min) (point-max) 'line-prefix " ")
(should (= (company--column) 2))))
(save-window-excursion
(set-window-buffer nil (current-buffer))
(insert "\n")
(forward-char -1)
(put-text-property (point-min) (point-max) 'line-prefix " ")
(should (= (company--column) 2)))))
(ert-deftest company-column-with-tabs ()
:tags '(interactive)
(with-temp-buffer
(save-window-excursion
(set-window-buffer nil (current-buffer))
(insert "|\t|\t|\t(")
(let ((tab-width 8))
(should (= (company--column) 25))))))
(ert-deftest company-row-with-header-line-format ()
:tags '(interactive)
(with-temp-buffer
(save-window-excursion
(set-window-buffer nil (current-buffer))
(should (= (company--row) 0))
(setq header-line-format "aaaaaaa")
(should (= (company--row) 0)))))
(ert-deftest company-plainify ()
(let ((tab-width 8))
@ -552,6 +617,22 @@
(company-plainify (propertize "foobar" 'line-prefix "-*-"))
"-*-foobar")))
(ert-deftest company-buffer-lines-with-lines-folded ()
:tags '(interactive)
(with-temp-buffer
(insert (propertize "aaa\nbbb\nccc\nddd\n" 'display "aaa+\n"))
(insert "eee\nfff\nggg")
(should (equal (company-buffer-lines (point-min) (point-max))
'("aaa" "eee" "fff" "ggg")))))
(ert-deftest company-buffer-lines-with-multiline-display ()
:tags '(interactive)
(with-temp-buffer
(insert (propertize "a" 'display "bbb\nccc\ndddd\n"))
(insert "eee\nfff\nggg")
(should (equal (company-buffer-lines (point-min) (point-max))
'("" "" "" "eee" "fff" "ggg")))))
(ert-deftest company-modify-line ()
(let ((str "-*-foobar"))
(should (equal-including-properties

View File

@ -5,7 +5,7 @@
;; Author: Nikolaj Schumacher
;; Maintainer: Dmitry Gutov <dgutov@yandex.ru>
;; URL: http://company-mode.github.io/
;; Version: 0.8.2
;; Version: 0.8.5
;; Keywords: abbrev, convenience, matching
;; Package-Requires: ((emacs "24.1") (cl-lib "0.5"))
@ -58,11 +58,6 @@
;; enrich gtags with dabbrev-code results (to emulate local variables).
;; To do this, add a list with both back-ends as an element in company-backends.
;;
;; Known Issues:
;; When point is at the very end of the buffer, the pseudo-tooltip appears very
;; wrong, unless company is allowed to temporarily insert a fake newline.
;; This behavior is enabled by `company-end-of-buffer-workaround'.
;;
;;; Change Log:
;;
;; See NEWS.md in the repository.
@ -117,6 +112,10 @@ buffer-local wherever it is set."
(t (:background "green")))
"Face used for the selection in the tooltip.")
(defface company-tooltip-search
'((default :inherit company-tooltip-selection))
"Face used for the search string in the tooltip.")
(defface company-tooltip-mouse
'((default :inherit highlight))
"Face used for the tooltip item under the mouse.")
@ -550,7 +549,12 @@ happens. The value of nil means no idle completion."
(const :tag "immediate (0)" 0)
(number :tag "seconds")))
(defcustom company-begin-commands '(self-insert-command org-self-insert-command)
(defcustom company-begin-commands '(self-insert-command
org-self-insert-command
c-scope-operator
c-electric-colon
c-electric-lt-gt
c-electric-slash)
"A list of commands after which idle completion is allowed.
If this is t, it can show completions after any command except a few from a
pre-defined list. See `company-idle-delay'.
@ -559,7 +563,8 @@ Alternatively, any command with a non-nil `company-begin' property is
treated as if it was on this list."
:type '(choice (const :tag "Any command" t)
(const :tag "Self insert command" '(self-insert-command))
(repeat :tag "Commands" function)))
(repeat :tag "Commands" function))
:package-version '(company . "0.8.4"))
(defcustom company-continue-commands '(not save-buffer save-some-buffers
save-buffers-kill-terminal
@ -586,10 +591,6 @@ commands in the `company-' namespace, abort completion."
:type '(choice (const :tag "off" nil)
(const :tag "on" t)))
(defvar company-end-of-buffer-workaround t
"Work around a visualization bug when completing at the end of the buffer.
The work-around consists of adding a newline.")
(defvar company-async-wait 0.03
"Pause between checks to see if the value's been set when turning an
asynchronous call into synchronous.")
@ -626,12 +627,8 @@ asynchronous call into synchronous.")
(define-key keymap "\C-s" 'company-search-candidates)
(define-key keymap "\C-\M-s" 'company-filter-candidates)
(dotimes (i 10)
(define-key keymap (vector (+ (aref (kbd "M-0") 0) i))
`(lambda ()
(interactive)
(company-complete-number ,(if (zerop i) 10 i)))))
keymap)
(define-key keymap (kbd (format "M-%d" i)) 'company-complete-number))
keymap)
"Keymap that is enabled during an active completion.")
(defvar company--disabled-backends nil)
@ -764,7 +761,7 @@ means that `company-mode' is always turned on except in `message-mode' buffers."
;; Hack:
;; Emacs calculates the active keymaps before reading the event. That means we
;; cannot change the keymap from a timer. So we send a bogus command.
;; XXX: Seems not to be needed anymore in Emacs 24.4
;; XXX: Even in Emacs 24.4, seems to be needed in the terminal.
(defun company-ignore ()
(interactive)
(setq this-command last-command))
@ -774,22 +771,21 @@ means that `company-mode' is always turned on except in `message-mode' buffers."
(defun company-input-noop ()
(push 31415926 unread-command-events))
(defun company--column (&optional pos)
(save-excursion
(when pos (goto-char pos))
(save-restriction
(+ (save-excursion
(vertical-motion 0)
(narrow-to-region (point) (point-max))
(let ((prefix (get-text-property (point) 'line-prefix)))
(if prefix (length prefix) 0)))
(current-column)))))
(defun company--posn-col-row (posn)
(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))))
(when (and header-line-format (version< emacs-version "24.3.93.3"))
;; http://debbugs.gnu.org/18384
(cl-decf row))
(cons (+ col (window-hscroll)) row)))
(defun company--col-row (&optional pos)
(company--posn-col-row (posn-at-point pos)))
(defun company--row (&optional pos)
(save-excursion
(when pos (goto-char pos))
(count-screen-lines (window-start)
(progn (vertical-motion 0) (point)))))
(cdr (company--col-row pos)))
;;; backends ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@ -973,8 +969,6 @@ Controlled by `company-auto-complete'.")
(defvar company-timer nil)
(defvar-local company-added-newline nil)
(defsubst company-strip-prefix (str)
(substring str (length company-prefix)))
@ -984,7 +978,7 @@ Controlled by `company-auto-complete'.")
(if (eq (company-call-backend 'ignore-case) 'keep-prefix)
(insert (company-strip-prefix candidate))
(delete-region (- (point) (length company-prefix)) (point))
(insert candidate)))
(insert-before-markers candidate)))
(defmacro company-with-candidate-inserted (candidate &rest body)
"Evaluate BODY with CANDIDATE temporarily inserted.
@ -997,7 +991,8 @@ can retrieve meta-data for them."
(company--insert-candidate ,candidate)
(unwind-protect
(progn ,@body)
(delete-region company-point (point)))))
(delete-region company-point (point))
(set-buffer-modified-p modified-p))))
(defun company-explicit-action-p ()
"Return whether explicit completion action was taken by the user."
@ -1283,8 +1278,7 @@ from the rest of the back-ends in the group, if any, will be left at the end."
(eq tick (buffer-chars-modified-tick))
(eq pos (point))
(when (company-auto-begin)
(when (version< emacs-version "24.3.50")
(company-input-noop))
(company-input-noop)
(company-post-command))))
(defun company-auto-begin ()
@ -1460,11 +1454,6 @@ from the rest of the back-ends in the group, if any, will be left at the end."
(or (and company-candidates (company--continue))
(and (company--should-complete) (company--begin-new)))
(when company-candidates
(let ((modified (buffer-modified-p)))
(when (and company-end-of-buffer-workaround (eobp))
(save-excursion (insert "\n"))
(setq company-added-newline
(or modified (buffer-chars-modified-tick)))))
(setq company-point (point)
company--point-max (point-max))
(company-ensure-emulation-alist)
@ -1472,14 +1461,6 @@ from the rest of the back-ends in the group, if any, will be left at the end."
(company-call-frontends 'update)))
(defun company-cancel (&optional result)
(and company-added-newline
(> (point-max) (point-min))
(let ((tick (buffer-chars-modified-tick)))
(delete-region (1- (point-max)) (point-max))
(equal tick company-added-newline))
;; Only set unmodified when tick remained the same since insert,
;; and the buffer wasn't modified before.
(set-buffer-modified-p nil))
(unwind-protect
(when company-prefix
(if (stringp result)
@ -1488,8 +1469,7 @@ from the rest of the back-ends in the group, if any, will be left at the end."
(run-hook-with-args 'company-completion-finished-hook result)
(company-call-backend 'post-completion result))
(run-hook-with-args 'company-completion-cancelled-hook result)))
(setq company-added-newline nil
company-backend nil
(setq company-backend nil
company-prefix nil
company-candidates nil
company-candidates-length nil
@ -1809,14 +1789,7 @@ and invoke the normal binding."
(>= evt-row (+ row height)))))))
(defun company--event-col-row (event)
(let* ((col-row (posn-actual-col-row (event-start event)))
(col (car col-row))
(row (cdr col-row)))
(cl-incf col (window-hscroll))
(and header-line-format
(version< "24" emacs-version)
(cl-decf row))
(cons col row)))
(company--posn-col-row (event-start event)))
(defun company-select-mouse (event)
"Select the candidate picked by the mouse."
@ -1883,7 +1856,11 @@ inserted."
(defun company-complete-number (n)
"Insert the Nth candidate.
To show the number next to the candidates in some back-ends, enable
`company-show-numbers'."
`company-show-numbers'. When called interactively, uses the last typed
character, stripping the modifiers. That character must be a digit."
(interactive
(list (let ((n (- (event-basic-type last-command-event) ?0)))
(if (zerop n) 10 n))))
(when (company-manual-begin)
(and (or (< n 1) (> n company-candidates-length))
(error "No candidate number %d" n))
@ -2110,8 +2087,8 @@ If SHOW-VERSION is non-nil, show the version in the echo area."
(defun company-fill-propertize (value annotation width selected left right)
(let* ((margin (length left))
(common (+ (or (company-call-backend 'match value)
(length company-common)) margin))
(common (or (company-call-backend 'match value)
(length company-common)))
(ann-ralign company-tooltip-align-annotations)
(ann-truncate (< width
(+ (length value) (length annotation)
@ -2135,6 +2112,7 @@ If SHOW-VERSION is non-nil, show the version in the echo area."
(- width (length annotation)))
annotation))
right)))
(setq common (+ (min common width) margin))
(setq width (+ width margin (length right)))
(add-text-properties 0 width '(face company-tooltip
@ -2155,7 +2133,7 @@ If SHOW-VERSION is non-nil, show the version in the echo area."
(length company-prefix)))
(let ((beg (+ margin (match-beginning 0)))
(end (+ margin (match-end 0))))
(add-text-properties beg end '(face company-tooltip-selection)
(add-text-properties beg end '(face company-tooltip-search)
line)
(when (< beg common)
(add-text-properties beg common
@ -2174,8 +2152,8 @@ If SHOW-VERSION is non-nil, show the version in the echo area."
(defun company-buffer-lines (beg end)
(goto-char beg)
(let (lines)
(while (and (= 1 (vertical-motion 1))
(let (lines lines-moved)
(while (and (> (setq lines-moved (vertical-motion 1)) 0)
(<= (point) end))
(let ((bound (min end (1- (point)))))
;; A visual line can contain several physical lines (e.g. with outline's
@ -2186,6 +2164,10 @@ If SHOW-VERSION is non-nil, show the version in the echo area."
(re-search-forward "$" bound 'move)
(point)))
lines))
;; One physical line can be displayed as several visual ones as well:
;; add empty strings to the list, to even the count.
(dotimes (_ (1- lines-moved))
(push "" lines))
(setq beg (point)))
(unless (eq beg end)
(push (buffer-substring beg end) lines))
@ -2232,10 +2214,12 @@ If SHOW-VERSION is non-nil, show the version in the echo area."
(company--offset-line (pop lines) offset))
new))
(let ((str (concat (when nl "\n")
(let ((str (concat (when nl " ")
"\n"
(mapconcat 'identity (nreverse new) "\n")
"\n")))
(font-lock-append-text-property 0 (length str) 'face 'default str)
(when nl (put-text-property 0 1 'cursor t str))
str)))
(defun company--offset-line (line offset)
@ -2358,12 +2342,13 @@ If SHOW-VERSION is non-nil, show the version in the echo area."
;; show
(defsubst company--window-inner-height ()
(let ((edges (window-inside-edges)))
(- (nth 3 edges) (nth 1 edges))))
(defsubst company--window-height ()
(if (fboundp 'window-screen-lines)
(floor (window-screen-lines))
(window-body-height)))
(defsubst company--window-width ()
(let ((ww (window-width)))
(let ((ww (window-body-width)))
;; Account for the line continuation column.
(when (zerop (cadr (window-fringes)))
(cl-decf ww))
@ -2381,7 +2366,7 @@ If SHOW-VERSION is non-nil, show the version in the echo area."
"Calculate the appropriate tooltip height.
Returns a negative number if the tooltip should be displayed above point."
(let* ((lines (company--row))
(below (- (company--window-inner-height) 1 lines)))
(below (- (company--window-height) 1 lines)))
(if (and (< below (min company-tooltip-minimum company-candidates-length))
(> lines below))
(- (max 3 (min company-tooltip-limit lines)))
@ -2403,7 +2388,7 @@ Returns a negative number if the tooltip should be displayed above point."
(end (save-excursion
(move-to-window-line (+ row (abs height)))
(point)))
(ov (make-overlay beg end))
(ov (make-overlay (if nl beg (1- beg)) end nil t))
(args (list (mapcar 'company-plainify
(company-buffer-lines beg end))
column nl above)))
@ -2412,7 +2397,7 @@ Returns a negative number if the tooltip should be displayed above point."
(overlay-put ov 'company-replacement-args args)
(let ((lines (company--create-lines selection (abs height))))
(overlay-put ov 'company-after
(overlay-put ov 'company-display
(apply 'company--replacement-string lines args))
(overlay-put ov 'company-width (string-width (car lines))))
@ -2420,17 +2405,17 @@ Returns a negative number if the tooltip should be displayed above point."
(overlay-put ov 'company-height height)))))
(defun company-pseudo-tooltip-show-at-point (pos column-offset)
(let ((row (company--row pos))
(col (- (company--column pos) column-offset)))
(let* ((col-row (company--col-row pos))
(col (- (car col-row) column-offset)))
(when (< col 0) (setq col 0))
(company-pseudo-tooltip-show (1+ row) col company-selection)))
(company-pseudo-tooltip-show (1+ (cdr col-row)) col company-selection)))
(defun company-pseudo-tooltip-edit (selection)
(let* ((height (overlay-get company-pseudo-tooltip-overlay 'company-height))
(lines (company--create-lines selection (abs height))))
(overlay-put company-pseudo-tooltip-overlay 'company-width
(string-width (car lines)))
(overlay-put company-pseudo-tooltip-overlay 'company-after
(overlay-put company-pseudo-tooltip-overlay 'company-display
(apply 'company--replacement-string
lines
(overlay-get company-pseudo-tooltip-overlay
@ -2444,26 +2429,32 @@ Returns a negative number if the tooltip should be displayed above point."
(defun company-pseudo-tooltip-hide-temporarily ()
(when (overlayp company-pseudo-tooltip-overlay)
(overlay-put company-pseudo-tooltip-overlay 'invisible nil)
(overlay-put company-pseudo-tooltip-overlay 'line-prefix nil)
(overlay-put company-pseudo-tooltip-overlay 'after-string nil)))
(defun company-pseudo-tooltip-unhide ()
(when company-pseudo-tooltip-overlay
(overlay-put company-pseudo-tooltip-overlay 'invisible t)
;; Beat outline's folding overlays, at least.
(overlay-put company-pseudo-tooltip-overlay 'priority 1)
;; No (extra) prefix for the first line.
(overlay-put company-pseudo-tooltip-overlay 'line-prefix "")
(overlay-put company-pseudo-tooltip-overlay 'after-string
(overlay-get company-pseudo-tooltip-overlay 'company-after))
(overlay-put company-pseudo-tooltip-overlay 'window (selected-window))))
(let* ((ov company-pseudo-tooltip-overlay)
(disp (overlay-get ov 'company-display)))
;; Beat outline's folding overlays, at least.
(overlay-put ov 'priority 1)
;; `display' could be better (http://debbugs.gnu.org/18285), but it
;; doesn't work when the overlay is empty, which is what happens at eob.
;; It also seems to interact badly with `cursor'.
;; We deal with priorities by having the overlay start before the newline.
(overlay-put ov 'after-string disp)
(overlay-put ov 'invisible t)
(overlay-put ov 'window (selected-window)))))
(defun company-pseudo-tooltip-guard ()
(list
(cons
(save-excursion (beginning-of-visual-line))
(let ((ov company-pseudo-tooltip-overlay))
(let ((ov company-pseudo-tooltip-overlay)
(overhang (save-excursion (end-of-visual-line)
(- (line-end-position) (point)))))
(when (>= (overlay-get ov 'company-height) 0)
(buffer-substring-no-properties (point) (overlay-start ov))))))
(cons
(buffer-substring-no-properties (point) (overlay-start ov))
(when (>= overhang 0) overhang))))))
(defun company-pseudo-tooltip-frontend (command)
"`company-mode' front-end similar to a tooltip but based on overlays."
@ -2502,7 +2493,7 @@ Returns a negative number if the tooltip should be displayed above point."
(defun company-preview-show-at-point (pos)
(company-preview-hide)
(setq company-preview-overlay (make-overlay pos (1+ pos)))
(setq company-preview-overlay (make-overlay pos pos))
(let ((completion (nth company-selection company-candidates)))
(setq completion (propertize completion 'face 'company-preview))
@ -2523,10 +2514,9 @@ Returns a negative number if the tooltip should be displayed above point."
(not (equal completion ""))
(add-text-properties 0 1 '(cursor t) completion))
(overlay-put company-preview-overlay 'display
(concat completion (unless (eq pos (point-max))
(buffer-substring pos (1+ pos)))))
(overlay-put company-preview-overlay 'window (selected-window))))
(let ((ov company-preview-overlay))
(overlay-put ov 'after-string completion)
(overlay-put ov 'window (selected-window)))))
(defun company-preview-hide ()
(when company-preview-overlay
@ -2549,8 +2539,8 @@ Returns a negative number if the tooltip should be displayed above point."
(defun company--show-inline-p ()
(and (not (cdr company-candidates))
company-common
(string-prefix-p company-prefix company-common
(company-call-backend 'ignore-case))))
(or (eq (company-call-backend 'ignore-case) 'keep-prefix)
(string-prefix-p company-prefix company-common))))
;;; echo ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@ -2579,7 +2569,7 @@ Returns a negative number if the tooltip should be displayed above point."
(defun company-echo-format ()
(let ((limit (window-width (minibuffer-window)))
(let ((limit (window-body-width (minibuffer-window)))
(len -1)
;; Roll to selection.
(candidates (nthcdr company-selection company-candidates))
@ -2609,7 +2599,7 @@ Returns a negative number if the tooltip should be displayed above point."
(defun company-echo-strip-common-format ()
(let ((limit (window-width (minibuffer-window)))
(let ((limit (window-body-width (minibuffer-window)))
(len (+ (length company-prefix) 2))
;; Roll to selection.
(candidates (nthcdr company-selection company-candidates))