Respostas:
Isso é definido em company-active-map
. Você pode desatar a chave de retorno nesse mapa:
(define-key company-active-map (kbd "<return>") nil)
Observe, no entanto, que return e tab fazem coisas diferentes quando há vários candidatos. A guia está vinculada a company-complete-common
, enquanto o retorno está vinculado a company-complete-selection
. Se você desvincular a chave de retorno, não poderá usar M-n
e M-p
selecionar uma conclusão da lista.
Você pode escolher outra chave para usar company-complete-selection
, por exemplo:
(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))
Minha configuração completa para corrigir esse comportamento padrão irritante é:
;;; 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)
( link para a configuração atual, que foi aprimorada ainda mais, mas é bastante complicada neste ponto)
(atualizado conforme esta pergunta )
(define-key company-active-map (kbd "C-RET") #'company-complete-selection)
mas não funcionou. Você sabe se isso seria possível e como conseguir?
TAB
para selecionar o primeiro item da lista sem precisar 'interagir'. Mas, para responder sua pergunta, aposto que seu terminal não pode enviar C-RET
(o meu não pode). Tente C-h k C-RET
e veja se o Emacs realmente recebe o sinal em C-RET
vez de apenas RET
.
(define-key company-active-map (kbd "TAB") #'company-complete-common-or-cycle)
mas parece que você está certo, quando mudei para algo diferente do C-RET, obtive o comportamento desejado. Obrigado.
M-p
e M-n
, ou Pesquisá-las com C-s
, ou selecionar diretamente um candidato com M-1
through M-0
(os números são mostrados se você definir company-show-numbers
).
Só vi isso enquanto procurava uma solução para o mesmo problema (embora as chaves irritantes para mim fossem SPC
e .
).
Acho que vincular as chaves nil
incorretas conforme proposto por @glucas e @Radon Rosborough não é um bom UX, pois você precisa abortar manualmente o menu suspenso da empresa, o que prejudica a digitação rápida.
Ou seja, se a empresa se tornar ativa e você digitar uma chave vinculada a nil
nada, isso acontecerá. Não é o que você esperaria ao digitar um personagem. Você esperaria que o caractere fosse inserido.
Pelo contrário, é muito mais conveniente que o emacs chame automaticamente company-abort
e insira o caractere digitado para você. Aqui está a minha solução:
(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)
Eu acho que você pode estender isso facilmente RET
chamando em (newline)
vez de (insert-char)
(embora eu não tenha tentado isso porque uso RET
para selecionar).
Na verdade, eu estou usando, use-package
então é isso que eu tenho no meu 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)
)
)