Antworten:
Dies ist definiert in company-active-map
. Sie können die Eingabetaste in dieser Karte lösen:
(define-key company-active-map (kbd "<return>") nil)
Beachten Sie jedoch, dass return und tab unterschiedliche Aufgaben ausführen, wenn mehrere Kandidaten vorhanden sind. Tab ist gebunden an company-complete-common
, während return an gebunden ist company-complete-selection
. Wenn Sie die Eingabetaste lösen, können Sie keine Vervollständigung verwenden M-n
und M-p
aus der Liste auswählen.
Möglicherweise möchten Sie einen anderen Schlüssel auswählen company-complete-selection
, für den Sie beispielsweise Folgendes verwenden möchten :
(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))
Mein komplettes Setup zur Behebung dieses nervigen Standardverhaltens lautet:
;;; 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)
( Link zur aktuellen Konfiguration, die weiter verbessert wurde, aber durch diesen Punkt ziemlich kompliziert ist)
(aktualisiert gemäß dieser Frage )
TAB
Sie das erste Element in der Liste auswählen, ohne 'interagieren' zu müssen. Aber um Ihre Frage zu beantworten, ich wette, Ihr Terminal kann nicht senden C-RET
(meins kann nicht). Versuchen Sie C-h k C-RET
herauszufinden, ob Emacs tatsächlich das Signal erhält, C-RET
anstatt nur RET
.
(define-key company-active-map (kbd "TAB") #'company-complete-common-or-cycle)
aber es sieht so aus, als ob Sie Recht hätten, als ich zu etwas anderem als C-RET gewechselt bin, habe ich das gewünschte Verhalten erhalten. Vielen Dank.
M-p
und M-n
durchblättern oder sie durchsuchen C-s
oder direkt einen Kandidaten mit M-1
durch auswählen M-0
(Zahlen werden angezeigt, wenn Sie festlegen company-show-numbers
).
Ich habe das gerade gesehen, als ich nach einer Lösung für das gleiche Problem gesucht habe (obwohl die nervigen Schlüssel für mich waren SPC
als und waren .
).
Ich finde, dass das Binden der beleidigenden Schlüssel an, nil
wie von @glucas und @Radon Rosborough vorgeschlagen, keine schöne UX ist, da Sie dann das Dropdown-Menü des Unternehmens manuell abbrechen müssen, was für die Geschwindigkeitstypisierung störend ist.
Das heißt, wenn das Unternehmen aktiv wird und Sie einen gebundenen Schlüssel eingeben nil
nichts geschieht dies. Das ist nicht das, was Sie erwarten würden, wenn Sie einen Charakter eingeben. Sie würden erwarten, dass das Zeichen eingefügt wird.
Vielmehr ist es viel bequemer, wenn Emacs automatisch aufrufen company-abort
und dann das eingegebene Zeichen für Sie einfügen. Hier ist meine Lösung:
(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)
Ich denke, Sie können dies leicht erweitern, RET
indem Sie (newline)
statt anrufen (insert-char)
(obwohl ich das nicht ausprobiert habe, weil ich es RET
zur Auswahl verwende).
Eigentlich benutze use-package
ich das, was ich in meinem Init habe:
(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)
)
)
(define-key company-active-map (kbd "C-RET") #'company-complete-selection)
aber es hat nicht funktioniert. Wissen Sie, ob dies möglich wäre und wie dies erreicht werden kann?