我一直在尝试使用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
除了一个问题之外,这段代码工作得相当好:这三行的缩进混合起来,这取决于我所处的主要模式(例如,在emacs-lisp-mode中,第二行和第三行移动更多在右边比第一行)。
我认为问题的根源可能与第一行中字符串${1:
之后的内容有关。如果我添加一个字符,我没有问题(即,在片段扩展结束时所有三行都正确对齐)。如果我在此字符串后面添加一个空格,则错位问题仍然存在。
所以我的问题是:你知道有什么方法可以重写这个片段,以免产生这种错位吗?你知道这种行为的来源是什么吗?
干杯,
答案 0 :(得分:2)
亚斯/凹痕线
变量yas / indent-line控制缩进。它默认为'auto',这会导致您的代码段根据插入的缓冲区模式缩进。
另一个变量yas / also-auto-indent-first-line,当非nil完全相同时: - )。
要在代码段模板中使用硬编码缩进,请将此变量设置为固定。
要在每个片段的基础上控制缩进,请参阅编写片段中的指令#expansion-env:
为了向后兼容早期版本的YASnippet,您还可以放置$>在你的代码片段中,将在那里执行(缩进 - 按模式)缩进行。这仅在yas / indent-line设置为'auto。
以外的其他值时生效
for (${int i = 0}; ${i < 10}; ${++i})
{$>
$0$>
}$>