ฉันจะหยุดการป้อนคีย์จากการเรียกใช้ความสำเร็จในโหมด บริษัท ได้อย่างไร?


13

ฉันมักจะต้องการขึ้นบรรทัดใหม่ในขณะที่การแนะนำโหมด บริษัท กำลังแสดง ฉันจะตั้งค่าโหมด บริษัท ได้อย่างไรเพียงคีย์แท็บเท่านั้นที่ทำให้เสร็จสมบูรณ์

คำตอบ:


8

company-active-mapนี้ถูกกำหนดไว้ใน คุณสามารถยกเลิกการผูกปุ่มย้อนกลับในแผนที่นั้น:

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

โปรดทราบว่าการส่งคืนและแท็บจะทำสิ่งต่าง ๆ เมื่อมีผู้สมัครหลายคน แท็บที่ถูกผูกไว้ในขณะที่ผลตอบแทนที่ถูกผูกไว้กับcompany-complete-common company-complete-selectionหากคุณยกเลิกการผูกคีย์ส่งคืนคุณจะไม่สามารถใช้M-nและM-pเลือกการทำให้เสร็จสมบูรณ์จากรายการ

คุณอาจต้องการเลือกคีย์อื่นที่จะใช้สำหรับcompany-complete-selection:

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

ขอบคุณ - ดียิ่งขึ้นมาก: D
GünterZöchbauer

8

การตั้งค่าที่สมบูรณ์ของฉันสำหรับการแก้ไขพฤติกรรมเริ่มต้นที่น่ารำคาญคือ:

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

( ลิงก์ไปยังการกำหนดค่าปัจจุบันซึ่งได้รับการปรับปรุงเพิ่มเติม แต่ค่อนข้างซับซ้อนในตอนนี้)

(อัปเดตตามคำถามนี้ )


เพื่อบันทึกความรำคาญของการคีย์ลงและสำรองเพื่อเลือกไอเท็มแรกในรายการ (เนื่องจากการส่งคืนไม่ได้ใช้งานจนกว่าคุณจะ 'โต้ตอบ') ฉันต้องการเพิ่ม C-RET เป็นการรวมเข้ากับการเลือกทั้งหมดดังนั้นฉันจึงสามารถใช้รายการนี้ในรายการแรก . ฉันพยายามรวม: (define-key company-active-map (kbd "C-RET") #'company-complete-selection) แต่มันไม่ทำงาน คุณรู้หรือไม่ว่าสิ่งนี้จะเป็นไปได้และจะบรรลุได้อย่างไร
2237076

@ user2237076 คุณสามารถใช้TABเพื่อเลือกรายการแรกในรายการโดยไม่จำเป็นต้อง 'โต้ตอบ' แต่เพื่อตอบคำถามของคุณฉันเดิมพันได้ว่าเทอร์มินัลของคุณไม่สามารถส่งC-RETได้ ลองC-h k C-RETและดูว่า Emacs จริงได้รับสัญญาณแทนเพียงC-RET RET
Radon Rosborough

ฉันมีแท็บที่ขี่จักรยานผ่านตัวเลือก: (define-key company-active-map (kbd "TAB") #'company-complete-common-or-cycle) แต่ดูเหมือนว่าสิทธิ์ของคุณเมื่อฉันเปลี่ยนเป็นสิ่งอื่นที่ไม่ใช่ C-RET ฉันได้รับพฤติกรรมที่ต้องการ ขอบคุณ
2237076

@ user2237076 เพียงบางส่วนเพิ่มเติมข้อมูลโดยค่าเริ่มต้นคุณยังสามารถวงจรผ่านตัวเลือกที่มีM-pและM-nหรือ iSearch พวกเขาด้วยC-sหรือโดยตรงเลือกผู้สมัครที่มีM-1ผ่านM-0(ตัวเลขจะแสดงถ้าคุณตั้งค่าcompany-show-numbers)
Radon Rosborough

-1

เพิ่งเห็นสิ่งนี้ในขณะที่กำลังมองหาทางออกสำหรับปัญหาเดียวกัน (แม้ว่ากุญแจที่น่ารำคาญสำหรับฉันคือSPCและ.)

ฉันพบว่าการผูกคีย์ที่ละเมิดให้nilเป็นไปตามที่เสนอโดย @glucas และ @Radon Rosborough ไม่ใช่ UX ที่ดีเพราะคุณต้องยกเลิกการเลื่อนลงของ บริษัท ด้วยตนเองซึ่งทำให้การพิมพ์ความเร็วลดลง

นั่นคือถ้า บริษัท เริ่มทำงานและคุณพิมพ์คีย์ที่ผูกไว้กับnil สิ่งใดจะเกิดขึ้น นั่นไม่ใช่สิ่งที่คุณคาดหวังเมื่อคุณพิมพ์อักขระ คุณคาดว่าจะใส่ตัวละคร

ค่อนข้างสะดวกกว่าที่จะให้ emacs โทรออกโดยอัตโนมัติcompany-abort จากนั้นแทรกอักขระที่พิมพ์สำหรับคุณ นี่คือทางออกของฉัน:

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

ฉันคิดว่าคุณสามารถขยายเวลานี้ได้อย่างง่ายดายRETโดยการโทร(newline)แทน(insert-char)(แม้ว่าฉันจะไม่ได้ลองเพราะฉันใช้RETเพื่อเลือก)

จริงๆแล้วฉันกำลังใช้use-packageดังนั้นนี่คือสิ่งที่ฉันมีใน init ของฉัน:

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

คุณไม่ควรยกเลิกการเลื่อนลง บริษัท ด้วยตนเองด้วยรหัสที่ฉันให้ไว้ การพิมพ์ไม่ถูกขัดจังหวะโดยสมบูรณ์เว้นแต่คุณจะโต้ตอบกับดรอปดาวน์ผ่าน M-TAB, Cv, Mv, Cs ฯลฯ อย่างผิดปกติมีบางอย่างผิดปกติกับการกำหนดค่าของคุณ (ซึ่งไม่น่าแปลกใจเนื่องจากมีตัวแปร 10 ตัวที่คุณต้องตั้งค่าอย่างถูกต้อง บริษัท ที่จะดำเนินการในลักษณะที่สมเหตุสมผล…)
Radon Rosborough
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.