Ответы:
Это определено в company-active-map
. Вы можете отменить привязку ключа возврата на этой карте:
(define-key company-active-map (kbd "<return>") nil)
Однако обратите внимание, что return и tab делают разные вещи, когда есть несколько кандидатов. Tab связан с company-complete-common
, а return связан с company-complete-selection
. Если вы открепите ключ возврата, вы не сможете использовать M-n
и M-p
выбрать завершение из списка.
Вы можете выбрать другой ключ для использования company-complete-selection
, например:
(with-eval-after-load 'company
(define-key company-active-map (kbd "<return>") nil)
(define-key company-active-map (kbd "RET") nil)
(define-key company-active-map (kbd "C-SPC") #'company-complete-selection))
Моя полная установка для исправления этого раздражающего поведения по умолчанию:
;;; Prevent suggestions from being triggered automatically. In particular,
;;; this makes it so that:
;;; - TAB will always complete the current selection.
;;; - RET will only complete the current selection if the user has explicitly
;;; interacted with Company.
;;; - SPC will never complete the current selection.
;;;
;;; Based on:
;;; - https://github.com/company-mode/company-mode/issues/530#issuecomment-226566961
;;; - /emacs//a/13290/12534
;;; - http://stackoverflow.com/a/22863701/3538165
;;;
;;; See also:
;;; - /emacs//a/24800/12534
;;; - /emacs//q/27459/12534
;; <return> is for windowed Emacs; RET is for terminal Emacs
(dolist (key '("<return>" "RET"))
;; Here we are using an advanced feature of define-key that lets
;; us pass an "extended menu item" instead of an interactive
;; function. Doing this allows RET to regain its usual
;; functionality when the user has not explicitly interacted with
;; Company.
(define-key company-active-map (kbd key)
`(menu-item nil company-complete
:filter ,(lambda (cmd)
(when (company-explicit-action-p)
cmd)))))
(define-key company-active-map (kbd "TAB") #'company-complete-selection)
(define-key company-active-map (kbd "SPC") nil)
;; Company appears to override the above keymap based on company-auto-complete-chars.
;; Turning it off ensures we have full control.
(setq company-auto-complete-chars nil)
( ссылка на текущую конфигурацию, которая была дополнительно улучшена, но довольно сложна к этому моменту)
(обновлено согласно этому вопросу )
(define-key company-active-map (kbd "C-RET") #'company-complete-selection)
но это не сработало. Вы знаете, возможно ли это и как этого достичь?
TAB
для выбора первого элемента в списке без необходимости «взаимодействовать». Но чтобы ответить на ваш вопрос, могу поспорить, ваш терминал не может отправить C-RET
(мой не может). Попробуйте C-h k C-RET
и посмотрите, действительно ли Emacs получает сигнал, C-RET
а не просто RET
.
(define-key company-active-map (kbd "TAB") #'company-complete-common-or-cycle)
но, похоже, вы правы, когда я перешел на что-то другое, чем C-RET, я получил желаемое поведение. Спасибо.
M-p
и M-n
, или искать их с помощью C-s
, или напрямую выбирать кандидата с M-1
помощью M-0
(цифры отображаются, если вы их установили company-show-numbers
).
Просто видел это, когда искал решение той же проблемы (хотя раздражающие ключи для меня были SPC
и .
).
Я считаю, что привязка nil
ошибочных ключей к тому, что предложили @glucas и @Radon Rosborough, - это нехорошая UX, так как вам нужно вручную прервать выпадающий список компании, что разрушительно влияет на скорость набора текста.
То есть, если компания станет активной, и вы введете ключ, связанный с nil
ничем, не произойдет. Это не то, что вы ожидаете, когда набираете символ. Вы ожидаете, что символ будет вставлен.
Скорее, гораздо удобнее автоматически вызывать emacs, company-abort
а затем вставлять набранный символ. Вот мое решение:
(defun company--my-insert-spc() (interactive) (company-abort)(insert-char #10r32))
(defun company--my-insert-dot() (interactive) (company-abort)(insert-char #10r46))
(define-key company-active-map (kbd "SPC") 'company--my-insert-spc)
(define-key company-active-map (kbd ".") 'company--my-insert-dot)
Я думаю, что вы можете легко расширить это RET
, позвонив (newline)
вместо (insert-char)
(хотя я не пробовал это, потому что я использую RET
для выбора).
На самом деле я использую, use-package
так что это то, что у меня есть в моем init:
(use-package company
:config
(global-company-mode)
(setq company-minimum-prefix-length 3)
(setq company-auto-complete t)
(setq company-show-numbers t)
:bind
(("C-<tab>" . company-complete)
:map company-active-map
("ESC" . company-abort)
;; prevent company from completing on its own when we type regular characters
("SPC" . company--my-insert-spc)
("." . company--my-insert-dot)
)
)