Come posso impedire al tasto Invio di avviare un completamento in modalità azienda?


13

Spesso voglio andare a una nuova riga mentre viene mostrato il suggerimento sulla modalità azienda. Come posso impostare la modalità azienda in modo che solo il tasto TAB possa attivare un completamento?

Risposte:


8

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-ne M-pselezionare 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))

Grazie - molto meglio: D
Günter Zöchbauer il

8

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 )


Per evitare il fastidio di digitare e tornare indietro per selezionare il primo elemento nell'elenco (poiché il ritorno è inattivo fino a quando non si "interagisce"), volevo aggiungere C-RET come vincolante per completare la selezione in modo da poterlo utilizzare sul primo elemento . Ho provato a includere: (define-key company-active-map (kbd "C-RET") #'company-complete-selection) ma non ha funzionato. Sai se questo sarebbe possibile e come raggiungerlo?
user2237076

@ user2237076 È possibile utilizzare TABper 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-RETvedere se Emacs riceve effettivamente il segnale C-RETanziché solo RET.
Radon Rosborough,

Ho una scheda destinata a scorrere le opzioni: (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.
user2237076

@ user2237076 Solo alcune informazioni aggiuntive: per impostazione predefinita, è anche possibile scorrere le opzioni con M-pe M-n, o Isearch con C-so selezionare direttamente un candidato con M-1attraverso M-0(i numeri vengono visualizzati se si imposta company-show-numbers).
Radon Rosborough,

-1

Ho appena visto questo mentre cercavo una soluzione per lo stesso problema (anche se le fastidiose chiavi per me erano SPCe .).

Trovo che associare le chiavi offensive a nilcome 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 RETchiamando (newline)invece di (insert-char)(anche se non l'ho provato perché lo uso RETper selezionare).

In realtà sto usando use-packagequindi 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)
   )
  )

Non dovresti interrompere manualmente il menu a discesa dell'azienda con il codice che ho fornito. La digitazione è completamente ininterrotta a meno che tu non interagisca esplicitamente con il menu a discesa tramite M-TAB, Cv, Mv, Cs, ecc. Qualcosa non va nella tua configurazione (il che non sorprende poiché ci sono circa 10 variabili che devi impostare correttamente per ottenere società per agire in modo ragionevole ...).
Radon Rosborough,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.