我希望编写一个yasnippet模板,可以在Emacs的脚本缓冲区中添加许可证头。有点像this,但稍微改进了一下:
- 头部需要包含每个用户的数据,例如版权所有者的日期名称和电子邮件,这些可以通过从yasnippet获取embedded elisp expansion来获得。
- 头部需要根据文件当前所在的编程模式进行语法注释。已经有一个a gist of a snippet that does all that。基本上它相当于将
(comment-region (point-min) (point))
嵌入到你的代码片段的末尾。 - 现在,我想将注释样式更改为框形。请参阅emacs文档中的
comment-style
变量,或者如果您想查看框形注释的样子,只需在活动区域上调用M-x comment-box
:它会使用正确的选项调用comment-region
。
第一种方法是通过修改先前代码片段的结尾来设置样式:
(let ((comment-style 'box))
(comment-region (point-min) (point)))
很不幸,缩进出了问题,我的框不是矩形的。如果我从代码片段开始:
Copyright (c) ${1:`(nth 5 (decode-time))`}
All rights reserved.
Redistribution and use in source and binary forms, with or
without modification, are permitted`
(let ((comment-style 'box))
(comment-region (point-min) (point)))`
该片段的扩展“破坏了框架”(我正在使用ocaml注释语法调试此片段,但这并不重要):
(**************************************************************)
(* Copyright (c) 2010 *)
(* All rights reserved. *)
(* *)
(* Redistribution and use in source and binary forms, with or *)
(* without modification, are permitted *)
(**************************************************************)
- 起初我以为第二行是根据预扩展嵌入代码的大小缩进的,但在这种情况下,它应该使该行的最终
*)
提前25个空格而不是4个。 - 如果根据嵌入点没有任何文本缩进,则最终的
*)
应该晚到4个空格而不是太早。 - 最后,我不明白最后一行发生了什么,其中没有嵌入代码扩展:通常我没有任何问题从具有短末行的段落中获得方形注释框(使用
comment-box
或此问题的第一个评论块中的elisp函数)。
我尝试使注释在片段扩展之后发生,以避免任何副作用,方法是将其添加到yas/after-exit-snippet-hook
中,将上面片段的最后一个函数替换为:
(add-hook 'yas/after-exit-snippet-hook
(let ((comment-style 'box))
(comment-region (point-min) (point))) nil t)
但这并没有帮助。即使有用,它也会留下一个扩展钩子,在该缓冲区中注释所有我想要使用的片段,这是我绝对不想要的。
我还应该补充一点,我尝试将
yas/indent-line
设置为fixed
,通过添加# expand-env: ((yas/indent-line 'fixed))
我在代码片段的开头加了一个 rectangular,但是什么都没改变。有什么办法可以得到一个矩形框吗?
编辑:我们有一个非常好的答案,以及一个建议的修复方法(致敬和感谢,Seiji!),但问题在于如何将其适应于希望重用字段的情况,例如像在以下代码中重用$1
:
Copyright (c) ${1:`(nth 5 (decode-time))`}
All rights reserved.
Redistribution and use in $1, in source and binary forms
`(let ((comment-style 'box))
(comment-region (point-min) (point-at-eol 0)))`
在这种情况下,模板引擎会复制字段
$1
获取的(可变长度)值,即2011
,到最后一行,在模板扩展后(缩进后),产生一个注释行宽度超过2个字符。当编写模板时很难预测应该在该行删除4个字符。也许同时要求字段重用和正确缩进太多了。不过,有人能看到解决方法吗?
yas/after-exit-snipeet-hook
可以在我们看到的文本上工作,那就太好了。然而,它似乎只能在底层文本(例如${1:...}
)上工作。顺便说一下,如果你在# expand-env
中设置钩子,钩子只会影响片段而不是其他片段 --- 通过添加# expand-env: ((yas/after-exit-snippet-hook (list (let ((comment-style 'box))(comment-region (point-min) (point-max) nil)))))
- Seiji Kumagai