Làm cách nào tôi có thể ngăn phím enter kích hoạt hoàn thành trong chế độ công ty?


13

Tôi thường muốn đi đến một dòng mới trong khi đề xuất chế độ công ty đang hiển thị. Làm cách nào tôi có thể thiết lập chế độ công ty để chỉ phím tab kích hoạt hoàn thành?

Câu trả lời:


8

Đ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-nM-pchọ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))

Cảm ơn - tốt hơn rất nhiều: D
Günter Zöchbauer

8

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 )


Để tiết kiệm sự khó chịu của việc khóa và sao lưu để chọn mục đầu tiên trong danh sách (vì trả lại không hoạt động cho đến khi bạn 'tương tác') Tôi muốn thêm C-RET làm liên kết để lựa chọn hoàn chỉnh để tôi có thể sử dụng mục này cho mục đầu tiên . Tôi đã cố gắng bao gồm: (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?
dùng2237076

@ user2237076 Bạn có thể sử dụng 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-RETvà xem Emacs có thực sự nhận được tín hiệu C-RETthay vì chỉ RET.
Radon Rosborough

Tôi đã có tab ràng buộc để đạp xe qua các tùy chọn: (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.
dùng2237076

@ user2237076 Chỉ cần một số bổ sung thông tin theo mặc định, bạn cũng có thể chu kỳ qua các tùy chọn với M-pM-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-1qua M-0(con số này được hiển thị nếu bạn thiết lập company-show-numbers).
Radon Rosborough

-1

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

Tôi thấy rằng việc ràng buộc các khóa vi phạm niltheo đề 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 RETbằ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-packagevì 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)
   )
  )

Bạn không cần phải hủy bỏ thủ công danh sách công ty với mã tôi đã cung cấp. Việc gõ hoàn toàn không bị gián đoạn trừ khi bạn tương tác rõ ràng với trình đơn thả xuống thông qua M-TAB, Cv, Mv, Cs, v.v. Có gì đó không đúng với cấu hình của bạn (điều này không đáng ngạc nhiên vì có 10 biến bạn phải đặt chính xác để có được công ty hành động một cách hợp lý.
Radon Rosborough
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.