有百分比符号%的Yasnippet代码段以代码段的最后一点$0结束一行,在百分比符号之前执行奇怪的操作,因为光标被放在百分比符号之后而不是前面。我想知道如何才能避免这种奇怪的行为。
考虑以下片段:
# -*- mode: snippet -*-
# name: test snippet
# key: ts
# --
{
$0%
}我认为,当它被激活时,它应该插入三行,其中第一行包含{,最后一行是},第二行是%,并将光标放在第二行的%前面,如下例所示:
{
[cursor]%
}但所发生的情况如下:
{
% [cursor]
}如何才能使代码片段按照我所认为的那样运行呢?
我的猜测是,这是由于在AUCTeX中发生了某些事情,因为它发生在AUCTeX激活时,而不是在主要模式Lisp交互中。
发布于 2011-11-14 18:20:37
它适用于我的配置,但我怀疑它与自动缩进有关(我的是大量定制的,所以这可能是不同的)。如果添加
# 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。然后像往常一样插入您的代码段,它将在代码中看到(sit-for 1)的每个位置暂停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)))https://stackoverflow.com/questions/8069537
复制相似问题