yasnippets с%, заканчивающимся строкой после $ 0, странно работает при использовании с AUCTeX - PullRequest
3 голосов
/ 09 ноября 2011

Фрагменты Yasnippet, имеющие знак процента, %, заканчивающийся строкой с последней точкой фрагмента, $0, до того, как знак процента действует странно, поскольку курсор помещается после знака процента, а не перед ним. , Интересно, как мне избежать этого странного поведения?

Рассмотрим следующий фрагмент:

# -*- mode: snippet -*-
# name: test snippet
# key: ts
# --
{
$0%
}

Я так понимаю, что при его активации должен вставить три строки, где первая содержит {, последняя строка } и вторая строка % и поместить курсор перед % во второй строке, как в следующем примере:

{
[cursor]%
}

Но происходит следующее:

{
  % [cursor]
}

Как я могу сделать так, чтобы фрагмент вел себя так, как мне кажется?

Я предполагаю, что это связано с чем-то в AUCTeX, потому что это происходит с активированным AUCTeX, но не в основном режиме Lisp Interaction.

1 Ответ

2 голосов
/ 14 ноября 2011

Это работает правильно с моей конфигурацией, но я подозреваю, что это связано с автоматическим отступом (мой сильно настроен, так что может быть разница). Вы все еще видите проблему, если вы добавляете

# expand-env: ((yas/indent-line 'fixed))

или

# expand-env: ((yas/indent-line t))

к заголовку фрагмента? Вы также можете попробовать добавить $> в строку (и), для которой вы хотите сделать отступ, чтобы увидеть, будет ли это иметь значение (если это приведет к значительному сужению). В коде yasnippet есть примечание о некоторых проблемах с заменой маркеров, но похоже, что это было исправлено несколько лет назад.

Вы также должны проверить, что indent-line-function имеет правильное значение, а именно LaTeX-indent-line.

Вы можете добавить некоторые sit-for к определению yas/indent-according-to-mode, чтобы увидеть, где находится точка на разных этапах. Например, поместите следующее в «чистый» буфер, поместите курсор после его конца и введите C-x C-e. Затем вставьте свой фрагмент как обычно, и он будет останавливаться на 1 секунду каждый раз, когда в коде вы видите (sit-for 1). Таким образом, если курсор начинается не в том месте, то вы знаете, что проблема возникает перед отступом и т. Д. Вам придется просматривать его для каждой строки с отступом, поэтому вы можете отключить отступ за исключением проблемной строки с помощью $>. Добавление или удаление sit-for позволит вам сузить его.

(defun yas/indent-according-to-mode (snippet-markers)
  "Indent current line according to mode, preserving
SNIPPET-MARKERS."
  (sit-for 1)
  (goto-char (yas/real-line-beginning))
  (sit-for 1)
  (let ((trouble-markers (remove-if-not #'(lambda (marker)
                                            (= marker (point)))
                                        snippet-markers)))
    (save-restriction
      (widen)
      (sit-for 1)
      (condition-case err
          (indent-according-to-mode)
        (error (message "[yas] warning: yas/indent-according-to-mode habing problems running %s" indent-line-function)
               nil)))
    (sit-for 1)
    (mapc #'(lambda (marker)
              (set-marker marker (point)))
          trouble-markers)))
...