emacs смарт-таб с yasnippets

Опитвам се да завърша раздела във всички отворени буфери и yasnippet, за да работят и с клавиша tab. В момента мога да имам едното или другото. Следният код е как се справям с разширяването на yasnippet, но тъй като не съм програмист на lisp, не виждам грешката тук.

Ако не може да разшири фрагмента, бих искал да опита да разшири от буфера.

;; Auto complete settings / tab settings
;; http://emacsblog.org/2007/03/12/tab-completion-everywhere/ <-- in the comments
(global-set-key [(tab)] 'smart-tab)
(defun smart-tab ()
  "This smart tab is minibuffer compliant: it acts as usual in
    the minibuffer. Else, if mark is active, indents region. Else if
    point is at the end of a symbol, expands it. Else indents the
    current line."
  (interactive)
  (if (minibufferp)
      (unless (minibuffer-complete)
        (dabbrev-expand nil))
    (if mark-active
        (indent-region (region-beginning)
                       (region-end))
      (if (looking-at "\\_>")
          (unless (yas/expand)
            (dabbrev-expand nil))
        (indent-for-tab-command)))))

person map7    schedule 27.11.2012    source източник


Отговори (1)


Първо, опитвам се да разбера какво прави кодът и какво бихте искали да прави.

Вашият код

  • first checks ако точката е в the minibuffer.

    • Ако е така, тогава се опитва да завърши минибуфера

      • if (in minibuffer) cannot complete it, it calls dabbrev-expand
  • иначе, ако точката е not in minibuffer

    • ако някой регион е маркиран, той отстъпва региона.

    • ако no mark is active, той проверява дали точката е в end of some word

      • ако е така, той проверява дали yasnippet може да се разшири.

        • if yas cannot expand, it calls dabbrev-expand
      • ако не, той се опитва да отстъпи текущия ред

Това прави вашият код.

Вашият код е неуспешен поради yas/expand. Тази команда не се връща в случай, че разширяването е неуспешно.

В случай, че тази команда е неуспешна, тя проверява състоянието на променливата yas/fallback-behavior. Ако тази променлива има стойност call-other-command, както във вашия случай, неуспешното разширяване на yas извиква командата, свързана с ключа, съхраняван в променливата yas/trigger-key.

Във вашия случай тази променлива е TAB.

И така: Вие сте в края на думата, натискате TAB, за да я завършите, това задейства интерактивния smart-tab, който извиква yas/expand, който в случай, че не успее да разшири, извиква обвързаната функция на TAB, и тук е безкрайният цикъл.

Решението на вашия проблем е временно да обвържете nil to yas/fallback-behavior в тази smart-tab функция.

Ето как да го поправите:

(if (looking-at "\\_>")
      (let ((yas/fallback-behavior nil))
        (unless (yas/expand)
          (dabbrev-expand nil)))
    (indent-for-tab-command))
person alinsoar    schedule 01.01.2013
comment
В момента, ако не успее да се разшири с yasnippet, тогава получавам грешката „Дълбочината на променливото свързване надвишава max-specpdl-size“ и не се разширява с помощта на dabbrev-expand - person map7; 01.01.2013