¿Cómo puedo evitar que la tecla Intro active una finalización en modo empresa?


13

A menudo quiero ir a una nueva línea mientras se muestra la sugerencia de modo de empresa. ¿Cómo puedo configurar el modo empresa para que solo la tecla de tabulación active una finalización?

Respuestas:


8

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-ny M-pelegir 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))

Gracias, mucho mejor: D
Günter Zöchbauer

8

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 )


Para ahorrar la molestia de presionar y retroceder para seleccionar el primer elemento de la lista (ya que el retorno está inactivo hasta que 'interactúe'), quería agregar C-RET como enlace para completar la selección para poder usar esto en el primer elemento . Traté de incluir: (define-key company-active-map (kbd "C-RET") #'company-complete-selection) pero no funcionó. ¿Sabes si esto sería posible y cómo lograrlo?
user2237076

@ user2237076 Puede usar TABpara 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-RETy vea si Emacs realmente recibe la señal en C-RETlugar de solo RET.
Radon Rosborough

Tengo pestañas obligadas a recorrer las opciones: (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.
user2237076

@ user2237076 Solo información adicional: de forma predeterminada, también puede desplazarse por las opciones con M-py M-n, o buscarlas con C-s, o seleccionar directamente un candidato con M-1through M-0(los números se muestran si establece company-show-numbers).
Radon Rosborough

-1

Acabo de ver esto mientras buscaba una solución para el mismo problema (aunque las claves molestas para mí eran SPCy .).

Encuentro que vincular las teclas ofensivas nilsegú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 RETllamando en (newline)lugar de hacerlo (insert-char)(aunque no lo he intentado porque uso RETpara seleccionar).

En realidad estoy usando, use-packageasí 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)
   )
  )

No debería tener que abortar manualmente el menú desplegable de la empresa con el código que proporcioné. La escritura es completamente ininterrumpida a menos que interactúe explícitamente con el menú desplegable a través de M-TAB, Cv, Mv, Cs, etc. Algo está mal con su configuración (lo cual no es sorprendente ya que hay como 10 variables que debe configurar correctamente para obtener empresa para actuar de manera razonable ...).
Radon Rosborough
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.