Réponses:
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-n
et M-p
choisir 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))
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 )
(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?
TAB
pour 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-RET
voir si Emacs reçoit réellement le signal C-RET
au lieu de juste RET
.
(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.
M-p
et M-n
, ou les rechercher avec C-s
, ou sélectionner directement un candidat avec M-1
par M-0
(les numéros sont affichés si vous définissez company-show-numbers
).
Je viens de voir cela en cherchant une solution au même problème (bien que les clés ennuyeuses pour moi l'étaient SPC
et .
).
Je trouve que lier les clés incriminées nil
comme 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 à RET
en appelant à la (newline)
place de (insert-char)
, (même si je n'ai pas essayé cela parce que j'utilise RET
pour sélectionner).
En fait, j'utilise use-package
donc 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)
)
)