Como impedir que a tecla Enter desencadeie uma conclusão no modo de empresa?

13

Muitas vezes, quero ir para uma nova linha enquanto a sugestão de modo da empresa é exibida. Como posso configurar o modo da empresa para que apenas a tecla tab ative uma conclusão?

Connor
fonte

Respostas:

8

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-ne M-pselecionar 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))
glucas
fonte
Obrigado - muito melhor: D
Günter Zöchbauer 27/02
8

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 )

Radon Rosborough
fonte
Para evitar o incômodo de digitar e fazer backup para selecionar o primeiro item da lista (como o retorno fica inativo até você 'interagir'), eu queria adicionar o C-RET como ligação para concluir a seleção para que eu pudesse usá-lo no primeiro item . Tentei incluir: (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?
precisa saber é o seguinte
@ user2237076 Você pode usar TABpara 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-RETe veja se o Emacs realmente recebe o sinal em C-RETvez de apenas RET.
Radon Rosborough
Eu tenho um guia vinculado a percorrer as opções: (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.
precisa saber é o seguinte
@ user2237076 Apenas algumas informações adicionais - por padrão, você também pode percorrer as opções com M-pe M-n, ou Pesquisá-las com C-s, ou selecionar diretamente um candidato com M-1through M-0(os números são mostrados se você definir company-show-numbers).
Radon Rosborough
-1

Só vi isso enquanto procurava uma solução para o mesmo problema (embora as chaves irritantes para mim fossem SPCe .).

Acho que vincular as chaves nilincorretas 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 RETchamando em (newline)vez de (insert-char)(embora eu não tenha tentado isso porque uso RETpara selecionar).

Na verdade, eu estou usando, use-packageentã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)
   )
  )
jpmag
fonte
Você não precisa anular manualmente o menu suspenso da empresa com o código que eu forneci. A digitação é completamente ininterrupta, a menos que você interaja explicitamente com o menu suspenso via M-TAB, Cv, Mv, Cs, etc. Algo está errado com sua configuração (o que não é surpreendente, pois existem 10 variáveis ​​que você precisa definir corretamente para obter empresa a agir de maneira razoável…).
Radon Rosborough