branch: master commit ad6ff0eecca99dc5ac8b6a8a6174df7d2ad88ae7 Author: Dmitry Gutov <dgu...@yandex.ru> Commit: Dmitry Gutov <dgu...@yandex.ru>
Inhibit template field interaction while completion is active Assisted by https://github.com/joaotavora/yasnippet/issues/987. Helps #881, #731. Fixes #281, fixes #515. --- NEWS.md | 8 ++++++++ company-template.el | 18 +++++++++++++++--- company.el | 5 +++++ 3 files changed, 28 insertions(+), 3 deletions(-) diff --git a/NEWS.md b/NEWS.md index 8404398..aad2ec3 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,5 +1,13 @@ # History of user-visible changes +## Next + +* Snippet/template field interaction is inhibited while completion is active + (where by default `TAB` calls `company-complete-common`, clashing with snippet + map binding `TAB` to "jump to the next field"). Affects both + `company-template` and `yasnippet` (requires changes from 2019-04-21, + currently unreleased). + ## 2019-04-15 (0.9.10) * `company-clang`: better compatibility with Clang 8 diff --git a/company-template.el b/company-template.el index 930e638..7db50dd 100644 --- a/company-template.el +++ b/company-template.el @@ -29,16 +29,24 @@ "Face used for editable text in template fields." :group 'company) +(defvar company-template-forward-field-item + '(menu-item "" company-template-forward-field + :filter company-template--keymap-filter)) + (defvar company-template-nav-map (let ((keymap (make-sparse-keymap))) - (define-key keymap [tab] 'company-template-forward-field) - (define-key keymap (kbd "TAB") 'company-template-forward-field) + (define-key keymap [tab] company-template-forward-field-item) + (define-key keymap (kbd "TAB") company-template-forward-field-item) keymap)) +(defvar company-template-clear-field-item + '(menu-item "" company-template-clear-field + :filter company-template--keymap-filter)) + (defvar company-template-field-map (let ((keymap (make-sparse-keymap))) (set-keymap-parent keymap company-template-nav-map) - (define-key keymap (kbd "C-d") 'company-template-clear-field) + (define-key keymap (kbd "C-d") company-template-clear-field-item) keymap)) (defvar-local company-template--buffer-templates nil) @@ -78,6 +86,10 @@ (when (functionp after-clear-fn) (funcall after-clear-fn)))))) +(defun company-template--keymap-filter (cmd) + (unless (run-hook-with-args-until-success 'yas-keymap-disable-hook) + cmd)) + (defun company-template--after-clear-c-like-field () "Function that can be called after deleting a field of a c-like template. For c-like templates it is set as `after-post-fn' property on fields in diff --git a/company.el b/company.el index 4f085ee..2b92f85 100644 --- a/company.el +++ b/company.el @@ -774,9 +774,11 @@ keymap during active completions (`company-active-map'): (progn (add-hook 'pre-command-hook 'company-pre-command nil t) (add-hook 'post-command-hook 'company-post-command nil t) + (add-hook 'yas-keymap-disable-hook 'company--active-p nil t) (mapc 'company-init-backend company-backends)) (remove-hook 'pre-command-hook 'company-pre-command t) (remove-hook 'post-command-hook 'company-post-command t) + (remove-hook 'yas-keymap-disable-hook 'company--active-p t) (company-cancel) (kill-local-variable 'company-point))) @@ -1669,6 +1671,9 @@ prefix match (same case) will be prioritized." (defsubst company-keep (command) (and (symbolp command) (get command 'company-keep))) +(defun company--active-p () + company-candidates) + (defun company-pre-command () (company--electric-restore-window-configuration) (unless (company-keep this-command)