Inilah yang saya buat untuk diri saya sendiri, menghadapi masalah yang sama. Ini dari halaman Emacs Wiki mode perusahaan , tetapi sangat diperluas:
(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)
Pada dasarnya, ini membuat <tab>melakukan hal yang benar sebagian besar waktu. Menekan tab akan
- Indentasi baris saat ini,
- Jika ada yasnippet untuk diperluas, perluas, bahkan jika ini berarti membatalkan penyelesaian perusahaan (saya tidak menggunakan banyak singkatan, jadi belum ada dukungan singkatan),
- Jika penyelesaian perusahaan sedang berlangsung, lengkapi dengan item yang dipilih,
- Kalau tidak, coba gunakan perusahaan untuk memulai pelengkapan otomatis,
- Jika tidak ada yang dilengkapi secara otomatis dan kami berada di placeholder yasnippet, lewati ke placeholder berikutnya.
Perhatikan bahwa jika ada peluang untuk pelengkapan otomatis dan saat ini Anda mengedit di tempat penampung cuplikan, situasinya ambigu. Sebagai kompromi, saya terikat C-<tab>untuk langsung beralih ke placeholder berikutnya.
Fakta bahwa nama snippet tidak muncul di menu perusahaan dan keberadaan snippet secara diam-diam mengubah perilaku kunci tab tidak terlalu bagus, sayangnya ... Meskipun setidaknya mungkin untuk mengetik <return>alih-alih mendapatkan penyelesaian sebagai gantinya dari cuplikan.
tab
untukcompany
danC-o
untukyasnippet
. Saya dapat menjelaskan lebih lanjut jika Anda tertarik.