【问题标题】:GNU Emacs: skeleton-mode, is it still used?GNU Emacs:骨架模式,还在使用吗?
【发布时间】:2010-05-19 15:07:47
【问题描述】:

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

你在用什么,为什么? (也许我可以切换到更流行的工具)。

例如,给定这个 sn-p:

(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

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

干杯

【问题讨论】:

    标签: emacs editor


    【解决方案1】:

    郑重声明:即使再过 7 年,我仍然对骷髅感到非常满意。在我的初始化文件中有很多可用的:https://github.com/ska2342/ska-init-files/blob/master/dot.emacs.d/init.el

    【讨论】:

    • 完全和你在一起。我最近才开始寻找模板系统,而​​骨架看起来是最简单的。它是纯粹的 elisp,它是官方的,而且——结合缩写词——非常容易应用。我不知道 7 年前文档的状态如何,但最新的 Emacs 关于骨架的文档做得很好。
    【解决方案2】:

    我使用yasnippet

    在我的emacs中我有这个:

    (require 'yasnippet-bundle)
    

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

    (yas/minor-mode-on)
    

    我使用的“静态”sn-ps 是可用的,在我使用的目录结构中,这里:

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

    当任何 sn-ps 更改时,您需要创建一次上述的 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 循环的模板。等等。


    我还将 yasn-p 与动态 sn-p 模板一起使用。我编写的 C# 代码完成模块调用 yas/expand-snippet 并使用动态构造的字符串定义要扩展的模板。

    所以,你可以输入

      MyType.Method(<COMPLETE>
    

    ...其中&lt;COMPLETE&gt; 是代码完成键,代码完成模块在 MyType.Method( 上进行查找,然后构建一个选项菜单并将其弹出。当用户选择一个从菜单中选择,代码完成模块构建模板,包含所选方法的每个参数的字段。然后它调用yas/expand-snippet并将该模板注入缓冲区,就像它是一个静态模板一样. 在动态生成的模板中,方法的每个参数都有一个“typeover”字段,我只是填写它,在字段中切换。非常好。

    这种“动态 sn-p”理念适用于任何代码完成引擎。您只需要一种从方法或函数签名进行映射的方法,如下所示:

      function(int arg1, string arg2, char arg3)
    

    到一个 yasn-p 模板定义字符串,如下所示:

      function(${1:int arg1}, ${2:string arg2}, ${3:char arg3}) 
    

    这是一个非常简单的 elisp。

    【讨论】:

    • 相当整洁。我可能会给 Yasn-p 一个尝试,你应该明确地做一个截屏:)
    • 截屏视频怎么样?)
    【解决方案3】:

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

    【讨论】:

    • 您能详细说明一下 yasn-p:它们有什么强大之处?它能做像骨架一样复杂的事情吗?
    • Yasn-p 网站位于 code.google.com/p/yasnippet。它源自 Textmate 的 sn-ps,并使用类似的模板语法。
    • 我不知道骨架。我使用yasn-p。它易于使用:只需在文本文件中指定模板。它是可扩展的:我可以编写由纯文本或 elisp 代码组成的 sn-ps(模板)。它的通用目的:我可以交互触发 sn-p,或者我可以从 elisp 注入 sn-ps - 例如,从完成包中,我可以在符号表中进行查找,然后根据结果,动态注入- 创建包含方法签名的模板。它只是工作。从来没有理由去看骨架。
    • 如果 yasn-p 早先是发明者,我会同意你的看法:D 事实上,skeleton 更老,并且是官方 GNU Emacs 发行版的一部分。这就是我学习它的原因。骨架的最大缺点实际上是它缺乏文献,让人认为它完全是废弃软件——即。几乎没有任何地方提到它,很难分享/询问有关它的东西。现在,如果 yasn-p 提供相同的功能,为什么不试试呢? ;)
    • @Cheeso:您的设置是否在某处公开可用?
    【解决方案4】:

    emacs wiki 将 Yasn-p 列为可能的骨架替代品。 yasn-p 自带的 sn-ps 还不错,但是你真的应该自己写,因为真正的威力就在那儿。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多