gpt4 book ai didi

emacs - 与 AUCTeX 一起使用时,在 $0 后以 % 结尾的 yasnippets 行为很奇怪

转载 作者:行者123 更新时间:2023-12-02 02:21:16 27 4
gpt4 key购买 nike

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

考虑以下片段:

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

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

但是会发生以下情况:
{
% [cursor]
}

我怎样才能让代码片段像我认为的那样运行?

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

最佳答案

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

# 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)))

关于emacs - 与 AUCTeX 一起使用时,在 $0 后以 % 结尾的 yasnippets 行为很奇怪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8069537/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com