Aynı mesele ile kendim için yarattığım şey bu. Bu dan şirket modun Emacs Wiki sayfasında , ancak yoğun genişletilmiş:
(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)
Temel olarak, bu çoğu zaman <tab>doğru olanı yapar . Sekmeye basmak
- Geçerli çizgiyi girinti,
- Eğer genişletmek için bir yaylı püskürtü varsa, genişletmek, bu şirketin tamamlanmadığı anlamına gelse bile (kısaltmaları fazla kullanmıyorum, bu nedenle henüz kısaltma desteği yok),
- Bir şirketin tamamlanması sürüyorsa, seçilen öğeyle tamamlayın,
- Aksi takdirde, otomatik tamamlama işlemini başlatmak için şirketi kullanmayı deneyin
- Otomatik tamamlayacak bir şey yoksa ve bir yaylacı yer tutucusuysak, bir sonraki yer tutucusuna atlayın.
Otomatik tamamlama fırsatı varsa ve şu anda bir snippet yer tutucusunda düzenleme yapıyorsanız, durumun belirsiz olduğunu unutmayın. Bir uzlaşma olarak, C-<tab>doğrudan bir sonraki yer tutucuya atlamak zorunda kaldım.
Snippet'in adının şirket menüsünde görünmemesi ve bir snippet'in varlığı sekme tuşunun davranışını sessizce değiştirmesi aslında hoş değil, ne yazık ki ... En azından <return>tamamlanmak yerine yazmak mümkün olsa da snippet'in
tab
içincompany
veC-o
içinyasnippet
. İlgileniyorsan daha fazla tarif edebilirim.