Jak mogę powstrzymać klawisz Enter przed uruchomieniem zakończenia w trybie firmowym?

13

Często chcę przejść do nowej linii, gdy wyświetla się sugestia trybu firmowego. Jak skonfigurować tryb firmowy, aby tylko klawisz tabulacji wyzwalał zakończenie?

Connor
źródło

Odpowiedzi:

8

Jest to zdefiniowane w company-active-map. Możesz odznaczyć klawisz powrotu na tej mapie:

(define-key company-active-map (kbd "<return>") nil)

Zauważ jednak, że return i tab robią różne rzeczy, gdy jest wielu kandydatów. Tab jest związany z company-complete-common, podczas gdy return jest powiązany z company-complete-selection. Jeśli cofniesz powiązanie klucza powrotu, nie będziesz mógł użyć M-ni M-pwybrać zakończenia z listy.

Możesz wybrać inny klucz do użycia company-complete-selection, na przykład:

(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))
glucas
źródło
Dzięki - o wiele lepiej: D
Günter Zöchbauer
8

Moja kompletna konfiguracja do naprawy tego irytującego domyślnego zachowania to:

  ;;; 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
  ;;; - https://emacs.stackexchange.com/a/13290/12534
  ;;; - http://stackoverflow.com/a/22863701/3538165
  ;;;
  ;;; See also:
  ;;; - https://emacs.stackexchange.com/a/24800/12534
  ;;; - https://emacs.stackexchange.com/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)

( link do bieżącej konfiguracji, która została jeszcze ulepszona, ale w tym momencie jest dość skomplikowana)

(zaktualizowano zgodnie z tym pytaniem )

Radon Rosborough
źródło
Aby zaoszczędzić na kłopotach z kluczowaniem w dół i cofaniem w celu wybrania pierwszego elementu na liście (ponieważ powrót jest nieaktywny do momentu „interakcji”) chciałem dodać C-RET jako wiązanie do pełnego wyboru, aby móc użyć tego w pierwszym elemencie . Próbowałem załączyć: (define-key company-active-map (kbd "C-RET") #'company-complete-selection) ale to nie zadziałało. Czy wiesz, czy byłoby to możliwe i jak to osiągnąć?
user2237076,
@ user2237076 Możesz użyć, TABaby wybrać pierwszy element na liście bez konieczności „interakcji”. Ale aby odpowiedzieć na twoje pytanie, założę się, że twój terminal nie może wysłać C-RET(mój nie może). Spróbuj C-h k C-RETsprawdzić, czy Emacs rzeczywiście odbiera sygnał C-RETzamiast po prostu RET.
Radon Rosborough,
Mam opcje związane z przechodzeniem między opcjami: (define-key company-active-map (kbd "TAB") #'company-complete-common-or-cycle) ale wygląda na to, że masz rację, kiedy zmieniłem na coś innego niż C-RET, uzyskałem pożądane zachowanie. Dzięki.
user2237076,
@ user2237076 Po prostu dodatkowe informacje - domyślnie możesz również przełączać opcje za pomocą M-pi M-n, lub Przeszukiwać je za pomocą C-s, lub bezpośrednio wybierać kandydata za M-1pomocą M-0(liczby są wyświetlane, jeśli ustawisz company-show-numbers).
Radon Rosborough,
-1

Właśnie to widziałem, szukając rozwiązania tego samego problemu (chociaż denerwujące klucze były dla mnie SPCi .).

Uważam, że wiązanie obrażających kluczy z nilproponowanymi przez @glucas i @Radon Rosborough nie jest przyjemnym UX, ponieważ wtedy musisz ręcznie przerwać rozwijanie firmy, co jest uciążliwe dla szybkiego pisania.

Oznacza to, że jeśli firma stanie się aktywna i wpiszesz klucz związany z nil niczym , nic się nie stanie. Nie tego można się spodziewać po wpisaniu znaku. Można oczekiwać, że znak zostanie wstawiony.

Raczej wygodniej jest automatycznie wywoływać emacsa, company-abort a następnie wstawiać za Ciebie wpisany znak. Oto moje rozwiązanie:

(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)

Myślę, że możesz łatwo to rozszerzyć RET, dzwoniąc (newline)zamiast (insert-char)(chociaż nie próbowałem tego, ponieważ używam RETdo wybierania).

Właściwie używam, use-packagewięc mam to w swoim 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)
   )
  )
jpmag
źródło
Nie powinieneś ręcznie przerywać rozwijania firmy za pomocą kodu, który podałem. Wpisywanie jest całkowicie nieprzerwane, chyba że jawnie wchodzisz w interakcje z rozwijanym menu za pomocą M-TAB, Cv, Mv, Cs itp. Coś jest nie tak z konfiguracją (co nie jest zaskakujące, ponieważ istnieje około 10 zmiennych, które musisz poprawnie ustawić, aby uzyskać firma działa w sposób rozsądny…).
Radon Rosborough,