Wie kann ich verhindern, dass die Eingabetaste im Unternehmensmodus einen Abschluss auslöst?


12

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?

Antworten:


7

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-nund M-paus 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))

8

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 )


Um den Ärger zu vermeiden, das erste Element in der Liste herunterzufahren und zu sichern (da die Rückgabe inaktiv ist, bis Sie "interagieren"), wollte ich C-RET als Bindung zur vollständigen Auswahl hinzufügen, damit ich dies für das erste Element verwenden kann . Ich habe versucht einzuschließen: (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?
user2237076

@ user2237076 Mit können TABSie 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-RETherauszufinden, ob Emacs tatsächlich das Signal erhält, C-RETanstatt nur RET.
Radon Rosborough

Ich habe einen Tab, der an das Durchlaufen der Optionen gebunden ist: (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.
user2237076

@ user2237076 Nur einige zusätzliche Informationen - Standardmäßig können Sie die Optionen auch mit M-pund M-ndurchblättern oder sie durchsuchen C-soder direkt einen Kandidaten mit M-1durch auswählen M-0(Zahlen werden angezeigt, wenn Sie festlegen company-show-numbers).
Radon Rosborough

-1

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, nilwie 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, RETindem Sie (newline)statt anrufen (insert-char)(obwohl ich das nicht ausprobiert habe, weil ich es RETzur Auswahl verwende).

Eigentlich benutze use-packageich 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)
   )
  )

Sie sollten die Unternehmens-Dropdown-Liste nicht manuell mit dem von mir angegebenen Code abbrechen müssen. Die Eingabe ist völlig ununterbrochen, es sei denn, Sie interagieren explizit mit der Dropdown-Liste über M-TAB, Cv, Mv, Cs usw. Mit Ihrer Konfiguration stimmt etwas nicht (was nicht überraschend ist, da es ungefähr 10 Variablen gibt, die Sie korrekt einstellen müssen, um zu erhalten Unternehmen in angemessener Weise zu handeln…).
Radon Rosborough
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.