【问题标题】:Problem writing a snippet containing Emacs Lisp code编写包含 Emacs Lisp 代码的片段时出现问题
【发布时间】:2010-12-26 13:59:31
【问题描述】:

我一直在尝试利用 YASnippet 的一个很酷的特性:编写包含嵌入式 Emacs Lisp 代码的 sn-ps。 rst-mode 有一个 sn-p,它用“=”包围输入的文本,该文本与

中的文本一样长

====

Text

====

基于这个sn-p,我决定稍微修改它(使用Elisp),以便它根据您所处的主要模式排除这三行(我认为这样的sn-p对组织很有用源代码)。所以我写了这个:

${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: 之后的内容有关。如果我添加一个字符,我没有问题(即所有三行在 sn-p 扩展的末尾都正确对齐)。如果我在此字符串后添加一个空格,则未对齐问题仍然存在。

所以我的问题是:你知道有什么方法可以重写这个 sn-p 以免出现这种错位吗?你知道这种行为的根源是什么吗?

干杯,

【问题讨论】:

    标签: emacs elisp code-snippets


    【解决方案1】:

    来自Writing snippets:

    yas/缩进行

    变量 yas/indent-line 控制缩进。它默认绑定为 'auto,这会导致您的 sn-p 根据插入的缓冲区的模式缩进。

    另一个变量 yas/also-auto-indent-first-line,当 non-nil 确实做到这一点时:-)。

    要在您的 sn-p 模板中使用硬编码缩进,请将此变量设置为固定。

    要在 per-sn-p 基础上控制缩进,另请参阅指令 #expand-env: in Writing Snippets。

    为了与早期版本的 YASnippet 向后兼容,您还可以在您的 sn-p 中放置一个 $>,一个 (indent-according-to-mode) 将在那里执行以缩进该行。这仅在 yas/indent-line 设置为 'auto 以外的值时才会生效。

    for (${int i = 0}; ${i < 10}; ${++i})
    {$>
    $0$>
    }$>
    

    【讨论】:

    • 对不起,我错过了!将变量“yas/indent-line”设置为“fixed”完全解决了我的问题。非常感谢陈利维指出这一点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-14
    • 2016-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多