Ich möchte oft zu einer neuen Zeile gehen, während der Vorschlag für den Unternehmensmodus angezeigt wird. Wie kann ich den Unternehmensmodus so einrichten, dass nur die Tabulatortaste einen Abschluss auslöst?
quelle
Ich möchte oft zu einer neuen Zeile gehen, während der Vorschlag für den Unternehmensmodus angezeigt wird. Wie kann ich den Unternehmensmodus so einrichten, dass nur die Tabulatortaste einen Abschluss auslöst?
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 )
(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?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 sendenC-RET
(meins kann nicht). Versuchen SieC-h k C-RET
herauszufinden, ob Emacs tatsächlich das Signal erhält,C-RET
anstatt nurRET
.(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
undM-n
durchblättern oder sie durchsuchenC-s
oder direkt einen Kandidaten mitM-1
durch auswählenM-0
(Zahlen werden angezeigt, wenn Sie festlegencompany-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:Ich denke, Sie können dies leicht erweitern,
RET
indem Sie(newline)
statt anrufen(insert-char)
(obwohl ich das nicht ausprobiert habe, weil ich esRET
zur Auswahl verwende).Eigentlich benutze
use-package
ich das, was ich in meinem Init habe:quelle