带有yasnippet的框式注释

问题描述 投票:6回答:3

我正在寻找编写一个yasnippet模板,该模板将允许我向Emacs中的脚本缓冲区添加许可证标头。有点像this,但有所改进:

  1. 标头需要包含每个用户的数据,例如版权所有者的日期名称和电子邮件,可以使用yasnippet的embedded elisp expansion获得。
  2. 根据文件当前所处的编程模式,需要使用语法对标头进行注释。已经有a gist of a snippet that does all that。基本上,这相当于在代码段的末尾嵌入(comment-region (point-min) (point))
  3. 现在,我想将评论样式更改为方框。请参阅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个空格。
  • 如果它基于嵌入点处出现的no文本缩进,则最后的*)应该也到达4个空格late,而不是soon
  • 最后,我不明白最后一行的内容,其中没有无嵌入式代码扩展:通常,我从最后一个简短的段落中得到一个方形注释框没有任何问题行(使用comment-box或此问题的第一个注释块中的elisp函数。

为了避免任何副作用,我尝试将摘要添加到yas/after-exit-snippet-hook中,以替换上面片段的最后一个功能,以免产生任何副作用:

yas/after-exit-snippet-hook

但是那没有帮助。即使这样做了,它也会给我留下一个扩展钩子,该钩子会注释我想在该缓冲区中使用的代码片段,但我当然不希望这样做。我还应该添加,我试图通过添加]来将(add-hook 'yas/after-exit-snippet-hook (let ((comment-style 'box)) (comment-region (point-min) (point))) nil t) 设置为[C0

yas/indent-line

在我的代码片段的开头,但这没有任何改变。关于如何获取

矩形

框的任何想法?

Edit:

我们有fixed(鸣谢,谢谢Seiji!),但是仍然存在一个问题,那就是如何使它适应想要重用字段的情况,例如# expand-env: ((yas/indent-line 'fixed)) 的重用在:a very nice answer, along with a proposed fix,
[在那种情况下,模板引擎在模板扩展时(缩进后)将为字段$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)))`
,也给注释行添加了2个字符)宽。编写模板时,很难预测在这一行应该

remove

4
个字符。也许字段重用和正确的缩进太多,无法同时要求。有没有人看到这样做的方法?我正在寻找一个yasnippet模板,该模板将允许我向Emacs中的脚本缓冲区添加许可证标头。 Kinda像这样,但有所改进:标头需要包含每个用户的数据,例如...
emacs elisp code-snippets
3个回答
5
投票
将您的代码段更改为这一行将修复最后一行。

$1


1
投票
这可能对您有用:

0
投票
这对我有用:

(* Copyright (c) ${1:2011}${1:$(make-string (- 72 (string-width text)) ?\ )} *) (* ${2}${2:$(make-string (- 72 (string-width text)))}*)

© www.soinside.com 2019 - 2024. All rights reserved.