gpt4 book ai didi

emacs - 带有 yasnippet 的框式注释

转载 作者:行者123 更新时间:2023-12-03 15:57:25 28 4
gpt4 key购买 nike

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

  • header 需要包含每个用户的数据,例如版权所有者的日期名称和电子邮件,
    可以通过 yasnippet 的 embedded elisp expansion 获得。
  • 需要根据文件当前所处的编程模式使用语法对 header 进行注释。已经有 a gist of a snippet that does all that 。基本上,它相当于在代码段末尾嵌入 (comment-region (point-min) (point))
  • 现在, 我想将评论样式更改为框 。请参阅 comment-style 变量的 emacs 文档,或者,如果您想查看框式注释的外观,只需在事件区域​​上调用 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 ,或此问题的第一个评论 block 中的 elisp 函数。

  • 我尝试在片段扩展之后进行注释,以避免任何副作用,将其添加到 yas/after-exit-snippet-hook ,将上面片段的最后一个函数替换为:
    (add-hook 'yas/after-exit-snippet-hook
    (let ((comment-style 'box))
    (comment-region (point-min) (point))) nil t)

    但这没有帮助。即使这样做了,它也会给我留下一个扩展钩子(Hook),它将注释 所有 我想在该缓冲区中使用的片段,这是我当然不想要的。

    我还应该补充一点,我尝试将 yas/indent-line 设置为 fixed ,通过添加
    # expand-env: ((yas/indent-line 'fixed))

    在我的片段的开头,但这并没有改变任何东西。关于如何获得 矩形 框的任何想法?

    编辑: 我们有 a very nice answer, along with a proposed fix,(感谢并感谢 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 个字符。也许字段重用和正确的缩进要求太多了。不过,有没有人看到一种方法来做到这一点?

    最佳答案

    将您的代码段更改为此代码段可以修复最后一行。

    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-at-eol 0)))`

    请注意,许可证(“...是允许的”)和嵌入式 emacs lisp 代码之间有一个换行符。

    至于第二行,我将首先解释为什么会发生这种情况,然后提供一个(丑陋的)修复。当您的代码段插入到文件中时,嵌入的 lisp block 会从缓冲区的开头到结尾依次进行评估。这在您的代码段中意味着 (nth 5 (decode-time))已被 2011 取代当下一个区 block 时, (comment-region ...) , 被评估。

    结果, comment-region将第二行视为
    Copyright (c) ${1:2011}

    所以, comment-region为这个字符串放置足够的空格。然后,模板引擎转换 ${1:2011}进入 2011 ,并且这种转换将字符串缩短了 5 个字符。这解释了 *) 的过早出现。第二行的 5 个字符。

    解决这种情况的一种方法是在 comment-region 之后放回 5 个空格。被评估---类似于:
    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-at-eol 0)))``
    (replace-string "@" " " nil (point-min) (point))`$0

    关于emacs - 带有 yasnippet 的框式注释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4563788/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com