Risposte:
Questo è definito in company-active-map
. Puoi sbloccare la chiave di ritorno in quella mappa:
(define-key company-active-map (kbd "<return>") nil)
Nota comunque che return e tab fanno cose diverse quando ci sono più candidati. Tab è vincolato a company-complete-common
, mentre return è legato a company-complete-selection
. Se si sblocca la chiave di ritorno, non sarà possibile utilizzare M-n
e M-p
selezionare un completamento dall'elenco.
Potresti voler scegliere qualche altro tasto da utilizzare per company-complete-selection
, ad esempio:
(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))
La mia configurazione completa per risolvere questo fastidioso comportamento predefinito è:
;;; 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)
( collegamento alla configurazione corrente, che è stata ulteriormente migliorata ma a questo punto è piuttosto complicata)
(aggiornato secondo questa domanda )
(define-key company-active-map (kbd "C-RET") #'company-complete-selection)
ma non ha funzionato. Sai se questo sarebbe possibile e come raggiungerlo?
TAB
per selezionare il primo elemento nell'elenco senza bisogno di "interagire". Ma per rispondere alla tua domanda, scommetto che il tuo terminale non può inviare C-RET
(il mio non può). Prova a C-h k C-RET
vedere se Emacs riceve effettivamente il segnale C-RET
anziché solo RET
.
(define-key company-active-map (kbd "TAB") #'company-complete-common-or-cycle)
ma sembra che tu abbia ragione, quando sono passato a qualcosa di diverso da C-RET ho ottenuto il comportamento desiderato. Grazie.
M-p
e M-n
, o Isearch con C-s
o selezionare direttamente un candidato con M-1
attraverso M-0
(i numeri vengono visualizzati se si imposta company-show-numbers
).
Ho appena visto questo mentre cercavo una soluzione per lo stesso problema (anche se le fastidiose chiavi per me erano SPC
e .
).
Trovo che associare le chiavi offensive a nil
come proposto da @glucas e @Radon Rosborough non sia una bella UX in quanto è necessario interrompere manualmente il menu a discesa della società che è dirompente per la digitazione rapida.
Cioè, se la società diventa attiva e si digita una chiave associata a nil
nulla accadrà. Non è quello che ti aspetteresti quando scrivi un personaggio. Ti aspetteresti di inserire il personaggio.
Piuttosto, è molto più conveniente avere emacs chiamare automaticamente company-abort
e quindi inserire il carattere digitato per te. Ecco la mia soluzione:
(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)
Penso che puoi facilmente estenderlo RET
chiamando (newline)
invece di (insert-char)
(anche se non l'ho provato perché lo uso RET
per selezionare).
In realtà sto usando use-package
quindi questo è quello che ho nel mio 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)
)
)