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.