编写包含Emacs Lisp代码的片段时遇到问题

fal*_*sum 5 emacs elisp code-snippets

我一直在尝试使用YASnippet的一个很酷的功能:编写包含嵌入式Emacs Lisp代码的片段.有一个rst模式的片段,用"="围绕输入的文本,这与文本一样长

====

Text

====

基于这个片段,我决定稍微修改它(使用Elisp),以便根据您所处的主要模式注释掉这三行(我认为这样的片段对于组织源代码很有用).所以我写了这个:

${1:`(insert comment-start)`} ${2:$(make-string (string-width text) ?\-)}
$1 ${2:Text}
$1 ${2:$(make-string (string-width text) ?\-)}

$0
Run Code Online (Sandbox Code Playgroud)

除了一个问题之外,这段代码工作得相当好:这三行的缩进混合起来,这取决于我所处的主要模式(例如,在emacs-lisp模式中,第二行和第三行向右移动更多比第一行).

我认为问题的根源可能与${1:第一行上的字符串后面的内容有关.如果我添加一个字符,我没有问题(即,在片段扩展结束时所有三行都正确对齐).如果我在此字符串后面添加一个空格,则错位问题仍然存在.

所以我的问题是:你知道有什么方法可以重写这个片段,以免产生这种错位吗?你知道这种行为的来源是什么吗?

干杯,

Che*_*evy 2

来自写作片段

yas/缩进线

变量 yas/indent-line 控制缩进。默认情况下它绑定到“auto”,这会导致您的代码片段根据插入的缓冲区的模式进行缩进。

另一个变量 yas/also-auto-indent-first-line,当非 nil 时正是这样做的:-)。

要在代码片段模板中使用硬编码缩进,请将此变量设置为固定。

要控制每个代码段的缩进,另请参阅编写代码段中的 #expand-env: 指令。

为了向后兼容早期版本的 YASnippet,您还可以在代码片段中放置 $> ,将在那里执行 (indent-according-to-mode) 来缩进该行。仅当 yas/indent-line 设置为“auto”以外的其他值时,此操作才会生效。

for (${int i = 0}; ${i < 10}; ${++i})
{$>
$0$>
}$>
Run Code Online (Sandbox Code Playgroud)