GNU Emacs:skeleton-mode,它还在使用吗?

20

在所有可能的解决方案中,如今人们使用什么来实现GNU Emacs的模板系统?我仍在使用skeleton-mode,但是根据我所读到的,在使用它的人似乎非常少。

你正在使用什么工具以及为什么使用它?(也许我可以转向更受欢迎的工具)。

例如,给定以下代码片段:

(define-skeleton mwe:cl-defpackage-skeleton
  "Inserts a Common Lisp DEFPACKAGE skeleton."
  (skeleton-read "Package: " (if v1
                                 (file-name-sans-extension
                                  (file-name-nondirectory
                                   (buffer-file-name)))))
  (if (setq v1 (bobp)) ";;; -*- Mode:Lisp; Syntax:ANSI-Common-Lisp;")
  & (if buffer-file-coding-system
        (concat " Coding:"
                (symbol-name 
                 (coding-system-get buffer-file-coding-system 
                                    'mime-charset))))
  & " -*-"
  & \n
  & \n "(defpackage #:" str
  \n "(:nicknames" ("Nickname: " " #:" str) & ")" | '(kill-whole-line -1)
  \n "(:use #:CL" ((slime-read-package-name "USEd package: ") " #:" str) ")"
  ")" \n
  \n
  (if v1 "(in-package #:") & str & ")" & \n &
  \n
  _)

(致谢:http://www.foldr.org/~michaelw/log/programming/lisp/defpackage-skeleton

哪种(现代的)模板方式可以做到同样的事情(如何实现呢 ;))?

谢谢!

4个回答

9

1
完全同意您关于Skeleton的看法。我最近才开始寻找模板系统,而Skeleton看起来是最简单的选择。它是纯Elisp编写的,官方支持,并且与缩写结合使用非常容易。我不知道七年前文档的状态如何,但现在更加详细的Emacs Skeleton文档做得很好。 - Mali Remorker

6

我使用yasnippet

在我的emacs中,我有以下内容:

(require 'yasnippet-bundle)

在我想使用代码片段的每种模式的挂钩中(比如我的c-mode挂钩等),我有以下代码:
(yas/minor-mode-on)

我使用的“静态”代码片段可以在我使用的目录结构中找到,链接如下:http://cheeso.members.winisp.net/srcview.aspx?dir=emacs&file=snippets.zip。当任何代码片段发生更改时,您需要创建上述提到的捆绑文件 .el 文件。操作步骤如下:
(require 'yasnippet)
(yas/compile-bundle 
 ; the starting point
 "c:/your/path/yasnippet.el"

 ; the bundle file to generate
 "c:/your/path/yasnippet-bundle.el" 

 ; the snippet dir from which to generate the bundle
 "c:/your/path/snippets")

就是这样!

然后,当我在C#文件中键入for<TAB>时,我会得到一个带有for循环的模板。以此类推。


我还使用具有动态片段模板的yasnippet。我编写的C#代码完成模块通过使用动态构建的字符串调用yas/expand-snippet来定义要展开的模板。

因此,您可以输入

  MyType.Method(<COMPLETE>

...其中<COMPLETE>是代码自动完成键,代码自动完成模块会查找MyType.Method(,然后构建一个选择菜单并弹出。当用户从菜单中选择一个选项时,代码自动完成模块将构建模板,包含所选方法的每个参数的字段。然后它调用yas/expand-snippet,该模板被注入到缓冲区中,就像它是一个静态模板一样。在动态生成的模板中,每个方法参数都有一个“typeover”字段,我只需要通过字段进行填充即可。非常好用。

这个“动态代码片段”的想法适用于任何代码自动完成引擎。您只需要有一种方法来映射方法或函数签名,例如:

  function(int arg1, string arg2, char arg3)

转换为 yasnippet 模板定义字符串,格式如下:
  function(${1:int arg1}, ${2:string arg2}, ${3:char arg3}) 

这只是一个相当琐碎的elisp片段。


1
非常不错。我可能会尝试使用Yasnippet,而且你应该一定要做一个屏幕录像 :) - Xavier Maillard
关于屏幕录像怎么样? - egor7

4

我并没有经常使用骨架模式,但是在编写 Ruby 和 C 代码时我使用 YASnippet。它非常有用,但我怀疑骨架模式更加强大。


你能详细解释一下 yasnippet 的强大之处吗?它能像 skeleton 一样完成复杂的任务吗? - Xavier Maillard
1
Yasnippet网站位于http://code.google.com/p/yasnippet/。 它源自Textmate的代码片段,并使用类似的模板语法。 - Sid Heroor
2
我不知道骨架。我使用yasnippet。它很容易使用:只需在文本文件中指定模板即可。它是可扩展的:我可以编写由纯文本或elisp代码组成的代码片段(模板)。它是通用的:我可以交互式地触发片段,也可以从elisp注入片段 - 例如,从完成包中,我可以在符号表中查找,然后根据结果注入动态创建的包含方法签名的模板。它就是这么简单。从未有过看骨架的理由。 - Cheeso
1
如果yasnippet早些时候就被发明出来了,我会同意你的观点:D 事实上,skeleton更古老,是官方GNU Emacs分发的一部分。这就是为什么我学它的原因。 skeleton最大的缺点确实是缺乏文献资料,让人认为它完全已经停止更新了 -即几乎没有关于它的任何参考资料,并且很难分享或者询问相关问题。既然yasnippet提供了相同的功能,为什么不试试呢?;) - Xavier Maillard
@Cheeso: 你的设置是否在公开的地方可用? - Xavier Maillard
是的,我提供了自己的答案:https://dev59.com/WnE85IYBdhLWcg3wQxLG#2889878 - Cheeso

2

Emacs维基将Yasnippet列为替代skeleton的可能选项。 Yasnippet附带的片段非常好,但您真正的力量在于编写自己的代码片段。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接