Respuestas:
Esto se define en company-active-map
. Puede desvincular la clave de retorno en ese mapa:
(define-key company-active-map (kbd "<return>") nil)
Sin embargo, tenga en cuenta que return y tab hacen cosas diferentes cuando hay múltiples candidatos. Tab está vinculado a company-complete-common
, mientras que return está vinculado a company-complete-selection
. Si desvincula la tecla de retorno, no podrá usar M-n
y M-p
elegir una finalización de la lista.
Es posible que desee elegir otra clave para usar company-complete-selection
, por ejemplo:
(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))
Mi configuración completa para solucionar este molesto comportamiento predeterminado es:
;;; 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)
( enlace a la configuración actual, que se ha mejorado aún más pero es bastante complicado en este punto)
(actualizado según esta pregunta )
(define-key company-active-map (kbd "C-RET") #'company-complete-selection)
pero no funcionó. ¿Sabes si esto sería posible y cómo lograrlo?
TAB
para seleccionar el primer elemento de la lista sin necesidad de 'interactuar'. Pero para responder a su pregunta, apuesto a que su terminal no puede enviar C-RET
(el mío no puede). Pruebe C-h k C-RET
y vea si Emacs realmente recibe la señal en C-RET
lugar de solo RET
.
(define-key company-active-map (kbd "TAB") #'company-complete-common-or-cycle)
pero parece que está bien, cuando cambié a otra que no sea C-RET obtuve el comportamiento deseado. Gracias.
M-p
y M-n
, o buscarlas con C-s
, o seleccionar directamente un candidato con M-1
through M-0
(los números se muestran si establece company-show-numbers
).
Acabo de ver esto mientras buscaba una solución para el mismo problema (aunque las claves molestas para mí eran SPC
y .
).
Encuentro que vincular las teclas ofensivas nil
según lo propuesto por @glucas y @Radon Rosborough no es una buena experiencia de usuario, ya que entonces debe abortar manualmente el menú desplegable de la compañía que es perjudicial para la escritura rápida.
Es decir, si la empresa se activa y escribe una clave vinculada a nil
nada , sucederá. Eso no es lo que esperarías cuando escribes un personaje. Es de esperar que se inserte el carácter.
Por el contrario, es mucho más conveniente que emacs llame automáticamente company-abort
y luego inserte el carácter escrito por usted. Aquí está mi solución:
(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)
Creo que puede extender esto fácilmente RET
llamando en (newline)
lugar de hacerlo (insert-char)
(aunque no lo he intentado porque uso RET
para seleccionar).
En realidad estoy usando, use-package
así que esto es lo que tengo en mi 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)
)
)