ฉันมักจะต้องการขึ้นบรรทัดใหม่ในขณะที่การแนะนำโหมด บริษัท กำลังแสดง ฉันจะตั้งค่าโหมด บริษัท ได้อย่างไรเพียงคีย์แท็บเท่านั้นที่ทำให้เสร็จสมบูรณ์
ฉันมักจะต้องการขึ้นบรรทัดใหม่ในขณะที่การแนะนำโหมด บริษัท กำลังแสดง ฉันจะตั้งค่าโหมด บริษัท ได้อย่างไรเพียงคีย์แท็บเท่านั้นที่ทำให้เสร็จสมบูรณ์
คำตอบ:
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))
การตั้งค่าที่สมบูรณ์ของฉันสำหรับการแก้ไขพฤติกรรมเริ่มต้นที่น่ารำคาญคือ:
;;; 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)
( ลิงก์ไปยังการกำหนดค่าปัจจุบันซึ่งได้รับการปรับปรุงเพิ่มเติม แต่ค่อนข้างซับซ้อนในตอนนี้)
(อัปเดตตามคำถามนี้ )
(define-key company-active-map (kbd "C-RET") #'company-complete-selection)
แต่มันไม่ทำงาน คุณรู้หรือไม่ว่าสิ่งนี้จะเป็นไปได้และจะบรรลุได้อย่างไร
TAB
เพื่อเลือกรายการแรกในรายการโดยไม่จำเป็นต้อง 'โต้ตอบ' แต่เพื่อตอบคำถามของคุณฉันเดิมพันได้ว่าเทอร์มินัลของคุณไม่สามารถส่งC-RET
ได้ ลองC-h k C-RET
และดูว่า Emacs จริงได้รับสัญญาณแทนเพียงC-RET
RET
(define-key company-active-map (kbd "TAB") #'company-complete-common-or-cycle)
แต่ดูเหมือนว่าสิทธิ์ของคุณเมื่อฉันเปลี่ยนเป็นสิ่งอื่นที่ไม่ใช่ C-RET ฉันได้รับพฤติกรรมที่ต้องการ ขอบคุณ
M-p
และM-n
หรือ iSearch พวกเขาด้วยC-s
หรือโดยตรงเลือกผู้สมัครที่มีM-1
ผ่านM-0
(ตัวเลขจะแสดงถ้าคุณตั้งค่าcompany-show-numbers
)
เพิ่งเห็นสิ่งนี้ในขณะที่กำลังมองหาทางออกสำหรับปัญหาเดียวกัน (แม้ว่ากุญแจที่น่ารำคาญสำหรับฉันคือ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)
)
)