Enter tuşunun şirket modunda tamamlamayı tetiklemesini nasıl durdurabilirim?


13

Şirket modu önerisi gösterilirken sık sık yeni bir satıra gitmek istiyorum. Şirket modunu nasıl ayarlayabilirim, böylece yalnızca sekme tuşu bir tamamlamayı tetikler?

Yanıtlar:


8

Bu, içinde tanımlanır company-active-map. Bu haritadaki dönüş anahtarını kaldırabilirsiniz:

(define-key company-active-map (kbd "<return>") nil)

Ancak, birden fazla aday olduğunda dönüş ve sekmenin farklı şeyler yaptığını unutmayın. Sekme bağlı company-complete-common, dönüş ise bağlı company-complete-selection. Dönüş anahtarını açarsanız , listeden bir tamamlama seçemez M-nve kullanamazsınız M-p.

Kullanmak için başka bir anahtar seçmek isteyebilirsiniz company-complete-selection, örneğin:

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

Thanks - so
very

8

Bu can sıkıcı varsayılan davranışı düzeltmek için eksiksiz kurulumum:

  ;;; 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
  ;;; - https://emacs.stackexchange.com/a/13290/12534
  ;;; - http://stackoverflow.com/a/22863701/3538165
  ;;;
  ;;; See also:
  ;;; - https://emacs.stackexchange.com/a/24800/12534
  ;;; - https://emacs.stackexchange.com/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)

( daha da geliştirilmiş ancak bu noktadan oldukça karmaşık olan mevcut yapılandırmaya bağlantı )

( bu soruya göre güncellenir )


Listedeki ilk öğeyi seçmek için aşağı ve geri tuşlamanın sıkıntısını kaydetmek için ('etkileşim' yapana kadar geri dönüş devre dışı olduğu için) C-RET'i seçim için bağlayıcı olarak eklemek istedim, böylece bunu ilk öğede kullanabilirim . Dahil etmeye çalıştım: (define-key company-active-map (kbd "C-RET") #'company-complete-selection) ama işe yaramadı. Bunun mümkün olup olmadığını ve nasıl başarılacağını biliyor musunuz?
user2237076

@ user2237076 Listedeki TABilk öğeyi 'etkileşime' gerek kalmadan seçmek için kullanabilirsiniz . Ama sorunuzu cevaplamak için bahse girerim ki terminaliniz gönderemez C-RET(benimki gönderemez ). C-h k C-RETEmacs'ın aslında C-RETsadece sinyali alıp almadığını görmeye çalışın RET.
Radon Rosborough

Seçenekler arasında bisiklete bağlı sekme var: (define-key company-active-map (kbd "TAB") #'company-complete-common-or-cycle) ama sağınıza benziyor, C-RET dışında bir şeye geçtiğimde istenen davranışı aldım. Teşekkürler.
user2237076

@ user2237076 Sadece bazı ek bilgiler - varsayılan olarak, seçenekler arasında dolaşabilir M-pve M-nveya ile birlikte arama yapabilir C-sveya doğrudan bir adayı M-1içinden seçebilirsiniz M-0(ayarlarsanız sayılar gösterilir company-show-numbers).
Radon Rosborough

-1

Aynı problem için bir çözüm ararken bunu gördüm (benim için sinir bozucu anahtarlar olmasına rağmen SPCve .).

nilRahatsız edici anahtarları @glucas ve @Radon Rosborough tarafından önerilen şekilde bağlamanın, o zaman hızlı yazım için yıkıcı olan şirket açılır menüsünü manuel olarak iptal etmeniz gerektiği için hoş bir UX olmadığını görüyorum.

Yani, şirket aktif hale gelir ve nil hiçbir şeye bağlı bir anahtar yazarsanız . Bir karakter yazarken beklediğiniz bu değil. Karakterin eklenmesini beklersiniz.

Bunun yerine, emacs'ın otomatik olarak araması company-abort ve ardından yazdığınız karakteri sizin için eklemesi çok daha uygundur . İşte benim çözümüm:

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

Bunu yerine RETarayarak kolayca genişletebilirsiniz düşünüyorum , (Ben bunu denemek için çünkü ben seçmek için kullanmayın çünkü ).(newline)(insert-char)RET

Aslında use-packagebu benim init var ne olduğunu kullanıyorum :

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

Sağladığım kodla şirket açılır menüsünü manuel olarak iptal etmek zorunda kalmamalısınız. M-TAB, Cv, Mv, Cs, vb. Aracılığıyla açılır menü ile açıkça etkileşime girmedikçe yazım tamamen kesintisizdir. Yapılandırmanızla ilgili bir sorun var (bu, almak için doğru ayarlamanız gereken 10 değişken olduğu için şaşırtıcı değil şirket makul bir şekilde hareket etmek…).
Radon Rosborough
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.