Câu trả lời:
Điều này được định nghĩa trong company-active-map
. Bạn có thể hủy liên kết phím trả về trong bản đồ đó:
(define-key company-active-map (kbd "<return>") nil)
Tuy nhiên, lưu ý rằng trả về và tab làm những việc khác nhau khi có nhiều ứng cử viên. Tab bị ràng buộc company-complete-common
, trong khi trả lại bị ràng buộc company-complete-selection
. Nếu bạn hủy liên kết phím trả về thì bạn sẽ không thể sử dụng M-n
và M-p
chọn hoàn thành từ danh sách.
Bạn có thể muốn chọn một số khóa khác để sử dụng company-complete-selection
, ví dụ:
(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))
Thiết lập hoàn chỉnh của tôi để sửa hành vi mặc định gây phiền nhiễu này là:
;;; 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)
( Liên kết với cấu hình hiện tại, mà đã được cải thiện hơn nữa nhưng khá phức tạp bởi thời điểm này)
(cập nhật theo câu hỏi này )
(define-key company-active-map (kbd "C-RET") #'company-complete-selection)
nhưng nó không hoạt động. Bạn có biết nếu điều này sẽ có thể và làm thế nào để đạt được?
TAB
để chọn mục đầu tiên trong danh sách mà không cần phải 'tương tác'. Nhưng để trả lời câu hỏi của bạn, tôi cá là thiết bị đầu cuối của bạn không thể gửi C-RET
(tôi không thể). Hãy thử C-h k C-RET
và xem Emacs có thực sự nhận được tín hiệu C-RET
thay vì chỉ RET
.
(define-key company-active-map (kbd "TAB") #'company-complete-common-or-cycle)
nhưng có vẻ như quyền của bạn, khi tôi đổi sang thứ khác ngoài C-RET, tôi có hành vi mong muốn. Cảm ơn.
M-p
và M-n
, hoặc Isearch chúng với C-s
, hoặc trực tiếp chọn một ứng cử viên với M-1
qua M-0
(con số này được hiển thị nếu bạn thiết lập company-show-numbers
).
Chỉ thấy điều này trong khi tìm kiếm một giải pháp cho cùng một vấn đề (mặc dù các phím gây khó chịu cho tôi là SPC
và .
).
Tôi thấy rằng việc ràng buộc các khóa vi phạm nil
theo đề xuất của @glucas và @Radon Rosborough không phải là một UX đẹp vì khi đó bạn cần hủy bỏ thủ công thả xuống công ty gây gián đoạn cho việc gõ tốc độ.
Đó là, nếu công ty trở nên hoạt động và bạn gõ một khóa bị ràng buộc sẽ nil
không có gì xảy ra. Đó không phải là những gì bạn mong đợi khi bạn nhập một nhân vật. Bạn sẽ mong đợi nhân vật được chèn vào.
Thay vào đó, sẽ thuận tiện hơn nhiều khi có các emacs tự động gọi company-abort
và sau đó chèn ký tự gõ cho bạn. Đây là giải pháp của tôi:
(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)
Tôi nghĩ rằng bạn có thể dễ dàng mở rộng điều này RET
bằng cách gọi (newline)
thay vì (insert-char)
(mặc dù tôi đã không thử điều đó vì tôi thường sử dụng RET
để chọn).
Trên thực tế tôi đang sử dụng use-package
vì vậy đây là những gì tôi có trong init của mình:
(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)
)
)