回答:
これはで定義されていcompany-active-map
ます。そのマップでReturnキーをバインド解除できます。
(define-key company-active-map (kbd "<return>") nil)
ただし、複数の候補がある場合、returnとtabは異なる動作をすることに注意してください。タブはにバインドされていますがcompany-complete-common
、リターンはにバインドされていcompany-complete-selection
ます。リターンキーのバインドを解除するM-n
とM-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))
この厄介なデフォルトの動作を修正するための私の完全なセットアップは次のとおりです。
;;; 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)
(現在の構成へのリンク。これはさらに改善されていますが、この点でかなり複雑です)
(この質問に従って更新されました)
(define-key company-active-map (kbd "C-RET") #'company-complete-selection)
が、機能しませんでした。これが可能かどうか、そしてどのように達成するか知っていますか?
TAB
して、「対話」することなく、リストの最初の項目を選択できます。しかし、あなたの質問に答えるために、あなたの端末は送信できないでしょうC-RET
(私のものはできません)。C-h k C-RET
Emacs C-RET
が単にの代わりに実際にシグナルを取得するかどうか試してみてくださいRET
。
(define-key company-active-map (kbd "TAB") #'company-complete-common-or-cycle)
しかし、それはあなたの権利のようです。C-RET以外のものに変更したとき、私は望ましい動作を得ました。ありがとう。
M-p
およびM-n
、またはインクリメンタルサーチ彼らとC-s
直接、またはを持つ候補者を選択しM-1
てM-0
(あなたが設定されている場合の数字が表示されますcompany-show-numbers
)。
同じ問題の解決策を探しているときにこれを見ただけです(私にとって迷惑なキーはSPC
and でしたが.
)。
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)
)
)