นี่คือสิ่งที่ฉันสร้างขึ้นสำหรับตัวฉันเองเผชิญกับปัญหาเดียวกัน มันมาจากหน้า Emacs Wiki ของโหมด บริษัทแต่ได้ขยายออกไปอย่างมาก:
(defun check-expansion ()
(save-excursion
(if (looking-at "\\_>") t
(backward-char 1)
(if (looking-at "\\.") t
(backward-char 1)
(if (looking-at "->") t nil)))))
(defun do-yas-expand ()
(let ((yas/fallback-behavior 'return-nil))
(yas/expand)))
(defun tab-indent-or-complete ()
(interactive)
(cond
((minibufferp)
(minibuffer-complete))
(t
(indent-for-tab-command)
(if (or (not yas/minor-mode)
(null (do-yas-expand)))
(if (check-expansion)
(progn
(company-manual-begin)
(if (null company-candidates)
(progn
(company-abort)
(indent-for-tab-command)))))))))
(defun tab-complete-or-next-field ()
(interactive)
(if (or (not yas/minor-mode)
(null (do-yas-expand)))
(if company-candidates
(company-complete-selection)
(if (check-expansion)
(progn
(company-manual-begin)
(if (null company-candidates)
(progn
(company-abort)
(yas-next-field))))
(yas-next-field)))))
(defun expand-snippet-or-complete-selection ()
(interactive)
(if (or (not yas/minor-mode)
(null (do-yas-expand))
(company-abort))
(company-complete-selection)))
(defun abort-company-or-yas ()
(interactive)
(if (null company-candidates)
(yas-abort-snippet)
(company-abort)))
(global-set-key [tab] 'tab-indent-or-complete)
(global-set-key (kbd "TAB") 'tab-indent-or-complete)
(global-set-key [(control return)] 'company-complete-common)
(define-key company-active-map [tab] 'expand-snippet-or-complete-selection)
(define-key company-active-map (kbd "TAB") 'expand-snippet-or-complete-selection)
(define-key yas-minor-mode-map [tab] nil)
(define-key yas-minor-mode-map (kbd "TAB") nil)
(define-key yas-keymap [tab] 'tab-complete-or-next-field)
(define-key yas-keymap (kbd "TAB") 'tab-complete-or-next-field)
(define-key yas-keymap [(control tab)] 'yas-next-field)
(define-key yas-keymap (kbd "C-g") 'abort-company-or-yas)
โดยทั่วไปทำให้นี้<tab>ทำสิ่งที่ถูกต้องมากที่สุดของเวลา กดแท็บจะ
- เยื้องบรรทัดปัจจุบัน
- หากมี yasnippet ที่จะขยายให้ขยายแม้ว่านี่จะหมายถึงการยกเลิกความสำเร็จของ บริษัท (ฉันไม่ได้ใช้ตัวย่อมากนักดังนั้นจึงไม่มีการสนับสนุนตัวย่อ)
- หากความสมบูรณ์ของ บริษัท ดำเนินต่อไปให้ทำตามรายการที่เลือก
- มิฉะนั้นลองใช้ บริษัท เพื่อเริ่มการเติมข้อความอัตโนมัติ
- หากไม่มีการเติมข้อความอัตโนมัติและเราอยู่ในตัวยึดตำแหน่ง yasnippet ให้ข้ามไปที่ตัวยึดตำแหน่งถัดไป
โปรดทราบว่าหากมีโอกาสที่จะเติมข้อความอัตโนมัติและคุณกำลังแก้ไขตัวยึดตัวอย่างข้อมูลสถานการณ์จะคลุมเครือ ในฐานะที่เป็นผู้ประนีประนอมฉันจึงต้องC-<tab>ข้ามไปที่ตัวยึดตำแหน่งถัดไปโดยตรง
ความจริงที่ว่าชื่อของตัวอย่างไม่ปรากฏในเมนู บริษัท และการมีอยู่ของตัวอย่างการปรับเปลี่ยนพฤติกรรมของแท็บคีย์ไม่ดีโดยเฉพาะอย่างยิ่งน่าเสียดายที่ ... แม้ว่าอย่างน้อยก็เป็นไปได้ที่จะพิมพ์<return>แทนเพื่อให้เสร็จสมบูรณ์แทน ของตัวอย่าง
tab
สำหรับcompany
และสำหรับC-o
yasnippet
ฉันสามารถอธิบายเพิ่มเติมหากคุณสนใจ