Odpowiedzi:
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-n
i M-p
wybrać 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))
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 )
(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ąć?
TAB
aby 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-RET
sprawdzić, czy Emacs rzeczywiście odbiera sygnał C-RET
zamiast po prostu RET
.
(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.
M-p
i M-n
, lub Przeszukiwać je za pomocą C-s
, lub bezpośrednio wybierać kandydata za M-1
pomocą M-0
(liczby są wyświetlane, jeśli ustawisz company-show-numbers
).
Właśnie to widziałem, szukając rozwiązania tego samego problemu (chociaż denerwujące klucze były dla mnie SPC
i .
).
Uważam, że wiązanie obrażających kluczy z nil
proponowanymi 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 RET
do wybierania).
Właściwie używam, use-package
wię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)
)
)