Comment puis-je empêcher la touche Entrée de déclencher un achèvement en mode entreprise?

13

Je souhaite souvent accéder à une nouvelle ligne pendant que la suggestion de mode entreprise s'affiche. Comment configurer le mode entreprise pour que seule la touche de tabulation déclenche une exécution?

Connor
la source

Réponses:

8

Ceci est défini dans company-active-map. Vous pouvez dissocier la clé de retour dans cette carte:

(define-key company-active-map (kbd "<return>") nil)

Notez cependant que retour et tabulation font des choses différentes lorsqu'il y a plusieurs candidats. Tab est lié à company-complete-common, tandis que return est lié à company-complete-selection. Si vous dissociez la touche de retour, vous ne pourrez pas utiliser M-net M-pchoisir un achèvement dans la liste.

Vous pouvez choisir une autre clé à utiliser company-complete-selection, par exemple:

(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
la source
Merci - tellement mieux: D
Günter Zöchbauer
8

Ma configuration complète pour corriger ce comportement par défaut ennuyeux est la suivante:

  ;;; 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)

( lien vers la configuration actuelle, qui a été encore améliorée mais qui est assez compliquée à ce stade)

(mis à jour selon cette question )

Radon Rosborough
la source
Pour éviter la gêne de la saisie et de la sauvegarde pour sélectionner le premier élément de la liste (comme le retour est inactif jusqu'à ce que vous `` interagissiez ''), je voulais ajouter C-RET comme liaison pour terminer la sélection afin de pouvoir l'utiliser sur le premier élément . J'ai essayé d'inclure: (define-key company-active-map (kbd "C-RET") #'company-complete-selection) mais cela n'a pas fonctionné. Savez-vous si cela serait possible et comment y parvenir?
user2237076
@ user2237076 Vous pouvez utiliser TABpour sélectionner le premier élément de la liste sans avoir à «interagir». Mais pour répondre à votre question, je parie que votre terminal ne peut pas envoyer C-RET(le mien ne peut pas). Essayez de C-h k C-RETvoir si Emacs reçoit réellement le signal C-RETau lieu de juste RET.
Radon Rosborough
J'ai un onglet lié à parcourir les options: (define-key company-active-map (kbd "TAB") #'company-complete-common-or-cycle) mais cela ressemble à votre droit, quand je suis passé à autre chose que C-RET, j'ai le comportement souhaité. Merci.
user2237076
@ user2237076 Juste quelques informations supplémentaires — par défaut, vous pouvez également parcourir les options avec M-pet M-n, ou les rechercher avec C-s, ou sélectionner directement un candidat avec M-1par M-0(les numéros sont affichés si vous définissez company-show-numbers).
Radon Rosborough du
-1

Je viens de voir cela en cherchant une solution au même problème (bien que les clés ennuyeuses pour moi l'étaient SPCet .).

Je trouve que lier les clés incriminées nilcomme proposé par @glucas et @Radon Rosborough n'est pas une bonne expérience utilisateur, car vous devez alors annuler manuellement la liste déroulante de la société, ce qui perturbe la saisie rapide.

Autrement dit, si la société devient active et que vous tapez une clé liée à nil rien , cela se produira. Ce n'est pas ce à quoi vous vous attendez lorsque vous tapez un caractère. Vous vous attendriez à ce que le caractère soit inséré.

Au contraire, il est beaucoup plus pratique d’appeler automatiquement emacs company-abort , puis d’ insérer le caractère tapé pour vous. Voici ma solution:

(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)

Je pense que vous pouvez facilement étendre cela à RETen appelant à la (newline)place de (insert-char), (même si je n'ai pas essayé cela parce que j'utilise RETpour sélectionner).

En fait, j'utilise use-packagedonc c'est ce que j'ai dans mon 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
la source
Vous ne devriez pas avoir à annuler manuellement la liste déroulante de la société avec le code que j'ai fourni. La saisie est totalement ininterrompue, sauf si vous interagissez explicitement avec la liste déroulante via M-TAB, Cv, Mv, Cs, etc. Quelque chose ne va pas avec votre configuration (ce qui n'est pas surprenant car il y a comme 10 variables que vous devez définir correctement pour obtenir entreprise à agir de manière raisonnable…).
Radon Rosborough