3

带有百分号的 Yasnippet 片段,以%片段的最后一点结束一行,$0在百分号之前的行为很奇怪,因为光标放在百分号之后而不是之前。我想知道如何避免这种奇怪的行为。

考虑以下代码段:

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

我认为,当它被激活时,它应该{在第一行包含、最后一行}和第二行的位置插入三行,%并将光标%放在第二行之前,如下例所示:

{
[cursor]%
}

但是会发生以下情况:

{
  % [cursor]
}

我怎样才能使片段的行为符合我的想法?

我的猜测是这是由于 AUCTeX 中的某些原因,因为它发生在 AUCTeX 激活但不是在主要模式 Lisp 交互中。

4

1 回答 1

2

它适用于我的配置,但我怀疑它与自动缩进有关(我的配置是高度定制的,因此可能有所不同)。如果添加,您是否仍然看到问题

# 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)。因此,如果光标从错误的位置开始,那么您就知道问题出现在缩进之前,等等。您将不得不为每一行缩进观察它,因此您可能希望关闭除有问题的行之外的缩进 via $>。添加或删除sit-for's 将允许您缩小范围。

(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)))
于 2011-11-14T18:20:37.847 回答