GNU Emacs:骨架模式,还在使用吗?

时间:2010-05-19 15:07:48

标签: emacs editor

考虑到拥有GNU Emacs模板系统的所有可能解决方案,人们今天使用什么?我仍然在使用骨架模式,但是当我在这里和那里阅读时,我们一定很少这样做。

你在用什么?为什么? (也许我可以切换到更受欢迎的工具)。

例如,给定此片段:

(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 个答案:

答案 0 :(得分:5)

我使用yasnippet

在我的emacs中,我有这个:

(require 'yasnippet-bundle)

在我想要使用片段的每个模式的钩子中(比如我的c-mode hook等),我有这个:

(yas/minor-mode-on)

我使用的“静态”代码段在我使用的目录结构中可用,这里:

http://cheeso.members.winisp.net/srcview.aspx?dir=emacs&file=snippets.zip

当任何代码段发生变化时,您需要创建上面提到的bundle .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 :(得分:4)

我没有太多使用骨架模式,但我在Ruby和C编码时使用YASnippet。它非常有用,但我怀疑骨架模式功能强大得多。

答案 2 :(得分:4)

为了记录:即使再过了7年,我仍然对骷髅很满意。我的init文件中有很多可用的文件:https://github.com/ska2342/ska-init-files/blob/master/dot.emacs.d/init.el

答案 3 :(得分:1)

emacs wiki将Yasnippet列为骨架的替代品。与yasnippet一起提供的片段非常好,但你应该写自己的片段,因为真正的力量就在那里。