Я решил это с помощью своей настраиваемой функции my-tab с кодом, написанным Филом.Я привязываю клавишу tab к my-tab, она отправит необработанную вкладку в режиме term-char и в других случаях завершит работу, также две быстрые вкладки выполнят yas-expand, связав yas-next-field с "Mn" , завершение табуляции даже работает внутри расширения фрагмента.
Проблема в том, что когда компания и yasnnipet имеют один и тот же префикс, тогда вкладка выполняет только завершение. Можно ли установить время задержки для завершения компании после нажатия клавиши табуляции, сделать его больше, чем тайм-аут my-double-key-timeout, так что двойная вкладка сделает расширение yas, если пользователь хочет завершить компанию, он может просто набрать одну вкладку и ждать. (соврал с сижу за)
Я не знаю, почему я не могу просто связать вкладку, чтобы отправить необработанную вкладку в term-raw-map.
(defvar my-double-key-timeout 0.25
"The number of seconds to wait for a second key press.")
(defun my-tab ()
"Move to the beginning of the current line on the first key stroke,
and to the beginning of the buffer if there is a second key stroke
within `my-double-key-timeout' seconds."
(interactive)
(let ((last-called (get this-command 'my-last-call-time)) )
(is-term (string= "term-mode" major-mode)))
(if (and is-term (term-in-char-mode))
(term-send-raw-string "\t")
(if (and (eq last-command this-command)
last-called
(<= (time-to-seconds (time-since last-called))
my-double-key-timeout))
(yas-expand)
(if (sit-for my-double-key-timeout)
(complete-indent-fold)))
(put this-command 'my-last-call-time (current-time))))
(defun complete-indent-fold()
(interactive)
(if (looking-at outline-regexp)
(if (equal major-mode 'org-mode) (org-cycle) (my-outline-cycle))
(if (looking-at "\\_>") (company-complete) (indent-for-tab-command))))
Пожалуйста, помогите мне сделать это лучше. Спасибо!