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; sudo apt-get install -qq emacs-snapshot;
fi fi
before_script:
make downloads
script: script:
make test-batch EMACS=${EMACS} 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> 2014-07-26 Dmitry Gutov <dgutov@yandex.ru>
Merge commit 'b1d019a4c815ac8bdc240d69eaa74eb4e34640e8' from Merge commit 'b1d019a4c815ac8bdc240d69eaa74eb4e34640e8' from

View File

@ -1,6 +1,4 @@
EMACS=emacs 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 .PHONY: ert test test-batch
@ -29,9 +27,5 @@ test-batch:
${EMACS} -Q --batch -L . -l company-tests.el -l company-elisp-tests.el \ ${EMACS} -Q --batch -L . -l company-tests.el -l company-elisp-tests.el \
--eval "(ert-run-tests-batch-and-exit '(not (tag interactive)))" --eval "(ert-run-tests-batch-and-exit '(not (tag interactive)))"
downloads:
${EMACS} -Q --batch -l ert || \
${CURL} ${ERT_URL} > ert.el
compile: compile:
${EMACS} -Q --batch -L . -f batch-byte-compile company.el company-*.el ${EMACS} -Q --batch -L . -f batch-byte-compile company.el company-*.el

View File

@ -1,5 +1,19 @@
# History of user-visible changes # 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) ## 2014-07-26 (0.8.2)
* New user option `company-occurrence-weight-function`, allowing to tweak the * 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" ;;;### (autoloads (global-company-mode company-mode) "company" "company.el"
;;;;;; (21475 23817 56009 901000)) ;;;;;; (21553 22041 719690 945000))
;;; Generated autoloads from company.el ;;; Generated autoloads from company.el
(autoload 'company-mode "company" "\ (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" ;;;### (autoloads (company-abbrev) "company-abbrev" "company-abbrev.el"
;;;;;; (21475 23816 615018 715000)) ;;;;;; (21553 22041 262700 327000))
;;; Generated autoloads from company-abbrev.el ;;; Generated autoloads from company-abbrev.el
(autoload 'company-abbrev "company-abbrev" "\ (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" ;;;### (autoloads (company-bbdb) "company-bbdb" "company-bbdb.el"
;;;;;; (21475 23817 97009 82000)) ;;;;;; (21553 22041 760690 102000))
;;; Generated autoloads from company-bbdb.el ;;; Generated autoloads from company-bbdb.el
(autoload 'company-bbdb "company-bbdb" "\ (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 ;;;### (autoloads (company-css) "company-css" "company-css.el" (21553
;;;;;; 23816 641018 195000)) ;;;;;; 22041 295699 650000))
;;; Generated autoloads from company-css.el ;;; Generated autoloads from company-css.el
(autoload 'company-css "company-css" "\ (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" ;;;### (autoloads (company-dabbrev) "company-dabbrev" "company-dabbrev.el"
;;;;;; (21475 23816 683017 356000)) ;;;;;; (21553 22041 336698 811000))
;;; Generated autoloads from company-dabbrev.el ;;; Generated autoloads from company-dabbrev.el
(autoload 'company-dabbrev "company-dabbrev" "\ (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" ;;;### (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 ;;; Generated autoloads from company-dabbrev-code.el
(autoload 'company-dabbrev-code "company-dabbrev-code" "\ (autoload 'company-dabbrev-code "company-dabbrev-code" "\
@ -115,7 +115,7 @@ comments or strings.
;;;*** ;;;***
;;;### (autoloads (company-elisp) "company-elisp" "company-elisp.el" ;;;### (autoloads (company-elisp) "company-elisp" "company-elisp.el"
;;;;;; (21475 23816 807014 878000)) ;;;;;; (21553 22041 461696 242000))
;;; Generated autoloads from company-elisp.el ;;; Generated autoloads from company-elisp.el
(autoload 'company-elisp "company-elisp" "\ (autoload 'company-elisp "company-elisp" "\
@ -126,7 +126,7 @@ comments or strings.
;;;*** ;;;***
;;;### (autoloads (company-etags) "company-etags" "company-etags.el" ;;;### (autoloads (company-etags) "company-etags" "company-etags.el"
;;;;;; (21475 23816 392023 172000)) ;;;;;; (21553 22041 55704 578000))
;;; Generated autoloads from company-etags.el ;;; Generated autoloads from company-etags.el
(autoload 'company-etags "company-etags" "\ (autoload 'company-etags "company-etags" "\
@ -137,7 +137,7 @@ comments or strings.
;;;*** ;;;***
;;;### (autoloads (company-files) "company-files" "company-files.el" ;;;### (autoloads (company-files) "company-files" "company-files.el"
;;;;;; (21475 23816 847014 78000)) ;;;;;; (21553 22041 511695 221000))
;;; Generated autoloads from company-files.el ;;; Generated autoloads from company-files.el
(autoload 'company-files "company-files" "\ (autoload 'company-files "company-files" "\
@ -148,7 +148,7 @@ comments or strings.
;;;*** ;;;***
;;;### (autoloads (company-gtags) "company-gtags" "company-gtags.el" ;;;### (autoloads (company-gtags) "company-gtags" "company-gtags.el"
;;;;;; (21475 23817 379003 447000)) ;;;;;; (21553 22042 50684 150000))
;;; Generated autoloads from company-gtags.el ;;; Generated autoloads from company-gtags.el
(autoload 'company-gtags "company-gtags" "\ (autoload 'company-gtags "company-gtags" "\
@ -159,7 +159,7 @@ comments or strings.
;;;*** ;;;***
;;;### (autoloads (company-ispell) "company-ispell" "company-ispell.el" ;;;### (autoloads (company-ispell) "company-ispell" "company-ispell.el"
;;;;;; (21475 23816 351023 991000)) ;;;;;; (21553 22041 3705 646000))
;;; Generated autoloads from company-ispell.el ;;; Generated autoloads from company-ispell.el
(autoload 'company-ispell "company-ispell" "\ (autoload 'company-ispell "company-ispell" "\
@ -170,7 +170,7 @@ comments or strings.
;;;*** ;;;***
;;;### (autoloads (company-keywords) "company-keywords" "company-keywords.el" ;;;### (autoloads (company-keywords) "company-keywords" "company-keywords.el"
;;;;;; (21475 23816 426022 492000)) ;;;;;; (21553 22041 88703 901000))
;;; Generated autoloads from company-keywords.el ;;; Generated autoloads from company-keywords.el
(autoload 'company-keywords "company-keywords" "\ (autoload 'company-keywords "company-keywords" "\
@ -181,7 +181,7 @@ comments or strings.
;;;*** ;;;***
;;;### (autoloads (company-nxml) "company-nxml" "company-nxml.el" ;;;### (autoloads (company-nxml) "company-nxml" "company-nxml.el"
;;;;;; (21475 23816 467021 673000)) ;;;;;; (21553 22041 130703 38000))
;;; Generated autoloads from company-nxml.el ;;; Generated autoloads from company-nxml.el
(autoload 'company-nxml "company-nxml" "\ (autoload 'company-nxml "company-nxml" "\
@ -192,7 +192,7 @@ comments or strings.
;;;*** ;;;***
;;;### (autoloads (company-oddmuse) "company-oddmuse" "company-oddmuse.el" ;;;### (autoloads (company-oddmuse) "company-oddmuse" "company-oddmuse.el"
;;;;;; (21475 23816 881013 399000)) ;;;;;; (21553 22041 544694 537000))
;;; Generated autoloads from company-oddmuse.el ;;; Generated autoloads from company-oddmuse.el
(autoload 'company-oddmuse "company-oddmuse" "\ (autoload 'company-oddmuse "company-oddmuse" "\
@ -203,7 +203,7 @@ comments or strings.
;;;*** ;;;***
;;;### (autoloads (company-pysmell) "company-pysmell" "company-pysmell.el" ;;;### (autoloads (company-pysmell) "company-pysmell" "company-pysmell.el"
;;;;;; (21475 23816 990011 221000)) ;;;;;; (21553 22041 652692 320000))
;;; Generated autoloads from company-pysmell.el ;;; Generated autoloads from company-pysmell.el
(autoload 'company-pysmell "company-pysmell" "\ (autoload 'company-pysmell "company-pysmell" "\
@ -215,7 +215,7 @@ This requires pysmell.el and pymacs.el.
;;;*** ;;;***
;;;### (autoloads (company-semantic) "company-semantic" "company-semantic.el" ;;;### (autoloads (company-semantic) "company-semantic" "company-semantic.el"
;;;;;; (21475 23817 594999 129000)) ;;;;;; (21553 22042 308678 850000))
;;; Generated autoloads from company-semantic.el ;;; Generated autoloads from company-semantic.el
(autoload 'company-semantic "company-semantic" "\ (autoload 'company-semantic "company-semantic" "\
@ -226,7 +226,7 @@ This requires pysmell.el and pymacs.el.
;;;*** ;;;***
;;;### (autoloads (company-tempo) "company-tempo" "company-tempo.el" ;;;### (autoloads (company-tempo) "company-tempo" "company-tempo.el"
;;;;;; (21475 23817 172007 583000)) ;;;;;; (21553 22041 835688 555000))
;;; Generated autoloads from company-tempo.el ;;; Generated autoloads from company-tempo.el
(autoload 'company-tempo "company-tempo" "\ (autoload 'company-tempo "company-tempo" "\
@ -237,7 +237,7 @@ This requires pysmell.el and pymacs.el.
;;;*** ;;;***
;;;### (autoloads (company-xcode) "company-xcode" "company-xcode.el" ;;;### (autoloads (company-xcode) "company-xcode" "company-xcode.el"
;;;;;; (21475 23817 247006 84000)) ;;;;;; (21553 22041 901687 207000))
;;; Generated autoloads from company-xcode.el ;;; Generated autoloads from company-xcode.el
(autoload 'company-xcode "company-xcode" "\ (autoload 'company-xcode "company-xcode" "\
@ -248,7 +248,7 @@ This requires pysmell.el and pymacs.el.
;;;*** ;;;***
;;;### (autoloads (company-yasnippet) "company-yasnippet" "company-yasnippet.el" ;;;### (autoloads (company-yasnippet) "company-yasnippet" "company-yasnippet.el"
;;;;;; (21475 23817 487001 288000)) ;;;;;; (21553 22042 158681 930000))
;;; Generated autoloads from company-yasnippet.el ;;; Generated autoloads from company-yasnippet.el
(autoload 'company-yasnippet "company-yasnippet" "\ (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" ;;;### (autoloads nil nil ("company-capf.el" "company-clang.el" "company-cmake.el"
;;;;;; "company-eclim.el" "company-elisp-tests.el" "company-pkg.el" ;;;;;; "company-eclim.el" "company-elisp-tests.el" "company-pkg.el"
;;;;;; "company-ropemacs.el" "company-template.el" "company-tests.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 'company)
(require 'cl-lib) (require 'cl-lib)
(defvar company--capf-cache nil)
(defun company--capf-data () (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) (cl-letf* (((default-value 'completion-at-point-functions)
;; Ignore tags-completion-at-point-function because it subverts ;; Ignore tags-completion-at-point-function because it subverts
;; company-etags in the default value of company-backends, where ;; 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) :type 'boolean)
(defcustom company-dabbrev-code-ignore-case nil (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) :type 'boolean)
(defsubst company-dabbrev-code--make-regexp (prefix) (defsubst company-dabbrev-code--make-regexp (prefix)

View File

@ -51,7 +51,9 @@ See also `company-dabbrev-time-limit'."
:type 'regexp) :type 'regexp)
(defcustom company-dabbrev-ignore-case 'keep-prefix (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 (defcustom company-dabbrev-downcase 'case-replace
"Whether to downcase the returned candidates. "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 If you set this value to nil, you may also want to set
`company-dabbrev-ignore-case' to any value other than `keep-prefix'.") `company-dabbrev-ignore-case' to any value other than `keep-prefix'.")
(defcustom company-dabbrev-minimum-length (1+ company-minimum-prefix-length) (defcustom company-dabbrev-minimum-length 4
"The minimum length for the string to be included." "The minimum length for the completion candidate to be included.
:type 'integer) 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) (defmacro company-dabrev--time-limit-while (test start limit &rest body)
(declare (indent 3) (debug t)) (declare (indent 3) (debug t))
@ -95,7 +99,7 @@ If you set this value to nil, you may also want to set
start limit start limit
(setq match (match-string-no-properties 0)) (setq match (match-string-no-properties 0))
(if (and ignore-comments (company-in-string-or-comment)) (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) (when (>= (length match) company-dabbrev-minimum-length)
(push match symbols)))) (push match symbols))))
(goto-char (or pos (point-min))) (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)) (interactive (company-begin-backend 'company-dabbrev))
(prefix (company-grab-word)) (prefix (company-grab-word))
(candidates (candidates
(let ((words (company-dabbrev--search (company-dabbrev--make-regexp arg) (let* ((case-fold-search company-dabbrev-ignore-case)
company-dabbrev-time-limit (words (company-dabbrev--search (company-dabbrev--make-regexp arg)
(pcase company-dabbrev-other-buffers company-dabbrev-time-limit
(`t (list major-mode)) (pcase company-dabbrev-other-buffers
(`all `all)))) (`t (list major-mode))
(downcase-p (if (eq company-dabbrev-downcase 'case-replace) (`all `all))))
case-replace (downcase-p (if (eq company-dabbrev-downcase 'case-replace)
company-dabbrev-downcase))) case-replace
company-dabbrev-downcase)))
(if downcase-p (if downcase-p
(mapcar 'downcase words) (mapcar 'downcase words)
words))) words)))

View File

@ -48,7 +48,12 @@
(defvar-local company-gtags--tags-available-p 'unknown) (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 () (defun company-gtags--tags-available-p ()
(if (eq company-gtags--tags-available-p 'unknown) (if (eq company-gtags--tags-available-p 'unknown)
@ -90,7 +95,7 @@
(cl-case command (cl-case command
(interactive (company-begin-backend 'company-gtags)) (interactive (company-begin-backend 'company-gtags))
(prefix (and company-gtags-executable (prefix (and company-gtags-executable
(memq major-mode company-gtags-modes) (apply #'derived-mode-p company-gtags-modes)
(not (company-in-string-or-comment)) (not (company-in-string-or-comment))
(company-gtags--tags-available-p) (company-gtags--tags-available-p)
(or (company-grab-symbol) 'stop))) (or (company-grab-symbol) 'stop)))

View File

@ -1,2 +1,2 @@
;; Generated package description from company.el ;; 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 ;;; 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 ;; Author: Nikolaj Schumacher
@ -56,15 +56,11 @@
"`company-mode' completion back-end for ropemacs. "`company-mode' completion back-end for ropemacs.
Depends on third-party code: Pymacs (both Python and Emacs packages), 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)) (interactive (list 'interactive))
(cl-case command (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)) (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)) (not (company-in-string-or-comment))
(company-ropemacs--grab-symbol))) (company-ropemacs--grab-symbol)))
(candidates (mapcar (lambda (element) (concat arg element)) (candidates (mapcar (lambda (element) (concat arg element))

View File

@ -30,6 +30,9 @@
(require 'company-keywords) (require 'company-keywords)
(require 'company-clang) (require 'company-clang)
(defun company--column (&optional pos)
(car (company--col-row pos)))
;;; Core ;;; Core
(ert-deftest company-sorted-keywords () (ert-deftest company-sorted-keywords ()
@ -395,7 +398,7 @@
(let (this-command) (let (this-command)
(company-call 'complete)) (company-call 'complete))
(company-call 'open-line 1) (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 () (ert-deftest company-pseudo-tooltip-show ()
:tags '(interactive) :tags '(interactive)
@ -415,8 +418,8 @@
;; FIXME: Make it 2? ;; FIXME: Make it 2?
(should (eq (overlay-get ov 'company-height) company-tooltip-limit)) (should (eq (overlay-get ov 'company-height) company-tooltip-limit))
(should (eq (overlay-get ov 'company-column) col)) (should (eq (overlay-get ov 'company-column) col))
(should (string= (overlay-get ov 'company-after) (should (string= (overlay-get ov 'company-display)
" 123 \nc 45 c\nddd\n"))))))) "\n 123 \nc 45 c\nddd\n")))))))
(ert-deftest company-pseudo-tooltip-edit-updates-width () (ert-deftest company-pseudo-tooltip-edit-updates-width ()
:tags '(interactive) :tags '(interactive)
@ -445,8 +448,10 @@
(let ((company-candidates-length 1) (let ((company-candidates-length 1)
(company-candidates '("123"))) (company-candidates '("123")))
(company-preview-show-at-point (point)) (company-preview-show-at-point (point))
(let ((ov company-preview-overlay)) (let* ((ov company-preview-overlay)
(should (string= (overlay-get ov 'display) "123\n"))))))) (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 () (ert-deftest company-pseudo-tooltip-show-with-annotations ()
:tags '(interactive) :tags '(interactive)
@ -465,8 +470,8 @@
(let ((ov company-pseudo-tooltip-overlay)) (let ((ov company-pseudo-tooltip-overlay))
;; With margins. ;; With margins.
(should (eq (overlay-get ov 'company-width) 8)) (should (eq (overlay-get ov 'company-width) 8))
(should (string= (overlay-get ov 'company-after) (should (string= (overlay-get ov 'company-display)
" 123(4) \n 45 \n"))))))) "\n 123(4) \n 45 \n")))))))
(ert-deftest company-pseudo-tooltip-show-with-annotations-right-aligned () (ert-deftest company-pseudo-tooltip-show-with-annotations-right-aligned ()
:tags '(interactive) :tags '(interactive)
@ -486,8 +491,8 @@
(let ((ov company-pseudo-tooltip-overlay)) (let ((ov company-pseudo-tooltip-overlay))
;; With margins. ;; With margins.
(should (eq (overlay-get ov 'company-width) 13)) (should (eq (overlay-get ov 'company-width) 13))
(should (string= (overlay-get ov 'company-after) (should (string= (overlay-get ov 'company-display)
" 123 (4) \n 45 \n 67 (891011) \n"))))))) "\n 123 (4) \n 45 \n 67 (891011) \n")))))))
(ert-deftest company-create-lines-shows-numbers () (ert-deftest company-create-lines-shows-numbers ()
(let ((company-show-numbers t) (let ((company-show-numbers t)
@ -522,24 +527,84 @@
(format " %s " (make-string (- ww 2) ?4))) (format " %s " (make-string (- ww 2) ?4)))
(company--create-lines 0 999)))))) (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 () (ert-deftest company-column-with-composition ()
:tags '(interactive)
(with-temp-buffer (with-temp-buffer
(insert "lambda ()") (save-window-excursion
(compose-region 1 (1+ (length "lambda")) "\\") (set-window-buffer nil (current-buffer))
(should (= (company--column) 4)))) (insert "lambda ()")
(compose-region 1 (1+ (length "lambda")) "\\")
(should (= (company--column) 4)))))
(ert-deftest company-column-with-line-prefix () (ert-deftest company-column-with-line-prefix ()
:tags '(interactive)
(with-temp-buffer (with-temp-buffer
(insert "foo") (save-window-excursion
(put-text-property (point-min) (point) 'line-prefix " ") (set-window-buffer nil (current-buffer))
(should (= (company--column) 5)))) (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 (with-temp-buffer
(insert "\n") (save-window-excursion
(forward-char -1) (set-window-buffer nil (current-buffer))
(put-text-property (point-min) (point-max) 'line-prefix " ") (insert "\n")
(should (= (company--column) 2)))) (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 () (ert-deftest company-plainify ()
(let ((tab-width 8)) (let ((tab-width 8))
@ -552,6 +617,22 @@
(company-plainify (propertize "foobar" 'line-prefix "-*-")) (company-plainify (propertize "foobar" 'line-prefix "-*-"))
"-*-foobar"))) "-*-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 () (ert-deftest company-modify-line ()
(let ((str "-*-foobar")) (let ((str "-*-foobar"))
(should (equal-including-properties (should (equal-including-properties

View File

@ -5,7 +5,7 @@
;; Author: Nikolaj Schumacher ;; Author: Nikolaj Schumacher
;; Maintainer: Dmitry Gutov <dgutov@yandex.ru> ;; Maintainer: Dmitry Gutov <dgutov@yandex.ru>
;; URL: http://company-mode.github.io/ ;; URL: http://company-mode.github.io/
;; Version: 0.8.2 ;; Version: 0.8.5
;; Keywords: abbrev, convenience, matching ;; Keywords: abbrev, convenience, matching
;; Package-Requires: ((emacs "24.1") (cl-lib "0.5")) ;; Package-Requires: ((emacs "24.1") (cl-lib "0.5"))
@ -58,11 +58,6 @@
;; enrich gtags with dabbrev-code results (to emulate local variables). ;; 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. ;; 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: ;;; Change Log:
;; ;;
;; See NEWS.md in the repository. ;; See NEWS.md in the repository.
@ -117,6 +112,10 @@ buffer-local wherever it is set."
(t (:background "green"))) (t (:background "green")))
"Face used for the selection in the tooltip.") "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 (defface company-tooltip-mouse
'((default :inherit highlight)) '((default :inherit highlight))
"Face used for the tooltip item under the mouse.") "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) (const :tag "immediate (0)" 0)
(number :tag "seconds"))) (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. "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 If this is t, it can show completions after any command except a few from a
pre-defined list. See `company-idle-delay'. 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." treated as if it was on this list."
:type '(choice (const :tag "Any command" t) :type '(choice (const :tag "Any command" t)
(const :tag "Self insert command" '(self-insert-command)) (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 (defcustom company-continue-commands '(not save-buffer save-some-buffers
save-buffers-kill-terminal save-buffers-kill-terminal
@ -586,10 +591,6 @@ commands in the `company-' namespace, abort completion."
:type '(choice (const :tag "off" nil) :type '(choice (const :tag "off" nil)
(const :tag "on" t))) (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 (defvar company-async-wait 0.03
"Pause between checks to see if the value's been set when turning an "Pause between checks to see if the value's been set when turning an
asynchronous call into synchronous.") asynchronous call into synchronous.")
@ -626,12 +627,8 @@ asynchronous call into synchronous.")
(define-key keymap "\C-s" 'company-search-candidates) (define-key keymap "\C-s" 'company-search-candidates)
(define-key keymap "\C-\M-s" 'company-filter-candidates) (define-key keymap "\C-\M-s" 'company-filter-candidates)
(dotimes (i 10) (dotimes (i 10)
(define-key keymap (vector (+ (aref (kbd "M-0") 0) i)) (define-key keymap (kbd (format "M-%d" i)) 'company-complete-number))
`(lambda () keymap)
(interactive)
(company-complete-number ,(if (zerop i) 10 i)))))
keymap)
"Keymap that is enabled during an active completion.") "Keymap that is enabled during an active completion.")
(defvar company--disabled-backends nil) (defvar company--disabled-backends nil)
@ -764,7 +761,7 @@ means that `company-mode' is always turned on except in `message-mode' buffers."
;; Hack: ;; Hack:
;; Emacs calculates the active keymaps before reading the event. That means we ;; 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. ;; 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 () (defun company-ignore ()
(interactive) (interactive)
(setq this-command last-command)) (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 () (defun company-input-noop ()
(push 31415926 unread-command-events)) (push 31415926 unread-command-events))
(defun company--column (&optional pos) (defun company--posn-col-row (posn)
(save-excursion (let ((col (car (posn-col-row posn)))
(when pos (goto-char pos)) ;; `posn-col-row' doesn't work well with lines of different height.
(save-restriction ;; `posn-actual-col-row' doesn't handle multiple-width characters.
(+ (save-excursion (row (cdr (posn-actual-col-row posn))))
(vertical-motion 0) (when (and header-line-format (version< emacs-version "24.3.93.3"))
(narrow-to-region (point) (point-max)) ;; http://debbugs.gnu.org/18384
(let ((prefix (get-text-property (point) 'line-prefix))) (cl-decf row))
(if prefix (length prefix) 0))) (cons (+ col (window-hscroll)) row)))
(current-column)))))
(defun company--col-row (&optional pos)
(company--posn-col-row (posn-at-point pos)))
(defun company--row (&optional pos) (defun company--row (&optional pos)
(save-excursion (cdr (company--col-row pos)))
(when pos (goto-char pos))
(count-screen-lines (window-start)
(progn (vertical-motion 0) (point)))))
;;; backends ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; backends ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@ -973,8 +969,6 @@ Controlled by `company-auto-complete'.")
(defvar company-timer nil) (defvar company-timer nil)
(defvar-local company-added-newline nil)
(defsubst company-strip-prefix (str) (defsubst company-strip-prefix (str)
(substring str (length company-prefix))) (substring str (length company-prefix)))
@ -984,7 +978,7 @@ Controlled by `company-auto-complete'.")
(if (eq (company-call-backend 'ignore-case) 'keep-prefix) (if (eq (company-call-backend 'ignore-case) 'keep-prefix)
(insert (company-strip-prefix candidate)) (insert (company-strip-prefix candidate))
(delete-region (- (point) (length company-prefix)) (point)) (delete-region (- (point) (length company-prefix)) (point))
(insert candidate))) (insert-before-markers candidate)))
(defmacro company-with-candidate-inserted (candidate &rest body) (defmacro company-with-candidate-inserted (candidate &rest body)
"Evaluate BODY with CANDIDATE temporarily inserted. "Evaluate BODY with CANDIDATE temporarily inserted.
@ -997,7 +991,8 @@ can retrieve meta-data for them."
(company--insert-candidate ,candidate) (company--insert-candidate ,candidate)
(unwind-protect (unwind-protect
(progn ,@body) (progn ,@body)
(delete-region company-point (point))))) (delete-region company-point (point))
(set-buffer-modified-p modified-p))))
(defun company-explicit-action-p () (defun company-explicit-action-p ()
"Return whether explicit completion action was taken by the user." "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 tick (buffer-chars-modified-tick))
(eq pos (point)) (eq pos (point))
(when (company-auto-begin) (when (company-auto-begin)
(when (version< emacs-version "24.3.50") (company-input-noop)
(company-input-noop))
(company-post-command)))) (company-post-command))))
(defun company-auto-begin () (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)) (or (and company-candidates (company--continue))
(and (company--should-complete) (company--begin-new))) (and (company--should-complete) (company--begin-new)))
(when company-candidates (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) (setq company-point (point)
company--point-max (point-max)) company--point-max (point-max))
(company-ensure-emulation-alist) (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))) (company-call-frontends 'update)))
(defun company-cancel (&optional result) (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 (unwind-protect
(when company-prefix (when company-prefix
(if (stringp result) (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) (run-hook-with-args 'company-completion-finished-hook result)
(company-call-backend 'post-completion result)) (company-call-backend 'post-completion result))
(run-hook-with-args 'company-completion-cancelled-hook result))) (run-hook-with-args 'company-completion-cancelled-hook result)))
(setq company-added-newline nil (setq company-backend nil
company-backend nil
company-prefix nil company-prefix nil
company-candidates nil company-candidates nil
company-candidates-length nil company-candidates-length nil
@ -1809,14 +1789,7 @@ and invoke the normal binding."
(>= evt-row (+ row height))))))) (>= evt-row (+ row height)))))))
(defun company--event-col-row (event) (defun company--event-col-row (event)
(let* ((col-row (posn-actual-col-row (event-start event))) (company--posn-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)))
(defun company-select-mouse (event) (defun company-select-mouse (event)
"Select the candidate picked by the mouse." "Select the candidate picked by the mouse."
@ -1883,7 +1856,11 @@ inserted."
(defun company-complete-number (n) (defun company-complete-number (n)
"Insert the Nth candidate. "Insert the Nth candidate.
To show the number next to the candidates in some back-ends, enable 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) (when (company-manual-begin)
(and (or (< n 1) (> n company-candidates-length)) (and (or (< n 1) (> n company-candidates-length))
(error "No candidate number %d" n)) (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) (defun company-fill-propertize (value annotation width selected left right)
(let* ((margin (length left)) (let* ((margin (length left))
(common (+ (or (company-call-backend 'match value) (common (or (company-call-backend 'match value)
(length company-common)) margin)) (length company-common)))
(ann-ralign company-tooltip-align-annotations) (ann-ralign company-tooltip-align-annotations)
(ann-truncate (< width (ann-truncate (< width
(+ (length value) (length annotation) (+ (length value) (length annotation)
@ -2135,6 +2112,7 @@ If SHOW-VERSION is non-nil, show the version in the echo area."
(- width (length annotation))) (- width (length annotation)))
annotation)) annotation))
right))) right)))
(setq common (+ (min common width) margin))
(setq width (+ width margin (length right))) (setq width (+ width margin (length right)))
(add-text-properties 0 width '(face company-tooltip (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))) (length company-prefix)))
(let ((beg (+ margin (match-beginning 0))) (let ((beg (+ margin (match-beginning 0)))
(end (+ margin (match-end 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) line)
(when (< beg common) (when (< beg common)
(add-text-properties 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) (defun company-buffer-lines (beg end)
(goto-char beg) (goto-char beg)
(let (lines) (let (lines lines-moved)
(while (and (= 1 (vertical-motion 1)) (while (and (> (setq lines-moved (vertical-motion 1)) 0)
(<= (point) end)) (<= (point) end))
(let ((bound (min end (1- (point))))) (let ((bound (min end (1- (point)))))
;; A visual line can contain several physical lines (e.g. with outline's ;; 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) (re-search-forward "$" bound 'move)
(point))) (point)))
lines)) 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))) (setq beg (point)))
(unless (eq beg end) (unless (eq beg end)
(push (buffer-substring beg end) lines)) (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)) (company--offset-line (pop lines) offset))
new)) new))
(let ((str (concat (when nl "\n") (let ((str (concat (when nl " ")
"\n"
(mapconcat 'identity (nreverse new) "\n") (mapconcat 'identity (nreverse new) "\n")
"\n"))) "\n")))
(font-lock-append-text-property 0 (length str) 'face 'default str) (font-lock-append-text-property 0 (length str) 'face 'default str)
(when nl (put-text-property 0 1 'cursor t str))
str))) str)))
(defun company--offset-line (line offset) (defun company--offset-line (line offset)
@ -2358,12 +2342,13 @@ If SHOW-VERSION is non-nil, show the version in the echo area."
;; show ;; show
(defsubst company--window-inner-height () (defsubst company--window-height ()
(let ((edges (window-inside-edges))) (if (fboundp 'window-screen-lines)
(- (nth 3 edges) (nth 1 edges)))) (floor (window-screen-lines))
(window-body-height)))
(defsubst company--window-width () (defsubst company--window-width ()
(let ((ww (window-width))) (let ((ww (window-body-width)))
;; Account for the line continuation column. ;; Account for the line continuation column.
(when (zerop (cadr (window-fringes))) (when (zerop (cadr (window-fringes)))
(cl-decf ww)) (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. "Calculate the appropriate tooltip height.
Returns a negative number if the tooltip should be displayed above point." Returns a negative number if the tooltip should be displayed above point."
(let* ((lines (company--row)) (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)) (if (and (< below (min company-tooltip-minimum company-candidates-length))
(> lines below)) (> lines below))
(- (max 3 (min company-tooltip-limit lines))) (- (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 (end (save-excursion
(move-to-window-line (+ row (abs height))) (move-to-window-line (+ row (abs height)))
(point))) (point)))
(ov (make-overlay beg end)) (ov (make-overlay (if nl beg (1- beg)) end nil t))
(args (list (mapcar 'company-plainify (args (list (mapcar 'company-plainify
(company-buffer-lines beg end)) (company-buffer-lines beg end))
column nl above))) 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) (overlay-put ov 'company-replacement-args args)
(let ((lines (company--create-lines selection (abs height)))) (let ((lines (company--create-lines selection (abs height))))
(overlay-put ov 'company-after (overlay-put ov 'company-display
(apply 'company--replacement-string lines args)) (apply 'company--replacement-string lines args))
(overlay-put ov 'company-width (string-width (car lines)))) (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))))) (overlay-put ov 'company-height height)))))
(defun company-pseudo-tooltip-show-at-point (pos column-offset) (defun company-pseudo-tooltip-show-at-point (pos column-offset)
(let ((row (company--row pos)) (let* ((col-row (company--col-row pos))
(col (- (company--column pos) column-offset))) (col (- (car col-row) column-offset)))
(when (< col 0) (setq col 0)) (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) (defun company-pseudo-tooltip-edit (selection)
(let* ((height (overlay-get company-pseudo-tooltip-overlay 'company-height)) (let* ((height (overlay-get company-pseudo-tooltip-overlay 'company-height))
(lines (company--create-lines selection (abs height)))) (lines (company--create-lines selection (abs height))))
(overlay-put company-pseudo-tooltip-overlay 'company-width (overlay-put company-pseudo-tooltip-overlay 'company-width
(string-width (car lines))) (string-width (car lines)))
(overlay-put company-pseudo-tooltip-overlay 'company-after (overlay-put company-pseudo-tooltip-overlay 'company-display
(apply 'company--replacement-string (apply 'company--replacement-string
lines lines
(overlay-get company-pseudo-tooltip-overlay (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 () (defun company-pseudo-tooltip-hide-temporarily ()
(when (overlayp company-pseudo-tooltip-overlay) (when (overlayp company-pseudo-tooltip-overlay)
(overlay-put company-pseudo-tooltip-overlay 'invisible nil) (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))) (overlay-put company-pseudo-tooltip-overlay 'after-string nil)))
(defun company-pseudo-tooltip-unhide () (defun company-pseudo-tooltip-unhide ()
(when company-pseudo-tooltip-overlay (when company-pseudo-tooltip-overlay
(overlay-put company-pseudo-tooltip-overlay 'invisible t) (let* ((ov company-pseudo-tooltip-overlay)
;; Beat outline's folding overlays, at least. (disp (overlay-get ov 'company-display)))
(overlay-put company-pseudo-tooltip-overlay 'priority 1) ;; Beat outline's folding overlays, at least.
;; No (extra) prefix for the first line. (overlay-put ov 'priority 1)
(overlay-put company-pseudo-tooltip-overlay 'line-prefix "") ;; `display' could be better (http://debbugs.gnu.org/18285), but it
(overlay-put company-pseudo-tooltip-overlay 'after-string ;; doesn't work when the overlay is empty, which is what happens at eob.
(overlay-get company-pseudo-tooltip-overlay 'company-after)) ;; It also seems to interact badly with `cursor'.
(overlay-put company-pseudo-tooltip-overlay 'window (selected-window)))) ;; 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 () (defun company-pseudo-tooltip-guard ()
(list (cons
(save-excursion (beginning-of-visual-line)) (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) (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) (defun company-pseudo-tooltip-frontend (command)
"`company-mode' front-end similar to a tooltip but based on overlays." "`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) (defun company-preview-show-at-point (pos)
(company-preview-hide) (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))) (let ((completion (nth company-selection company-candidates)))
(setq completion (propertize completion 'face 'company-preview)) (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 "")) (not (equal completion ""))
(add-text-properties 0 1 '(cursor t) completion)) (add-text-properties 0 1 '(cursor t) completion))
(overlay-put company-preview-overlay 'display (let ((ov company-preview-overlay))
(concat completion (unless (eq pos (point-max)) (overlay-put ov 'after-string completion)
(buffer-substring pos (1+ pos))))) (overlay-put ov 'window (selected-window)))))
(overlay-put company-preview-overlay 'window (selected-window))))
(defun company-preview-hide () (defun company-preview-hide ()
(when company-preview-overlay (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 () (defun company--show-inline-p ()
(and (not (cdr company-candidates)) (and (not (cdr company-candidates))
company-common company-common
(string-prefix-p company-prefix company-common (or (eq (company-call-backend 'ignore-case) 'keep-prefix)
(company-call-backend 'ignore-case)))) (string-prefix-p company-prefix company-common))))
;;; echo ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; echo ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@ -2579,7 +2569,7 @@ Returns a negative number if the tooltip should be displayed above point."
(defun company-echo-format () (defun company-echo-format ()
(let ((limit (window-width (minibuffer-window))) (let ((limit (window-body-width (minibuffer-window)))
(len -1) (len -1)
;; Roll to selection. ;; Roll to selection.
(candidates (nthcdr company-selection company-candidates)) (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 () (defun company-echo-strip-common-format ()
(let ((limit (window-width (minibuffer-window))) (let ((limit (window-body-width (minibuffer-window)))
(len (+ (length company-prefix) 2)) (len (+ (length company-prefix) 2))
;; Roll to selection. ;; Roll to selection.
(candidates (nthcdr company-selection company-candidates)) (candidates (nthcdr company-selection company-candidates))