X-Git-Url: https://code.delx.au/gnu-emacs-elpa/blobdiff_plain/58c9f4a28529abaab931752ac3e7df2e9a715dc9..34e3d94eb31cd286c429f12c2a318f7a79dcec4b:/packages/company/company.el diff --git a/packages/company/company.el b/packages/company/company.el index 7f30932aa..ec0f2b342 100644 --- a/packages/company/company.el +++ b/packages/company/company.el @@ -4,9 +4,9 @@ ;; Author: Nikolaj Schumacher ;; Maintainer: Dmitry Gutov -;; Version: 0.6.8 +;; Version: 0.6.12 ;; Keywords: abbrev, convenience, matching -;; URL: http://company-mode.github.com/ +;; URL: http://company-mode.github.io/ ;; Compatibility: GNU Emacs 22.x, GNU Emacs 23.x, GNU Emacs 24.x ;; This file is part of GNU Emacs. @@ -71,6 +71,7 @@ (eval-when-compile (require 'cl)) +;; FIXME: Use `user-error'. (add-to-list 'debug-ignored-errors "^.* frontend cannot be used twice$") (add-to-list 'debug-ignored-errors "^Echo area cannot be used twice$") (add-to-list 'debug-ignored-errors "^No \\(document\\|loc\\)ation available$") @@ -171,16 +172,16 @@ Each front-end is a function that takes one argument. It is called with one of the following arguments: -'show: When the visualization should start. +`show': When the visualization should start. -'hide: When the visualization should end. +`hide': When the visualization should end. -'update: When the data has been updated. +`update': When the data has been updated. -'pre-command: Before every command that is executed while the +`pre-command': Before every command that is executed while the visualization is active. -'post-command: After every command that is executed while the +`post-command': After every command that is executed while the visualization is active. The visualized data is stored in `company-prefix', `company-candidates', @@ -212,7 +213,9 @@ If this many lines are not available, prefer to display the tooltip above." (defvar company-safe-backends '((company-abbrev . "Abbrev") + (company-capf . "completion-at-point-functions") (company-clang . "Clang") + (company-cmake . "CMake") (company-css . "CSS") (company-dabbrev . "dabbrev for plain text") (company-dabbrev-code . "dabbrev for code") @@ -240,31 +243,9 @@ If this many lines are not available, prefer to display the tooltip above." (assq backend company-safe-backends)) (return t)))))) -(defun company-capf (command &optional arg &rest args) - "`company-mode' back-end using `completion-at-point-functions'. -Requires Emacs 24.1 or newer." - (interactive (list 'interactive)) - (case command - (interactive (company-begin-backend 'company-capf)) - (prefix - (let ((res (run-hook-wrapped 'completion-at-point-functions - ;; Ignore misbehaving functions. - #'completion--capf-wrapper 'optimist))) - (when (consp res) - (if (> (nth 2 res) (point)) - 'stop - (buffer-substring-no-properties (nth 1 res) (point)))))) - (candidates - (let ((res (run-hook-wrapped 'completion-at-point-functions - ;; Ignore misbehaving functions. - #'completion--capf-wrapper 'optimist))) - (when (consp res) - (all-completions arg (nth 3 res) - (plist-get (nthcdr 4 res) :predicate))))))) - (defcustom company-backends '(company-elisp company-nxml company-css - company-semantic company-clang company-eclim - company-xcode company-ropemacs + company-eclim company-semantic company-clang + company-xcode company-ropemacs company-cmake (company-gtags company-etags company-dabbrev-code company-keywords) company-oddmuse company-files company-dabbrev) @@ -281,20 +262,20 @@ The first argument is the command requested from the back-end. It is one of the following: `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\). If the returned value is only -part of the prefix (e.g. the part after \"->\" in C), the back-end may return a -cons of prefix and prefix length, which is then used in the -`company-minimum-prefix-length' test. +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, +the back-end may return a cons where car is the prefix and cdr is used in +`company-minimum-prefix-length' test. It's either number or t, in which +case the test automatically succeeds. `candidates': The second argument is the prefix to be completed. The return value should be a list of candidates that start with the prefix. Optional commands: -`sorted': The back-end may return t here to indicate that the candidates -are sorted and will not need to be sorted again. +`sorted': Return t here to indicate that the candidates are sorted and will +not need to be sorted again. `duplicates': If non-nil, company will take care of removing duplicates from the list. @@ -303,29 +284,29 @@ from the list. progresses, unless the back-end returns t for this command. The second argument is the latest prefix. -`meta': The second argument is a completion candidate. The back-end should -return a (short) documentation string for it. +`meta': The second argument is a completion candidate. Return a (short) +documentation string for it. -`doc-buffer': The second argument is a completion candidate. -The back-end should create a buffer (preferably with `company-doc-buffer'), -fill it with documentation and return it. +`doc-buffer': The second argument is a completion candidate. Return a +buffer with documentation for it. Preferably use `company-doc-buffer', -`location': The second argument is a completion candidate. The back-end can -return the cons of buffer and buffer location, or of file and line -number where the completion candidate was defined. +`location': The second argument is a completion candidate. Return the cons +of buffer and buffer location, or of file and line number where the +completion candidate was defined. -`require-match': If this value is t, the user is not allowed to enter anything -not offered as a candidate. Use with care! The default value nil gives the -user that choice with `company-require-match'. Return value 'never overrides -that option the other way around. +`require-match': If this returns t, the user is not allowed to enter +anything not offered as a candidate. Use with care! The default value nil +gives the user that choice with `company-require-match'. Return value +`never' overrides that option the other way around. -`init': Called once for each buffer, the back-end can check for external -programs and files and load any required libraries. Raising an error here will -show up in message log once, and the backend will not be used for completion. +`init': Called once for each buffer. The back-end can check for external +programs and files and load any required libraries. Raising an error here +will show up in message log once, and the back-end will not be used for +completion. -`post-completion': Called after a completion candidate has been inserted into -the buffer. The second argument is the candidate. Can be used to modify it, -e.g. to expand a snippet. +`post-completion': Called after a completion candidate has been inserted +into the buffer. The second argument is the candidate. Can be used to +modify it, e.g. to expand a snippet. The back-end should return nil for all commands it does not support or does not know about. It should also be callable interactively and use @@ -361,8 +342,8 @@ aborted manually." "Hook run when company successfully completes. The hook is called with the selected candidate as an argument. -If you indend to use it to post-process candidates from a specific back-end, -consider using the `post-completion' command instead." +If you indend to use it to post-process candidates from a specific +back-end, consider using the `post-completion' command instead." :type 'hook) (defcustom company-minimum-prefix-length 3 @@ -373,8 +354,8 @@ consider using the `post-completion' command instead." "If enabled, disallow non-matching input. This can be a function do determine if a match is required. -This can be overridden by the back-end, if it returns t or 'never to -'require-match. `company-auto-complete' also takes precedence over this." +This can be overridden by the back-end, if it returns t or `never' to +`require-match'. `company-auto-complete' also takes precedence over this." :type '(choice (const :tag "Off" nil) (function :tag "Predicate function") (const :tag "On, if user interaction took place" @@ -383,8 +364,8 @@ This can be overridden by the back-end, if it returns t or 'never to (defcustom company-auto-complete nil "Determines when to auto-complete. -If this is enabled, all characters from `company-auto-complete-chars' complete -the selected completion. This can also be a function." +If this is enabled, all characters from `company-auto-complete-chars' +complete the selected completion. This can also be a function." :type '(choice (const :tag "Off" nil) (function :tag "Predicate function") (const :tag "On, if user interaction took place" @@ -393,8 +374,8 @@ the selected completion. This can also be a function." (defcustom company-auto-complete-chars '(?\ ?\) ?.) "Determines which characters trigger an automatic completion. -See `company-auto-complete'. If this is a string, each string character causes -completion. If it is a list of syntax description characters (see +See `company-auto-complete'. If this is a string, each string character +causes completion. If it is a list of syntax description characters (see `modify-syntax-entry'), all characters with that syntax auto-complete. This can also be a function, which is called with the new input and should @@ -427,12 +408,12 @@ immediately when a prefix of `company-minimum-prefix-length' is reached." (const :tag "immediate (t)" t) (number :tag "seconds"))) -(defcustom company-begin-commands t +(defcustom company-begin-commands '(self-insert-command) "A list of commands following which company will start completing. If this is t, it will complete after any command. See `company-idle-delay'. -Alternatively any command with a non-nil 'company-begin property is treated as -if it was on this list." +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))) @@ -522,9 +503,9 @@ Completions can be searched with `company-search-candidates' or `company-filter-candidates'. These can be used while completion is inactive, as well. -The completion data is retrieved using `company-backends' and displayed using -`company-frontends'. If you want to start a specific back-end, call it -interactively or use `company-begin-backend'. +The completion data is retrieved using `company-backends' and displayed +using `company-frontends'. If you want to start a specific back-end, call +it interactively or use `company-begin-backend'. regular keymap (`company-mode-map'): @@ -543,11 +524,33 @@ keymap during active completions (`company-active-map'): (company-cancel) (kill-local-variable 'company-point))) +(defcustom company-global-modes t + "Modes for which `company-mode' mode is turned on by `global-company-mode'. +If nil, means no modes. If t, then all major modes have it turned on. +If a list, it should be a list of `major-mode' symbol names for which +`company-mode' should be automatically turned on. The sense of the list is +negated if it begins with `not'. For example: + (c-mode c++-mode) +means that `company-mode' is turned on for buffers in C and C++ modes only. + (not message-mode) +means that `company-mode' is always turned on except in `message-mode' buffers." + :type '(choice (const :tag "none" nil) + (const :tag "all" t) + (set :menu-tag "mode specific" :tag "modes" + :value (not) + (const :tag "Except" not) + (repeat :inline t (symbol :tag "mode"))))) + ;;;###autoload (define-globalized-minor-mode global-company-mode company-mode company-mode-on) (defun company-mode-on () - (unless (or noninteractive (eq (aref (buffer-name) 0) ?\s)) + (when (and (not (or noninteractive (eq (aref (buffer-name) 0) ?\s))) + (cond ((eq company-global-modes t) + t) + ((eq (car-safe company-global-modes) 'not) + (not (memq major-mode (cdr company-global-modes)))) + (t (memq major-mode company-global-modes)))) (company-mode 1))) (defsubst company-assert-enabled () @@ -592,20 +595,28 @@ keymap during active completions (`company-active-map'): (defun company-input-noop () (push 31415926 unread-command-events)) -;; Hack: -;; posn-col-row is incorrect in older Emacsen when line-spacing is set -(defun company--col-row (&optional pos) - (let ((posn (posn-at-point pos))) - (cons (car (posn-col-row posn)) (cdr (posn-actual-col-row posn))))) - -(defsubst company--column (&optional pos) - (car (posn-col-row (posn-at-point pos)))) - -(defsubst company--row (&optional pos) - (cdr (posn-actual-col-row (posn-at-point pos)))) +(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--row (&optional pos) + (save-excursion + (when pos (goto-char pos)) + (count-screen-lines (window-start) + (progn (vertical-motion 0) (point))))) ;;; backends ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(defvar company-backend nil) +(make-variable-buffer-local 'company-backend) + (defun company-grab (regexp &optional expression limit) (when (looking-back regexp limit) (or (match-string-no-properties (or expression 0)) ""))) @@ -671,9 +682,6 @@ keymap during active completions (`company-active-map'): ;;; completion mechanism ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -(defvar company-backend nil) -(make-variable-buffer-local 'company-backend) - (defvar company-prefix nil) (make-variable-buffer-local 'company-prefix) @@ -738,7 +746,7 @@ can retrieve meta-data for them." (or company--explicit-action company-selection-changed)) -(defsubst company-reformat (candidate) +(defun company-reformat (candidate) ;; company-ispell needs this, because the results are always lower-case ;; It's mory efficient to fix it only when they are displayed. (concat company-prefix (substring candidate (length company-prefix)))) @@ -756,14 +764,14 @@ can retrieve meta-data for them." (and (symbolp this-command) (get this-command 'company-begin))) (not (and transient-mark-mode mark-active)))) -(defsubst company-call-frontends (command) +(defun company-call-frontends (command) (dolist (frontend company-frontends) (condition-case err (funcall frontend command) (error (error "Company: Front-end %s error \"%s\" on command %s" frontend (error-message-string err) command))))) -(defsubst company-set-selection (selection &optional force-update) +(defun company-set-selection (selection &optional force-update) (setq selection (max 0 (min (1- company-candidates-length) selection))) (when (or force-update (not (equal selection company-selection))) (setq company-selection selection @@ -896,10 +904,10 @@ can retrieve meta-data for them." (defun company-require-match-p () (let ((backend-value (company-call-backend 'require-match))) (or (eq backend-value t) - (and (if (functionp company-require-match) + (and (not (eq backend-value 'never)) + (if (functionp company-require-match) (funcall company-require-match) - (eq company-require-match t)) - (not (eq backend-value 'never)))))) + (eq company-require-match t)))))) (defun company-auto-complete-p (input) "Return non-nil, if input starts with punctuation or parentheses." @@ -939,7 +947,7 @@ can retrieve meta-data for them." ((and (company--string-incremental-p company-prefix new-prefix) (company-require-match-p)) ;; wrong incremental input, but required match - (backward-delete-char (length input)) + (delete-char (- (length input))) (ding) (message "Matching input is required") company-candidates) @@ -951,8 +959,9 @@ can retrieve meta-data for them." (defun company--good-prefix-p (prefix) (and (or (company-explicit-action-p) (unless (eq prefix 'stop) - (>= (or (cdr-safe prefix) (length prefix)) - company-minimum-prefix-length))) + (or (eq (cdr-safe prefix) t) + (>= (or (cdr-safe prefix) (length prefix)) + company-minimum-prefix-length)))) (stringp (or (car-safe prefix) prefix)))) (defun company--continue () @@ -1258,7 +1267,7 @@ Don't start this directly, use `company-search-candidates' or (kill-local-variable 'company-search-old-selection) (company-enable-overriding-keymap company-active-map))) -(defsubst company-search-assert-enabled () +(defun company-search-assert-enabled () (company-assert-enabled) (unless company-search-mode (company-uninstall-map) @@ -1274,8 +1283,8 @@ Don't start this directly, use `company-search-candidates' or Regular characters are appended to the search string. -The command `company-search-kill-others' (\\[company-search-kill-others]) uses - the search string to limit the completion candidates." +The command `company-search-kill-others' (\\[company-search-kill-others]) +uses the search string to limit the completion candidates." (interactive) (company-search-mode 1) (company-enable-overriding-keymap company-search-map)) @@ -1328,14 +1337,58 @@ and invoke the normal binding." (company-abort) (company--unread-last-input))) +(defvar company-pseudo-tooltip-overlay) + +(defvar company-tooltip-offset) + +(defun company--inside-tooltip-p (event-col-row row height) + (let* ((ovl company-pseudo-tooltip-overlay) + (column (overlay-get ovl 'company-column)) + (width (overlay-get ovl 'company-width)) + (evt-col (car event-col-row)) + (evt-row (cdr event-col-row))) + (and (>= evt-col column) + (< evt-col (+ column width)) + (if (> height 0) + (and (> evt-row row) + (<= evt-row (+ row height) )) + (and (< evt-row row) + (>= 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))) + (incf col (window-hscroll)) + (and header-line-format + (version< "24" emacs-version) + (decf row)) + (cons col row))) + (defun company-select-mouse (event) "Select the candidate picked by the mouse." (interactive "e") - (when (nth 4 (event-start event)) - (company-set-selection (- (cdr (posn-actual-col-row (event-start event))) - (company--row) - 1)) - t)) + (let ((event-col-row (company--event-col-row event)) + (ovl-row (company--row)) + (ovl-height (and company-pseudo-tooltip-overlay + (min (overlay-get company-pseudo-tooltip-overlay + 'company-height) + company-candidates-length)))) + (if (and ovl-height + (company--inside-tooltip-p event-col-row ovl-row ovl-height)) + (progn + (company-set-selection (+ (cdr event-col-row) + (if (zerop company-tooltip-offset) + -1 + (- company-tooltip-offset 2)) + (- ovl-row) + (if (< ovl-height 0) + (- 1 ovl-height) + 0))) + t) + (company-abort) + (company--unread-last-input) + nil))) (defun company-complete-mouse (event) "Complete the candidate picked by the mouse." @@ -1363,8 +1416,9 @@ and invoke the normal binding." (defun company-complete () "Complete the common part of all candidates or the current selection. -The first time this is called, the common part is completed, the second time, or -when the selection has been changed, the selected candidate is completed." +The first time this is called, the common part is completed, the second +time, or when the selection has been changed, the selected candidate is +completed." (interactive) (when (company-manual-begin) (if (or company-selection-changed @@ -1393,12 +1447,12 @@ To show the number next to the candidates in some back-ends, enable (push (make-string (- company-space-strings-limit 1 i) ?\ ) lst)) (apply 'vector lst))) -(defsubst company-space-string (len) +(defun company-space-string (len) (if (< len company-space-strings-limit) (aref company-space-strings len) (make-string len ?\ ))) -(defsubst company-safe-substring (str from &optional to) +(defun company-safe-substring (str from &optional to) (if (> from (string-width str)) "" (with-temp-buffer @@ -1427,8 +1481,11 @@ To show the number next to the candidates in some back-ends, enable (cdr company-last-metadata))) (defun company-doc-buffer (&optional string) - (with-current-buffer (get-buffer-create "*Company meta-data*") + (with-current-buffer (get-buffer-create "*company-documentation*") (erase-buffer) + (when string + (save-excursion + (insert string))) (current-buffer))) (defvar company--electric-commands @@ -1457,7 +1514,7 @@ To show the number next to the candidates in some back-ends, enable (setq unread-command-events (list last-input-event)))) (defun company-show-doc-buffer () - "Temporarily show a buffer with the complete documentation for the selection." + "Temporarily show the documentation buffer for the selection." (interactive) (company--electric-do (let* ((selected (nth company-selection company-candidates)) @@ -1523,14 +1580,16 @@ To show the number next to the candidates in some back-ends, enable (defun company-begin-with (candidates &optional prefix-length require-match callback) "Start a completion at point. -CANDIDATES is the list of candidates to use and PREFIX-LENGTH is the length of -the prefix that already is in the buffer before point. It defaults to 0. +CANDIDATES is the list of candidates to use and PREFIX-LENGTH is the length +of the prefix that already is in the buffer before point. +It defaults to 0. -CALLBACK is a function called with the selected result if the user successfully -completes the input. +CALLBACK is a function called with the selected result if the user +successfully completes the input. -Example: -\(company-begin-with '\(\"foo\" \"foobar\" \"foobarbaz\"\)\)" +Example: \(company-begin-with '\(\"foo\" \"foobar\" \"foobarbaz\"\)\)" + ;; FIXME: When Emacs 23 is no longer a concern, replace + ;; `company-begin-with-marker' with a lexical variable; use a lexical closure. (setq company-begin-with-marker (copy-marker (point) t)) (company-begin-backend `(lambda (command &optional arg &rest ignored) @@ -1578,7 +1637,11 @@ Example: (defsubst company-round-tab (arg) (* (/ (+ arg tab-width) tab-width) tab-width)) -(defun company-untabify (str) +(defun company-plainify (str) + (let ((prefix (get-text-property 0 'line-prefix str))) + (when prefix ; Keep the original value unmodified, for no special reason. + (setq str (concat prefix str)) + (remove-text-properties 0 (length str) '(line-prefix) str))) (let* ((pieces (split-string str "\t")) (copy pieces)) (while (cdr copy) @@ -1624,13 +1687,21 @@ Example: (let (lines) (while (and (= 1 (vertical-motion 1)) (<= (point) end)) - (push (buffer-substring beg (min end (1- (point)))) lines) + (let ((bound (min end (1- (point))))) + ;; A visual line can contain several physical lines (e.g. with outline's + ;; folding overlay). Take only the first one. + (push (buffer-substring beg + (save-excursion + (goto-char beg) + (re-search-forward "$" bound 'move) + (point))) + lines)) (setq beg (point))) (unless (eq beg end) (push (buffer-substring beg end) lines)) (nreverse lines))) -(defsubst company-modify-line (old new offset) +(defun company-modify-line (old new offset) (concat (company-safe-substring old 0 offset) new (company-safe-substring old (+ offset (length new))))) @@ -1642,14 +1713,16 @@ Example: (defun company--replacement-string (lines old column nl &optional align-top) - (let ((width (length (car lines)))) - (when (> width (- (window-width) column)) - (setq column (max 0 (- (window-width) width))))) + (let ((width (length (car lines))) + (remaining-cols (- (+ (window-width) (window-hscroll)) + column))) + (when (> width remaining-cols) + (decf column (- width remaining-cols)))) (let (new) (when align-top ;; untouched lines first - (dotimes (i (- (length old) (length lines))) + (dotimes (_ (- (length old) (length lines))) (push (pop old) new))) ;; length into old lines. (while old @@ -1691,7 +1764,7 @@ Example: len (min limit len) lines-copy lines) - (dotimes (i len) + (dotimes (_ len) (setq width (max (length (pop lines-copy)) width))) (setq width (min width (window-width))) @@ -1728,10 +1801,10 @@ Example: ;; show (defsubst company--window-inner-height () - (let ((edges (window-inside-edges (selected-window)))) + (let ((edges (window-inside-edges))) (- (nth 3 edges) (nth 1 edges)))) -(defsubst company--pseudo-tooltip-height () +(defun company--pseudo-tooltip-height () "Calculate the appropriate tooltip height. Returns a negative number if the tooltip should be displayed above point." (let* ((lines (company--row)) @@ -1745,8 +1818,6 @@ Returns a negative number if the tooltip should be displayed above point." (company-pseudo-tooltip-hide) (save-excursion - (move-to-column 0) - (let* ((height (company--pseudo-tooltip-height)) above) @@ -1760,30 +1831,29 @@ Returns a negative number if the tooltip should be displayed above point." (move-to-window-line (+ row (abs height))) (point))) (ov (make-overlay beg end)) - (args (list (mapcar 'company-untabify + (args (list (mapcar 'company-plainify (company-buffer-lines beg end)) column nl above))) (setq company-pseudo-tooltip-overlay ov) (overlay-put ov 'company-replacement-args args) - (overlay-put ov 'company-before - (apply 'company--replacement-string - (company--create-lines selection (abs height)) - args)) + + (let ((lines (company--create-lines selection (abs height)))) + (overlay-put ov 'company-after + (apply 'company--replacement-string lines args)) + (overlay-put ov 'company-width (string-width (car lines)))) (overlay-put ov 'company-column column) (overlay-put ov 'company-height height))))) (defun company-pseudo-tooltip-show-at-point (pos) - (let ((col-row (company--col-row pos))) - (when col-row - (company-pseudo-tooltip-show (1+ (cdr col-row)) (car col-row) - company-selection)))) - -(defun company-pseudo-tooltip-edit (lines selection) - (let ((column (overlay-get company-pseudo-tooltip-overlay 'company-column)) - (height (overlay-get company-pseudo-tooltip-overlay 'company-height))) - (overlay-put company-pseudo-tooltip-overlay 'company-before + (let ((row (company--row pos)) + (col (company--column pos))) + (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))) + (overlay-put company-pseudo-tooltip-overlay 'company-after (apply 'company--replacement-string (company--create-lines selection (abs height)) (overlay-get company-pseudo-tooltip-overlay @@ -1797,13 +1867,18 @@ 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 'before-string 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) - (overlay-put company-pseudo-tooltip-overlay 'before-string - (overlay-get company-pseudo-tooltip-overlay 'company-before)) + ;; 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)))) (defun company-pseudo-tooltip-guard () @@ -1834,8 +1909,7 @@ Returns a negative number if the tooltip should be displayed above point." (hide (company-pseudo-tooltip-hide) (setq company-tooltip-offset 0)) (update (when (overlayp company-pseudo-tooltip-overlay) - (company-pseudo-tooltip-edit company-candidates - company-selection))))) + (company-pseudo-tooltip-edit company-selection))))) (defun company-pseudo-tooltip-unless-just-one-frontend (command) "`company-pseudo-tooltip-frontend', but not shown for single candidates." @@ -1910,17 +1984,12 @@ Returns a negative number if the tooltip should be displayed above point." (message "%s" company-echo-last-msg) (message "")))) -(defsubst company-echo-show-soon (&optional getter) +(defun company-echo-show-soon (&optional getter) (when company-echo-timer (cancel-timer company-echo-timer)) (setq company-echo-timer (run-with-timer 0 nil 'company-echo-show getter))) (defsubst company-echo-show-when-idle (&optional getter) - (when (sit-for .01) - (company-echo-show getter))) - -(defsubst company-echo-show-when-not-busy (&optional getter) - "Run `company-echo-show' with arg GETTER once Emacs isn't busy." (when (sit-for company-echo-delay) (company-echo-show getter)))