emacs smart-tab с yasnippets

Я пытаюсь завершить вкладку во всех открытых буферах, и yasnippet работает с клавишей табуляции. На данный момент я могу иметь и то, и другое. В следующем коде показано, как я обрабатываю расширение yasnippet, но, поскольку я не программист на Лиспе, я не вижу здесь ошибки.

Если он не может расширить фрагмент, я бы хотел, чтобы он попытался расшириться из буфера.

;; 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, я получаю сообщение об ошибке «Глубина привязки переменной превышает максимальный размер спецификации», и он не расширяется с помощью dabbrev-expand. - person map7; 01.01.2013