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

时间:2010-12-26 13:59:31

标签: 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

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

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

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

干杯,

1 个答案:

答案 0 :(得分:2)

来自Writing snippets

  

亚斯/凹痕线

     

变量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$>
}$>