- ;;; company-css.el --- company-mode completion back-end for css-mode
+ ;;; company-css.el --- company-mode completion back-end for css-mode -*- lexical-binding: t -*-
- ;; Copyright (C) 2009, 2011 Free Software Foundation, Inc.
+ ;; Copyright (C) 2009, 2011, 2014 Free Software Foundation, Inc.
;; Author: Nikolaj Schumacher
"center-right" "right" "far-right" "right-side" "behind" "leftwards"
"rightwards")
("background" background-color background-image background-repeat
- background-attachment background-position)
+ background-attachment background-position
+ background-clip background-origin background-size)
("background-attachment" "scroll" "fixed")
("background-color" color "transparent")
("background-image" uri "none")
("elevation" angle "below" "level" "above" "higher" "lower")
("empty-cells" "show" "hide")
("float" "left" "right" "none")
- ("font" font-style font-variant font-weight font-size "/" line-height
+ ("font" font-style font-weight font-size "/" line-height
font-family "caption" "icon" "menu" "message-box" "small-caption"
- "status-bar")
+ "status-bar" "normal" "small-caps"
+ ;; CSS3
+ font-stretch)
("font-family" family-name generic-family)
("font-size" absolute-size relative-size length percentage)
("font-style" "normal" "italic" "oblique")
- ("font-variant" "normal" "small-caps")
("font-weight" "normal" "bold" "bolder" "lighter" "100" "200" "300" "400"
"500" "600" "700" "800" "900")
("height" length percentage "auto")
("outline-color" color "invert")
("outline-style" border-style)
("outline-width" border-width)
- ("overflow" "visible" "hidden" "scroll" "auto")
+ ("overflow" "visible" "hidden" "scroll" "auto"
+ ;; CSS3:
+ "no-display" "no-content")
("padding" padding-width)
("padding-bottom" padding-width)
("padding-left" padding-width)
("stress" number)
("table-layout" "auto" "fixed")
("text-align" "left" "right" "center" "justify")
- ("text-decoration" "none" "underline" "overline" "line-through" "blink")
("text-indent" length percentage)
("text-transform" "capitalize" "uppercase" "lowercase" "none")
("top" length percentage "auto")
("widows" integer)
("width" length percentage "auto")
("word-spacing" "normal" length)
- ("z-index" "auto" integer))
+ ("z-index" "auto" integer)
+ ;; CSS3
+ ("align-content" align-stretch "space-between" "space-around")
+ ("align-items" align-stretch "baseline")
+ ("align-self" align-items "auto")
+ ("animation" animation-name animation-duration animation-timing-function
+ animation-delay animation-iteration-count animation-direction
+ animation-fill-mode)
+ ("animation-delay" time)
+ ("animation-direction" "normal" "reverse" "alternate" "alternate-reverse")
+ ("animation-duration" time)
+ ("animation-fill-mode" "none" "forwards" "backwards" "both")
+ ("animation-iteration-count" integer "infinite")
+ ("animation-name" "none")
+ ("animation-play-state" "paused" "running")
+ ("animation-timing-function" transition-timing-function
+ "step-start" "step-end" "steps(,)")
+ ("backface-visibility" "visible" "hidden")
+ ("background-clip" background-origin)
+ ("background-origin" "border-box" "padding-box" "content-box")
+ ("background-size" length percentage "auto" "cover" "contain")
+ ("border-image" border-image-outset border-image-repeat border-image-source
+ border-image-slice border-image-width)
+ ("border-image-outset" length)
+ ("border-image-repeat" "stretch" "repeat" "round" "space")
+ ("border-image-source" uri "none")
+ ("border-image-slice" length)
+ ("border-image-width" length percentage)
+ ("border-radius" length)
+ ("border-top-left-radius" length)
+ ("border-top-right-radius" length)
+ ("border-bottom-left-radius" length)
+ ("border-bottom-right-radius" length)
+ ("box-decoration-break" "slice" "clone")
+ ("box-shadow" length color)
+ ("box-sizing" "content-box" "border-box")
+ ("break-after" "auto" "always" "avoid" "left" "right" "page" "column"
+ "avoid-page" "avoid-column")
+ ("break-before" break-after)
+ ("break-inside" "avoid" "auto")
+ ("columns" column-width column-count)
+ ("column-count" integer)
+ ("column-fill" "auto" "balance")
+ ("column-gap" length "normal")
+ ("column-rule" column-rule-width column-rule-style column-rule-color)
+ ("column-rule-color" color)
+ ("column-rule-style" border-style)
+ ("column-rule-width" border-width)
+ ("column-span" "all" "none")
+ ("column-width" length "auto")
+ ("filter" url "blur()" "brightness()" "contrast()" "drop-shadow()"
+ "grayscale()" "hue-rotate()" "invert()" "opacity()" "saturate()" "sepia()")
+ ("flex" flex-grow flex-shrink flex-basis)
+ ("flex-basis" percentage length "auto")
+ ("flex-direction" "row" "row-reverse" "column" "column-reverse")
+ ("flex-flow" flex-direction flex-wrap)
+ ("flex-grow" number)
+ ("flex-shrink" number)
+ ("flex-wrap" "nowrap" "wrap" "wrap-reverse")
+ ("font-feature-setting" normal string number)
+ ("font-kerning" "auto" "normal" "none")
+ ("font-language-override" "normal" string)
+ ("font-size-adjust" "none" number)
+ ("font-stretch" "normal" "ultra-condensed" "extra-condensed" "condensed"
+ "semi-condensed" "semi-expanded" "expanded" "extra-expanded" "ultra-expanded")
+ ("font-synthesis" "none" "weight" "style")
+ ("font-variant" font-variant-alternates font-variant-caps
+ font-variant-east-asian font-variant-ligatures font-variant-numeric
+ font-variant-position)
+ ("font-variant-alternates" "normal" "historical-forms" "stylistic()"
+ "styleset()" "character-variant()" "swash()" "ornaments()" "annotation()")
+ ("font-variant-caps" "normal" "small-caps" "all-small-caps" "petite-caps"
+ "all-petite-caps" "unicase" "titling-caps")
+ ("font-variant-east-asian" "jis78" "jis83" "jis90" "jis04" "simplified"
+ "traditional" "full-width" "proportional-width" "ruby")
+ ("font-variant-ligatures" "normal" "none" "common-ligatures"
+ "no-common-ligatures" "discretionary-ligatures" "no-discretionary-ligatures"
+ "historical-ligatures" "no-historical-ligatures" "contextual" "no-contextual")
+ ("font-variant-numeric" "normal" "ordinal" "slashed-zero"
+ "lining-nums" "oldstyle-nums" "proportional-nums" "tabular-nums"
+ "diagonal-fractions" "stacked-fractions")
+ ("font-variant-position" "normal" "sub" "super")
+ ("hyphens" "none" "manual" "auto")
+ ("justify-content" align-common "space-between" "space-around")
+ ("line-break" "auto" "loose" "normal" "strict")
+ ("marquee-direction" "forward" "reverse")
+ ("marquee-play-count" integer "infinite")
+ ("marquee-speed" "slow" "normal" "fast")
+ ("marquee-style" "scroll" "slide" "alternate")
+ ("opacity" number)
+ ("order" number)
+ ("outline-offset" length)
+ ("overflow-x" overflow)
+ ("overflow-y" overflow)
+ ("overflow-style" "auto" "marquee-line" "marquee-block")
+ ("overflow-wrap" "normal" "break-word")
+ ("perspective" "none" length)
+ ("perspective-origin" percentage length "left" "center" "right" "top" "bottom")
+ ("resize" "none" "both" "horizontal" "vertical")
+ ("tab-size" integer length)
+ ("text-align-last" "auto" "start" "end" "left" "right" "center" "justify")
+ ("text-decoration" text-decoration-color text-decoration-line text-decoration-style)
+ ("text-decoration-color" color)
+ ("text-decoration-line" "none" "underline" "overline" "line-through" "blink")
+ ("text-decoration-style" "solid" "double" "dotted" "dashed" "wavy")
+ ("text-overflow" "clip" "ellipsis")
+ ("text-shadow" color length)
+ ("text-underline-position" "auto" "under" "left" "right")
+ ("transform" "matrix(,,,,,)" "translate(,)" "translateX()" "translateY()"
+ "scale()" "scaleX()" "scaleY()" "rotate()" "skewX()" "skewY()" "none")
+ ("transform-origin" perspective-origin)
+ ("transform-style" "flat" "preserve-3d")
+ ("transition" transition-property transition-duration
+ transition-timing-function transition-delay)
+ ("transition-delay" time)
+ ("transition-duration" time)
+ ("transition-timing-function"
+ "ease" "linear" "ease-in" "ease-out" "ease-in-out" "cubic-bezier(,,,)")
+ ("transition-property" "none" "all" identifier)
+ ("word-wrap" overflow-wrap)
+ ("word-break" "normal" "break-all" "keep-all"))
"A list of CSS properties and their possible values.")
(defconst company-css-value-classes
'((absolute-size "xx-small" "x-small" "small" "medium" "large" "x-large"
"xx-large")
+ (align-common "flex-start" "flex-end" "center")
+ (align-stretch align-common "stretch")
(border-style "none" "hidden" "dotted" "dashed" "solid" "double" "groove"
"ridge" "inset" "outset")
+ (border-width "thick" "medium" "thin")
(color "aqua" "black" "blue" "fuchsia" "gray" "green" "lime" "maroon" "navy"
"olive" "orange" "purple" "red" "silver" "teal" "white" "yellow")
(counter "counter(,)")
"li" "link" "map" "menu" "meta" "noframes" "noscript" "object" "ol"
"optgroup" "option" "p" "param" "pre" "q" "s" "samp" "script" "select"
"small" "span" "strike" "strong" "style" "sub" "sup" "table" "tbody" "td"
- "textarea" "tfoot" "th" "thead" "title" "tr" "tt" "u" "ul" "var")
+ "textarea" "tfoot" "th" "thead" "title" "tr" "tt" "u" "ul" "var"
+ ;; HTML5
+ "section" "article" "aside" "header" "footer" "nav" "figure" "figcaption"
+ "time" "mark" "main")
"A list of HTML tags for use in CSS completion.")
(defconst company-css-pseudo-classes
(dolist (child (or (cdr (assoc value company-css-value-classes))
(company-css-property-values
(symbol-name value))))
- (add-to-list 'results child))
- (add-to-list 'results value)))
+ (push child results))
+ (push value results)))
(setq results (sort results 'string<))
(puthash attribute results company-css-property-cache)
results)))
;; Author: Nikolaj Schumacher
;; Maintainer: Dmitry Gutov <dgutov@yandex.ru>
;; URL: http://company-mode.github.io/
- ;; Version: 0.8.0
+ ;; Version: 0.8.1
;; Keywords: abbrev, convenience, matching
;; Package-Requires: ((emacs "24.1") (cl-lib "0.5"))
(add-to-list 'debug-ignored-errors "^Cannot complete at point$")
(add-to-list 'debug-ignored-errors "^No other back-end$")
+ ;;; Compatibility
+ (eval-and-compile
+ ;; `defvar-local' for Emacs 24.2 and below
+ (unless (fboundp 'defvar-local)
+ (defmacro defvar-local (var val &optional docstring)
+ "Define VAR as a buffer-local variable with default value VAL.
+ Like `defvar' but additionally marks the variable as being automatically
+ buffer-local wherever it is set."
+ (declare (debug defvar) (doc-string 3))
+ `(progn
+ (defvar ,var ,val ,docstring)
+ (make-variable-buffer-local ',var)))))
+
(defgroup company nil
"Extensible inline text completion mechanism"
:group 'abbrev
(function :tag "custom function" nil))))
(defcustom company-tooltip-limit 10
- "The maximum number of candidates in the tooltip"
+ "The maximum number of candidates in the tooltip."
:type 'integer)
(defcustom company-tooltip-minimum 6
(defcustom company-tooltip-minimum-width 0
"The minimum width of the tooltip's inner area.
This doesn't include the margins and the scroll bar."
- :type 'integer)
+ :type 'integer
+ :package-version '(company . "0.8.0"))
(defcustom company-tooltip-margin 1
"Width of margin columns to show around the toolip."
(defcustom company-tooltip-align-annotations nil
"When non-nil, align annotations to the right tooltip border."
- :type 'boolean)
+ :type 'boolean
+ :package-version '(company . "0.7.1"))
+
+ (defcustom company-tooltip-flip-when-above nil
+ "Whether to flip the tooltip when it's above the current line."
+ :type 'boolean
+ :package-version '(company . "0.8.1"))
(defvar company-safe-backends
'((company-abbrev . "Abbrev")
company-oddmuse company-files company-dabbrev)
"The list of active back-ends (completion engines).
+ Only one back-end is used at a time. The choice depends on the order of
+ the items in this list, and on the values they return in response to the
+ `prefix' command (see below). But a back-end can also be a \"grouped\"
+ one (see below).
+
`company-begin-backend' can be used to start a specific back-end,
`company-other-backend' will skip to the next matching back-end in the list.
`prefix': The back-end should return the text to be completed. It must be
text immediately before point. Returning nil passes control to the next
back-end. The function should return `stop' if it should complete but
- cannot \(e.g. if it is in the middle of a string\). Instead of a string,
+ cannot (e.g. if it is in the middle of a string). Instead of a string,
the back-end may return a cons where car is the prefix and cdr is used in
`company-minimum-prefix-length' test. It must be either number or t, and
in the latter case the test automatically succeeds.
:type '(choice
(const :tag "None" nil)
(const :tag "Sort by occurrence" (company-sort-by-occurrence))
+ (const :tag "Sort by back-end importance"
+ (company-sort-by-backend-importance))
(repeat :tag "User defined" (function))))
(defcustom company-completion-started-hook nil
"If enabled, cancel a manually started completion when the prefix gets
shorter than both `company-minimum-prefix-length' and the length of the
prefix it was started from."
- :type 'boolean)
+ :type 'boolean
+ :package-version '(company . "0.8.0"))
(defcustom company-require-match 'company-explicit-action-p
"If enabled, disallow non-matching input.
(defcustom company-begin-commands '(self-insert-command org-self-insert-command)
"A list of commands after which idle completion is allowed.
- If this is t, it can show completions after any command. See
- `company-idle-delay'.
+ If this is t, it can show completions after any command except a few from a
+ pre-defined list. See `company-idle-delay'.
Alternatively, any command with a non-nil `company-begin' property is
treated as if it was on this list."
(define-key keymap [tab] 'company-complete-common)
(define-key keymap (kbd "TAB") 'company-complete-common)
(define-key keymap (kbd "<f1>") 'company-show-doc-buffer)
+ (define-key keymap (kbd "C-h") 'company-show-doc-buffer)
(define-key keymap "\C-w" 'company-show-location)
(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 ,i))))
+ `(lambda ()
+ (interactive)
+ (company-complete-number ,(if (zerop i) 10 i)))))
keymap)
"Keymap that is enabled during an active completion.")
(defvar company-default-lighter " company")
- (defvar company-lighter company-default-lighter)
- (make-variable-buffer-local 'company-lighter)
+ (defvar-local company-lighter company-default-lighter)
;;;###autoload
(define-minor-mode company-mode
;;; keymaps ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- (defvar company-my-keymap nil)
- (make-variable-buffer-local 'company-my-keymap)
+ (defvar-local company-my-keymap nil)
(defvar company-emulation-alist '((t . nil)))
;;; backends ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- (defvar company-backend nil)
- (make-variable-buffer-local 'company-backend)
+ (defvar-local company-backend nil)
(defun company-grab (regexp &optional expression limit)
(when (looking-back regexp limit)
(defun company--multi-backend-adapter-candidates (backends prefix)
(let ((pairs (cl-loop for backend in (cdr backends)
- when (equal (funcall backend 'prefix)
+ when (equal (company--prefix-str
+ (funcall backend 'prefix))
prefix)
collect (cons (funcall backend 'candidates prefix)
(let ((b backend))
(lambda (str)
(propertize str 'company-backend b))
candidates)))))))
- (when (equal (funcall (car backends) 'prefix) prefix)
+ (when (equal (company--prefix-str (funcall (car backends) 'prefix)) prefix)
;; Small perf optimization: don't tag the candidates received
;; from the first backend in the group.
(push (cons (funcall (car backends) 'candidates prefix)
(setcar cell (funcall mapper res))
(funcall finisher)))))))))))))
+ (defun company--prefix-str (prefix)
+ (or (car-safe prefix) prefix))
+
;;; completion mechanism ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- (defvar company-prefix nil)
- (make-variable-buffer-local 'company-prefix)
+ (defvar-local company-prefix nil)
- (defvar company-candidates nil)
- (make-variable-buffer-local 'company-candidates)
+ (defvar-local company-candidates nil)
- (defvar company-candidates-length nil)
- (make-variable-buffer-local 'company-candidates-length)
+ (defvar-local company-candidates-length nil)
- (defvar company-candidates-cache nil)
- (make-variable-buffer-local 'company-candidates-cache)
+ (defvar-local company-candidates-cache nil)
- (defvar company-candidates-predicate nil)
- (make-variable-buffer-local 'company-candidates-predicate)
+ (defvar-local company-candidates-predicate nil)
- (defvar company-common nil)
- (make-variable-buffer-local 'company-common)
+ (defvar-local company-common nil)
- (defvar company-selection 0)
- (make-variable-buffer-local 'company-selection)
+ (defvar-local company-selection 0)
- (defvar company-selection-changed nil)
- (make-variable-buffer-local 'company-selection-changed)
+ (defvar-local company-selection-changed nil)
- (defvar company--manual-action nil
+ (defvar-local company--manual-action nil
"Non-nil, if manual completion took place.")
- (make-variable-buffer-local 'company--manual-action)
- (defvar company--manual-prefix nil)
- (make-variable-buffer-local 'company--manual-prefix)
+ (defvar-local company--manual-prefix nil)
(defvar company--auto-completion nil
"Non-nil when current candidate is being inserted automatically.
Controlled by `company-auto-complete'.")
- (defvar company--point-max nil)
- (make-variable-buffer-local 'company--point-max)
+ (defvar-local company--point-max nil)
- (defvar company-point nil)
- (make-variable-buffer-local 'company-point)
+ (defvar-local company-point nil)
(defvar company-timer nil)
- (defvar company-added-newline nil)
- (make-variable-buffer-local 'company-added-newline)
+ (defvar-local company-added-newline nil)
(defsubst company-strip-prefix (str)
(substring str (length company-prefix)))
candidate))
(defun company--should-complete ()
- (and (not (or buffer-read-only overriding-terminal-local-map
+ (and (eq company-idle-delay t)
+ (not (or buffer-read-only overriding-terminal-local-map
overriding-local-map))
;; Check if in the middle of entering a key combination.
(or (equal (this-command-keys-vector) [])
(not (keymapp (key-binding (this-command-keys-vector)))))
- (eq company-idle-delay t)
- (or (eq t company-begin-commands)
- (memq this-command company-begin-commands)
- (and (symbolp this-command) (get this-command 'company-begin)))
(not (and transient-mark-mode mark-active))))
(defun company--should-continue ()
(not (memq this-command (cdr company-continue-commands)))
(or (memq this-command company-begin-commands)
(memq this-command company-continue-commands)
- (string-match-p "\\`company-" (symbol-name this-command))))))
+ (and (symbolp this-command)
+ (string-match-p "\\`company-" (symbol-name this-command)))))))
(defun company-call-frontends (command)
(dolist (frontend company-frontends)
(mod selection company-candidates-length)
(max 0 (min (1- company-candidates-length) selection))))
(when (or force-update (not (equal selection company-selection)))
+ (company--update-group-lighter (nth selection company-candidates))
(setq company-selection selection
company-selection-changed t)
(company-call-frontends 'update)))
+ (defun company--update-group-lighter (candidate)
+ (when (listp company-backend)
+ (let ((backend (or (get-text-property 0 'company-backend candidate)
+ (car company-backend))))
+ (when (and backend (symbolp backend))
+ (let ((name (replace-regexp-in-string "company-\\|-company" ""
+ (symbol-name backend))))
+ (setq company-lighter (format " company-<%s>" name)))))))
+
(defun company-apply-predicate (candidates predicate)
(let (new)
(dolist (c candidates)
(cdr c)
(lambda (candidates)
(if (not (and candidates (eq res 'done)))
- ;; Fetcher called us right back.
+ ;; Fetcher called us back right away.
(setq res candidates)
(setq company-backend backend
company-candidates-cache
(lambda (candidate)
(when (or
(save-excursion
- (progn (forward-line 0)
+ (progn (forward-char (- (length company-prefix)))
(search-backward candidate (window-start) t)))
(save-excursion
(search-forward candidate (window-end) t)))
(and (not (memq (get-text-property (point) 'face)
'(font-lock-function-name-face
font-lock-keyword-face)))
- (let* ((prefix (company-call-backend 'prefix))
- (prefix (or (car-safe prefix) prefix)))
+ (let ((prefix (company--prefix-str
+ (company-call-backend 'prefix))))
(and (stringp prefix)
(= (length prefix) (- end beg))))))
(push (cons candidate (if (< beg (point))
(mapcar #'car (sort occurs (lambda (e1 e2) (<= (cdr e1) (cdr e2)))))
noccurs)))
+ (defun company-sort-by-backend-importance (candidates)
+ "Sort CANDIDATES as two priority groups.
+ If `company-backend' is a function, do nothing. If it's a list, move
+ candidates from back-ends before keyword `:with' to the front. Candidates
+ from the rest of the back-ends in the group, if any, will be left at the end."
+ (if (functionp company-backend)
+ candidates
+ (let ((low-priority (cdr (memq :with company-backend))))
+ (if (null low-priority)
+ candidates
+ (sort candidates
+ (lambda (c1 c2)
+ (and
+ (let ((b2 (get-text-property 0 'company-backend c2)))
+ (and b2 (memq b2 low-priority)))
+ (let ((b1 (get-text-property 0 'company-backend c1)))
+ (or (not b1) (not (memq b1 low-priority)))))))))))
+
(defun company-idle-begin (buf win tick pos)
(and (eq buf (current-buffer))
(eq win (selected-window))
(defun company-auto-begin ()
(and company-mode
(not company-candidates)
- (let ((company-idle-delay t)
- (company-begin-commands t))
+ (let ((company-idle-delay t))
(condition-case-unless-debug err
- (company-begin)
+ (company--perform)
(error (message "Company: An error occurred in auto-begin")
(message "%s" (error-message-string err))
(company-cancel))
company-point)
company-prefix)))
- (defun company--continue-failed ()
+ (defun company--continue-failed (new-prefix)
(let ((input (buffer-substring-no-properties (point) company-point)))
(cond
((company-auto-complete-p input)
(let ((company--auto-completion t))
(company-complete-selection))
nil))
+ ((and (or (not (company-require-match-p))
+ ;; Don't require match if the new prefix
+ ;; doesn't continue the old one, and the latter was a match.
+ (<= (length new-prefix) (length company-prefix)))
+ (member company-prefix company-candidates))
+ ;; Last input was a success,
+ ;; but we're treating it as an abort + input anyway,
+ ;; like the `unique' case below.
+ (company-cancel 'non-unique))
((company-require-match-p)
- ;; wrong incremental input, but required match
+ ;; Wrong incremental input, but required match.
(delete-char (- (length input)))
(ding)
(message "Matching input is required")
company-candidates)
- ((equal company-prefix (car company-candidates))
- ;; last input was actually success
- (company-cancel company-prefix))
(t (company-cancel)))))
(defun company--good-prefix-p (prefix)
- (and (stringp (or (car-safe prefix) prefix)) ;excludes 'stop
+ (and (stringp (company--prefix-str prefix)) ;excludes 'stop
(or (eq (cdr-safe prefix) t)
(let ((len (or (cdr-safe prefix) (length prefix))))
(if company--manual-prefix
(setq company-candidates-cache nil))
(let* ((new-prefix (company-call-backend 'prefix))
(c (when (and (company--good-prefix-p new-prefix)
- (setq new-prefix (or (car-safe new-prefix) new-prefix))
+ (setq new-prefix (company--prefix-str new-prefix))
(= (- (point) (length new-prefix))
(- company-point (length company-prefix))))
(company-calculate-candidates new-prefix))))
(cond
((eq c t)
;; t means complete/unique.
- (company-cancel new-prefix))
+ ;; Handle it like completion was aborted, to differentiate from user
+ ;; calling one of Company's commands to insert the candidate,
+ ;; not to trigger template expansion, etc.
+ (company-cancel 'unique))
((consp c)
;; incremental match
(setq company-prefix new-prefix)
c)
((not (company--incremental-p))
(company-cancel))
- (t (company--continue-failed)))))
+ (t (company--continue-failed new-prefix)))))
(defun company--begin-new ()
(let (prefix c)
(company--multi-backend-adapter backend 'prefix)))
(when prefix
(when (company--good-prefix-p prefix)
- (setq prefix (or (car-safe prefix) prefix)
+ (setq company-prefix (company--prefix-str prefix)
company-backend backend
- c (company-calculate-candidates prefix))
+ c (company-calculate-candidates company-prefix))
;; t means complete/unique. We don't start, so no hooks.
(if (not (consp c))
(when company--manual-action
(message "No completion found"))
- (setq company-prefix prefix)
(when company--manual-action
(setq company--manual-prefix prefix))
- (when (symbolp backend)
- (setq company-lighter (concat " " (symbol-name backend))))
+ (if (symbolp backend)
+ (setq company-lighter (concat " " (symbol-name backend)))
+ (company--update-group-lighter (car c)))
(company-update-candidates c)
(run-hook-with-args 'company-completion-started-hook
(company-explicit-action-p))
(company-call-frontends 'show)))
(cl-return c)))))
- (defun company-begin ()
+ (defun company--perform ()
(or (and company-candidates (company--continue))
(and (company--should-complete) (company--begin-new)))
(when company-candidates
;; Only set unmodified when tick remained the same since insert,
;; and the buffer wasn't modified before.
(set-buffer-modified-p nil))
- (when company-prefix
- (if (stringp result)
- (progn
- (company-call-backend 'pre-completion result)
- (run-hook-with-args 'company-completion-finished-hook result)
- (company-call-backend 'post-completion result))
- (run-hook-with-args 'company-completion-cancelled-hook result)))
- (setq company-added-newline nil
- company-backend nil
- company-prefix nil
- company-candidates nil
- company-candidates-length nil
- company-candidates-cache nil
- company-candidates-predicate nil
- company-common nil
- company-selection 0
- company-selection-changed nil
- company--manual-action nil
- company--manual-prefix nil
- company-lighter company-default-lighter
- company--point-max nil
- company-point nil)
- (when company-timer
- (cancel-timer company-timer))
- (company-search-mode 0)
- (company-call-frontends 'hide)
- (company-enable-overriding-keymap nil)
+ (unwind-protect
+ (when company-prefix
+ (if (stringp result)
+ (progn
+ (company-call-backend 'pre-completion result)
+ (run-hook-with-args 'company-completion-finished-hook result)
+ (company-call-backend 'post-completion result))
+ (run-hook-with-args 'company-completion-cancelled-hook result)))
+ (setq company-added-newline nil
+ company-backend nil
+ company-prefix nil
+ company-candidates nil
+ company-candidates-length nil
+ company-candidates-cache nil
+ company-candidates-predicate nil
+ company-common nil
+ company-selection 0
+ company-selection-changed nil
+ company--manual-action nil
+ company--manual-prefix nil
+ company-lighter company-default-lighter
+ company--point-max nil
+ company-point nil)
+ (when company-timer
+ (cancel-timer company-timer))
+ (company-search-mode 0)
+ (company-call-frontends 'hide)
+ (company-enable-overriding-keymap nil))
;; Make return value explicit.
nil)
(defun company-abort ()
(interactive)
- (company-cancel t)
- ;; Don't start again, unless started manually.
- (setq company-point (point)))
+ (company-cancel 'abort))
(defun company-finish (result)
(company--insert-candidate result)
- (company-cancel result)
- ;; Don't start again, unless started manually.
- (setq company-point (point)))
+ (company-cancel result))
(defsubst company-keep (command)
(and (symbolp command) (get command 'company-keep)))
(condition-case err
(progn
(unless (equal (point) company-point)
- (company-begin))
+ (let ((company-idle-delay (and (eq company-idle-delay t)
+ (company--should-begin)
+ t)))
+ (company--perform)))
(if company-candidates
(company-call-frontends 'post-command)
(and (numberp company-idle-delay)
- (or (eq t company-begin-commands)
- (memq this-command company-begin-commands))
- (not (equal (point) company-point))
+ (company--should-begin)
(setq company-timer
(run-with-timer company-idle-delay nil
'company-idle-begin
(company-cancel))))
(company-install-map))
+ (defvar company--begin-inhibit-commands '(company-abort
+ company-complete-mouse
+ company-complete
+ company-complete-common
+ company-complete-selection
+ company-complete-number)
+ "List of commands after which idle completion is (still) disabled when
+ `company-begin-commands' is t.")
+
+ (defun company--should-begin ()
+ (if (eq t company-begin-commands)
+ (not (memq this-command company--begin-inhibit-commands))
+ (or
+ (memq this-command company-begin-commands)
+ (and (symbolp this-command) (get this-command 'company-begin)))))
+
;;; search ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- (defvar company-search-string nil)
- (make-variable-buffer-local 'company-search-string)
+ (defvar-local company-search-string nil)
- (defvar company-search-lighter " Search: \"\"")
- (make-variable-buffer-local 'company-search-lighter)
+ (defvar-local company-search-lighter " Search: \"\"")
- (defvar company-search-old-map nil)
- (make-variable-buffer-local 'company-search-old-map)
+ (defvar-local company-search-old-map nil)
- (defvar company-search-old-selection 0)
- (make-variable-buffer-local 'company-search-old-selection)
+ (defvar-local company-search-old-selection 0)
(defun company-search (text lines)
(let ((quoted (regexp-quote text))
(setq company-search-string
(concat (or company-search-string "") (string last-command-event))
company-search-lighter (concat " Search: \"" company-search-string
- "\""))
+ "\""))
(let ((pos (company-search company-search-string
- (nthcdr company-selection company-candidates))))
+ (nthcdr company-selection company-candidates))))
(if (null pos)
(ding)
(company-set-selection (+ company-selection pos) t))))
(interactive)
(company-search-assert-enabled)
(let ((pos (company-search company-search-string
- (cdr (nthcdr company-selection
- company-candidates)))))
+ (cdr (nthcdr company-selection
+ company-candidates)))))
(if (null pos)
(ding)
(company-set-selection (+ company-selection pos 1) t))))
(interactive)
(company-search-assert-enabled)
(let ((pos (company-search company-search-string
- (nthcdr (- company-candidates-length
- company-selection)
- (reverse company-candidates)))))
+ (nthcdr (- company-candidates-length
+ company-selection)
+ (reverse company-candidates)))))
(if (null pos)
(ding)
(company-set-selection (- company-selection pos 1) t))))
(define-key keymap [escape] meta-map))
(define-key keymap (vector meta-prefix-char t) 'company-search-other-char)
(define-key keymap "\e\e\e" 'company-search-other-char)
- (define-key keymap [escape escape escape] 'company-search-other-char)
+ (define-key keymap [escape escape escape] 'company-search-other-char)
+ (define-key keymap (kbd "DEL") 'company-search-other-char)
(define-key keymap "\C-g" 'company-search-abort)
(define-key keymap "\C-s" 'company-search-repeat-forward)
To show the number next to the candidates in some back-ends, enable
`company-show-numbers'."
(when (company-manual-begin)
- (and (< n 1) (> n company-candidates-length)
+ (and (or (< n 1) (> n company-candidates-length))
(error "No candidate number %d" n))
(cl-decf n)
(company-finish (nth n company-candidates))))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- (defvar company-last-metadata nil)
- (make-variable-buffer-local 'company-last-metadata)
+ (defvar-local company-last-metadata nil)
(defun company-fetch-metadata ()
(let ((selected (nth company-selection company-candidates)))
;;; package functions ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- (defvar company-callback nil)
- (make-variable-buffer-local 'company-callback)
+ (defvar-local company-callback nil)
(defun company-remove-callback (&optional ignored)
(remove-hook 'company-completion-finished-hook company-callback t)
(company-begin-backend
(lambda (command &optional arg &rest ignored)
(pcase command
- (`prefix
- (when (equal (point) (marker-position begin-marker))
- (buffer-substring (- (point) (or prefix-length 0)) (point))))
- (`candidates
- (all-completions arg candidates))
- (`require-match
- require-match)))
+ (`prefix
+ (when (equal (point) (marker-position begin-marker))
+ (buffer-substring (- (point) (or prefix-length 0)) (point))))
+ (`candidates
+ (all-completions arg candidates))
+ (`require-match
+ require-match)))
callback)))
(defun company-version (&optional show-version)
;;; pseudo-tooltip ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- (defvar company-pseudo-tooltip-overlay nil)
- (make-variable-buffer-local 'company-pseudo-tooltip-overlay)
+ (defvar-local company-pseudo-tooltip-overlay nil)
- (defvar company-tooltip-offset 0)
- (make-variable-buffer-local 'company-tooltip-offset)
+ (defvar-local company-tooltip-offset 0)
(defun company-tooltip--lines-update-offset (selection num-lines limit)
(cl-decf limit 2)
(defun company--replacement-string (lines old column nl &optional align-top)
(cl-decf column company-tooltip-margin)
+ (when (and align-top company-tooltip-flip-when-above)
+ (setq lines (reverse lines)))
+
(let ((width (length (car lines)))
(remaining-cols (- (+ (company--window-width) (window-hscroll))
column)))
(propertize (concat (company-space-string company-tooltip-margin)
(company-safe-substring text 0 width)
(company-space-string company-tooltip-margin))
- 'face 'company-tooltip))
+ 'face 'company-tooltip))
;; show
(- (nth 3 edges) (nth 1 edges))))
(defsubst company--window-width ()
- (- (window-width)
- (cond
- ((display-graphic-p) 0)
- ;; Account for the line continuation column.
- ((version< "24.3.1" emacs-version) 1)
+ (let ((ww (window-width)))
+ ;; Account for the line continuation column.
+ (when (zerop (cadr (window-fringes)))
+ (cl-decf ww))
+ (unless (or (display-graphic-p)
+ (version< "24.3.1" emacs-version))
;; Emacs 24.3 and earlier included margins
;; in window-width when in TTY.
- (t (1+ (let ((margins (window-margins)))
- (+ (or (car margins) 0)
- (or (cdr margins) 0))))))))
+ (cl-decf ww
+ (let ((margins (window-margins)))
+ (+ (or (car margins) 0)
+ (or (cdr margins) 0)))))
+ ww))
(defun company--pseudo-tooltip-height ()
"Calculate the appropriate tooltip height.
(company-pseudo-tooltip-show (1+ row) col company-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))))
+ (overlay-put company-pseudo-tooltip-overlay 'company-width
+ (string-width (car lines)))
(overlay-put company-pseudo-tooltip-overlay 'company-after
(apply 'company--replacement-string
- (company--create-lines selection (abs height))
+ lines
(overlay-get company-pseudo-tooltip-overlay
'company-replacement-args)))))
;;; overlay ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- (defvar company-preview-overlay nil)
- (make-variable-buffer-local 'company-preview-overlay)
+ (defvar-local company-preview-overlay nil)
(defun company-preview-show-at-point (pos)
(company-preview-hide)
;;; echo ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- (defvar company-echo-last-msg nil)
- (make-variable-buffer-local 'company-echo-last-msg)
+ (defvar-local company-echo-last-msg nil)
(defvar company-echo-timer nil)