이것은 내가 똑같은 문제에 직면하여 나 자신을 위해 만든 것입니다. 회사 모드의 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>올바른 일 을합니다. 탭을 누르면
- 현재 줄을 들여 쓰기
- 확장 할 야스 니펫이있는 경우 회사 완성을 중단하는 것을 의미하더라도 확장합니다 (약어를 많이 사용하지 않으므로 약어 지원은 아직 없음),
- 회사 완료가 진행중인 경우 선택한 항목으로 완료하십시오.
- 그렇지 않으면 회사를 사용하여 자동 완성을 시작해 봅니다.
- 자동 완성 할 내용이없고 야스 니펫 플레이스 홀더에있는 경우 다음 플레이스 홀더로 건너 뜁니다.
자동 완성 할 기회가 있고 스 니펫 플레이스 홀더에서 현재 편집중인 경우 상황이 모호합니다. 타협으로 C-<tab>다음 자리 표시 자로 바로 건너 뛰었습니다.
적어도 그것을 입력 할 수 있지만 조각의 이름은 회사의 메뉴와의 존재에 나타나지 않는 사실은 ... 탭 키의 동작이 불행하게도, 특히 좋은하지 않습니다 자동 수정을 니펫을 <return>완료를 대신 얻을 대신 스 니펫
tab
forcompany
및C-o
for를 사용 하고 있습니다yasnippet
. 당신이 관심이 있다면 더 설명 할 수 있습니다.