Bagaimana saya bisa menghentikan tombol enter dari memicu penyelesaian dalam mode perusahaan?

13

Saya sering ingin pergi ke baris baru saat saran mode perusahaan ditampilkan. Bagaimana saya bisa mengatur mode perusahaan sehingga hanya tombol tab yang memicu penyelesaian?

Connor
sumber

Jawaban:

8

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-ndan M-pmemilih 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))
glukas
sumber
Terima kasih - jauh lebih baik: D
Günter Zöchbauer
8

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 )

Radon Rosborough
sumber
Untuk menyimpan gangguan memasukkan dan mencadangkan untuk memilih item pertama dalam daftar (karena pengembalian tidak aktif sampai Anda 'berinteraksi') Saya ingin menambahkan C-RET sebagai mengikat untuk menyelesaikan seleksi sehingga saya bisa menggunakan ini pada item pertama . Saya mencoba memasukkan: (define-key company-active-map (kbd "C-RET") #'company-complete-selection) tetapi tidak berhasil. Apakah Anda tahu apakah ini mungkin dan bagaimana cara mencapainya?
user2237076
@ user2237076 Anda dapat menggunakan TABuntuk 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-RETdan lihat apakah Emacs benar-benar mendapatkan sinyal, C-RETbukan hanya RET.
Radon Rosborough
Saya punya tab terikat untuk bersepeda melalui opsi: (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.
user2237076
@ user2237076 Hanya beberapa info tambahan — secara default, Anda juga dapat menggilir opsi dengan M-pdan M-n, atau Melakukan pencarian dengan C-s, atau secara langsung memilih kandidat M-1melalui M-0(angka ditampilkan jika Anda menyetel company-show-numbers).
Radon Rosborough
-1

Hanya melihat ini sambil mencari solusi untuk masalah yang sama (meskipun kunci yang mengganggu bagi saya adalah SPCdan .).

Saya menemukan bahwa mengikat kunci yang menyinggung nilseperti 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 RETdengan menelepon (newline)alih-alih (insert-char), (meskipun saya belum mencobanya karena saya gunakan RETuntuk memilih).

Sebenarnya saya menggunakan use-packagejadi 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)
   )
  )
jpmag
sumber
Anda tidak harus membatalkan secara manual dropdown perusahaan dengan kode yang saya berikan. Pengetikan benar-benar tidak terganggu kecuali jika Anda secara eksplisit berinteraksi dengan dropdown melalui M-TAB, Cv, Mv, Cs, dll. Ada yang salah dengan konfigurasi Anda (yang tidak mengejutkan karena ada seperti 10 variabel yang harus Anda atur dengan benar untuk mendapatkan perusahaan untuk bertindak dengan cara yang masuk akal ...).
Radon Rosborough