यह वही है जो मैंने अपने लिए बनाया था, उसी मुद्दे का सामना कर रहा हूं। यह कंपनी-मोड के 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 प्लेसहोल्डर में हैं, तो अगले प्लेसहोल्डर पर जाएं।
ध्यान दें कि यदि स्वत: पूर्ण होने का अवसर है और आप वर्तमान में स्निपेट प्लेसहोल्डर में संपादन कर रहे हैं, तो स्थिति अस्पष्ट है। एक समझौते के रूप में, मैं C-<tab>सीधे अगले प्लेसहोल्डर को छोड़ना चाहता हूं ।
तथ्य यह है कि स्निपेट का नाम कंपनी मेनू में नहीं दिखता है और एक स्निपेट का अस्तित्व चुपचाप संशोधित करता है टैब कुंजी का व्यवहार विशेष रूप से अच्छा नहीं है, दुर्भाग्य से ... हालांकि कम से कम इसके <return>बजाय टाइप करना संभव है ताकि पूरा होने के बजाय स्निपेट का।
tab
के लिएcompany
औरC-o
के लिएyasnippet
। यदि आप रुचि रखते हैं तो मैं आगे वर्णन कर सकता हूं।