Jawaban:
Ini didefinisikan dalam company-active-map
. Anda dapat melepaskan ikatan kunci kembali di peta itu:
(define-key company-active-map (kbd "<return>") nil)
Perhatikan bahwa pengembalian dan tab melakukan hal-hal yang berbeda ketika ada banyak kandidat. Tab terikat company-complete-common
, sedangkan pengembalian terikat company-complete-selection
. Jika Anda melepas ikatan tombol kembali maka Anda tidak akan dapat menggunakan M-n
dan M-p
memilih penyelesaian dari daftar.
Anda mungkin ingin memilih beberapa kunci lain untuk digunakan company-complete-selection
, misalnya:
(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))
Pengaturan lengkap saya untuk memperbaiki perilaku default yang mengganggu ini adalah:
;;; 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)
( tautan ke konfigurasi saat ini, yang telah lebih ditingkatkan tetapi cukup rumit pada titik ini)
(diperbarui sesuai pertanyaan ini )
(define-key company-active-map (kbd "C-RET") #'company-complete-selection)
tetapi tidak berhasil. Apakah Anda tahu apakah ini mungkin dan bagaimana cara mencapainya?
TAB
untuk memilih item pertama dalam daftar tanpa perlu 'berinteraksi'. Tetapi untuk menjawab pertanyaan Anda, saya yakin terminal Anda tidak dapat mengirim C-RET
(saya tidak bisa). Coba C-h k C-RET
dan lihat apakah Emacs benar-benar mendapatkan sinyal, C-RET
bukan hanya RET
.
(define-key company-active-map (kbd "TAB") #'company-complete-common-or-cycle)
tetapi sepertinya hak Anda, ketika saya mengubah sesuatu selain C-RET saya mendapatkan perilaku yang diinginkan. Terima kasih.
M-p
dan M-n
, atau Melakukan pencarian dengan C-s
, atau secara langsung memilih kandidat M-1
melalui M-0
(angka ditampilkan jika Anda menyetel company-show-numbers
).
Hanya melihat ini sambil mencari solusi untuk masalah yang sama (meskipun kunci yang mengganggu bagi saya adalah SPC
dan .
).
Saya menemukan bahwa mengikat kunci yang menyinggung nil
seperti yang diusulkan oleh @glucas dan @Radon Rosborough bukan UX yang bagus karena Anda perlu secara manual membatalkan dropdown perusahaan yang mengganggu untuk mengetik cepat.
Artinya, jika perusahaan menjadi aktif dan Anda mengetikkan kunci yang terikat pada nil
apa pun tidak akan terjadi. Bukan itu yang Anda harapkan ketika Anda mengetik karakter. Anda akan mengharapkan karakter dimasukkan.
Alih-alih, jauh lebih mudah untuk memanggil emacs secara otomatis company-abort
dan kemudian memasukkan karakter yang diketik untuk Anda. Inilah solusi saya:
(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)
Saya pikir Anda dapat dengan mudah memperpanjang ini RET
dengan menelepon (newline)
alih-alih (insert-char)
, (meskipun saya belum mencobanya karena saya gunakan RET
untuk memilih).
Sebenarnya saya menggunakan use-package
jadi ini yang saya miliki di init saya:
(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)
)
)