X-Git-Url: https://code.delx.au/gnu-emacs-elpa/blobdiff_plain/39eb1158909bae3754d24f00437a2e8e969ac573..779de03e226b161a00c3428ffdadd89ecbc422d0:/company.el diff --git a/company.el b/company.el index f83eeb45a..9c44f4b2c 100644 --- a/company.el +++ b/company.el @@ -1525,21 +1525,8 @@ from the rest of the backends in the group, if any, will be left at the end." (company-call-frontends 'update))) (defun company-cancel (&optional result) - (unwind-protect - (progn - (when company-timer - (cancel-timer company-timer)) - (company-echo-cancel t) - (company-search-mode 0) - (company-call-frontends 'hide) - (company-enable-overriding-keymap 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)))) + (let ((prefix company-prefix) + (backend company-backend)) (setq company-backend nil company-prefix nil company-candidates nil @@ -1552,7 +1539,22 @@ from the rest of the backends in the group, if any, will be left at the end." company--manual-action nil company--manual-prefix nil company--point-max nil - company-point nil)) + company-point nil) + (when company-timer + (cancel-timer company-timer)) + (company-echo-cancel t) + (company-search-mode 0) + (company-call-frontends 'hide) + (company-enable-overriding-keymap nil) + (when prefix + ;; FIXME: RESULT can also be e.g. `unique'. We should call + ;; `company-completion-finished-hook' in that case, with right argument. + (if (stringp result) + (let ((company-backend backend)) + (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)))) ;; Make return value explicit. nil) @@ -1568,6 +1570,7 @@ from the rest of the backends in the group, if any, will be left at the end." (and (symbolp command) (get command 'company-keep))) (defun company-pre-command () + (company--electric-restore-window-configuration) (unless (company-keep this-command) (condition-case-unless-debug err (when company-candidates @@ -2118,28 +2121,30 @@ character, stripping the modifiers. That character must be a digit." (insert string))) (current-buffer))) +(defvar company--electric-saved-window-configuration nil) + (defvar company--electric-commands '(scroll-other-window scroll-other-window-down mwheel-scroll) "List of Commands that won't break out of electric commands.") +(defun company--electric-restore-window-configuration () + "Restore window configuration (after electric commands)." + (when (and company--electric-saved-window-configuration + (not (memq this-command company--electric-commands))) + (set-window-configuration company--electric-saved-window-configuration) + (setq company--electric-saved-window-configuration nil))) + (defmacro company--electric-do (&rest body) (declare (indent 0) (debug t)) `(when (company-manual-begin) - (save-window-excursion - (let ((height (window-height)) - (row (company--row)) - cmd) - ,@body - (and (< (window-height) height) - (< (- (window-height) row 2) company-tooltip-limit) - (recenter (- (window-height) row 2))) - (while (memq (setq cmd (key-binding (read-key-sequence-vector nil))) - company--electric-commands) - (condition-case err - (call-interactively cmd) - ((beginning-of-buffer end-of-buffer) - (message (error-message-string err))))) - (company--unread-last-input))))) + (cl-assert (null company--electric-saved-window-configuration)) + (setq company--electric-saved-window-configuration (current-window-configuration)) + (let ((height (window-height)) + (row (company--row))) + ,@body + (and (< (window-height) height) + (< (- (window-height) row 2) company-tooltip-limit) + (recenter (- (window-height) row 2)))))) (defun company--unread-last-input () (when last-input-event @@ -2961,8 +2966,8 @@ Returns a negative number if the tooltip should be displayed above point." "}"))) (defun company-echo-hide () - (unless (null company-echo-last-msg) - (setq company-echo-last-msg nil) + (unless (equal company-echo-last-msg "") + (setq company-echo-last-msg "") (company-echo-show))) (defun company-echo-frontend (command)