Enterキーが会社モードで完了をトリガーするのをどのように停止できますか?


13

会社モードの提案が表示されているときに、改行に行きたいことがよくあります。タブキーだけで完了をトリガーするように会社モードを設定するにはどうすればよいですか?

回答:


8

これはで定義されていcompany-active-mapます。そのマップでReturnキーをバインド解除できます。

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

ただし、複数の候補がある場合、returnとtabは異なる動作をすることに注意してください。タブはにバインドされていますがcompany-complete-common、リターンはにバインドされていcompany-complete-selectionます。リターンキーのバインドを解除するM-nM-p、リストから補完を使用したり、選択したりできなくなります。

に使用する他のキーを選択することもできます。company-complete-selection次に例を示します。

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

おかげで-そんなに良く:D
ギュンターZöchbauer

8

この厄介なデフォルトの動作を修正するための私の完全なセットアップは次のとおりです。

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

(現在の構成へのリンク。これはさらに改善されていますが、この点でかなり複雑です)

この質問に従って更新されました)


キー操作の煩わしさを解消し、リストの最初の項目を選択するために戻る(「対話」するまでReturnは非アクティブであるため)私は、C-RETをバインディングとして追加して、選択を完了し、最初の項目でこれを使用できるようにしました。含めようとしました (define-key company-active-map (kbd "C-RET") #'company-complete-selection) が、機能しませんでした。これが可能かどうか、そしてどのように達成するか知っていますか?
user2237076 2017年

@ user2237076を使用TABして、「対話」することなく、リストの最初の項目を選択できます。しかし、あなたの質問に答えるために、あなたの端末は送信できないでしょうC-RET(私のものはできません)。C-h k C-RETEmacs C-RETが単にの代わりに実際にシグナルを取得するかどうか試してみてくださいRET
Radon Rosborough、2017年

オプションを循環するためのタブがバインドされています。 (define-key company-active-map (kbd "TAB") #'company-complete-common-or-cycle) しかし、それはあなたの権利のようです。C-RET以外のものに変更したとき、私は望ましい動作を得ました。ありがとう。
user2237076 2017年

@ user2237076ただ、いくつかの追加情報-デフォルトでは、あなたがすることもできオプションを循環してM-pおよびM-n、またはインクリメンタルサーチ彼らとC-s直接、またはを持つ候補者を選択しM-1M-0(あなたが設定されている場合の数字が表示されますcompany-show-numbers)。
Radon Rosborough、2017年

-1

同じ問題の解決策を探しているときにこれを見ただけです(私にとって迷惑なキーはSPCand でしたが.)。

nil@glucasと@Radon Rosboroughによって提案されたように問題のあるキーをバインドすることは、UXを手動で中断する必要があるため、スピードタイピングを中断させる必要があるため、適切なUXではありません。

つまり、会社がアクティブになり、nil 何にもバインドされていないキーを入力すると、も起こりません。これは、文字を入力するときに期待するものではありません。文字が挿入されることを期待します。

むしろ、emacsが自動的に呼び出してcompany-abort から、入力した文字を挿入する方がはるかに便利です。これが私の解決策です:

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

の代わりにをRET呼び出す(newline)ことで(insert-char)、これを簡単に拡張できると思います(ただしRET、selectを使用しているので、試したことはありません)。

実際に私は使用しているuse-packageので、これは私の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)
   )
  )

私が提供したコードを使用して、会社のドロップダウンを手動で中止する必要はありません。M-TAB、Cv、Mv、Csなどを使用してドロップダウンを明示的に操作しない限り、タイピングは完全に中断されません。会社は合理的な方法で行動する…)。
Radon Rosborough、2017
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.