鉴于所有可能的解决方案都有一个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
_)
Run Code Online (Sandbox Code Playgroud)
(学分:http://www.foldr.org/~michaelw/log/programming/lisp/defpackage-skeleton)
哪个(现代)模板模式可以做同样的事情(以及如何;))?
干杯
我用yasnippet.
在我的emacs中我有这个:
(require 'yasnippet-bundle)
Run Code Online (Sandbox Code Playgroud)
在我想要使用片段的每个模式的钩子中(比如我的c-mode hook等),我有这个:
(yas/minor-mode-on)
Run Code Online (Sandbox Code Playgroud)
我使用的"静态"片段在我使用的目录结构中可用,这里:
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")
Run Code Online (Sandbox Code Playgroud)
而已!
然后,当我在C#文件中并输入时for<TAB>
,我得到一个带有for循环的模板.等等.
我还使用yasnippet和动态代码段模板.AC#code-completion module我yas/expand-snippet
使用动态构造的字符串编写调用,该字符串定义要扩展的模板.
所以,你可以输入
MyType.Method(<COMPLETE>
Run Code Online (Sandbox Code Playgroud)
... <COMPLETE>
代码完成键在哪里,代码完成模块在MyType.Method上执行查找(然后构建一个选项菜单,然后弹出它.当用户从菜单中选择一个选项时,代码完成模块构建模板,包含所选方法的每个参数的字段.然后调用yas/expand-snippet
并将该模板注入缓冲区,就像它是一个静态模板一样.在动态生成的模板中,每个该方法的参数得到一个"typeover"字段,我只是填写它,通过字段标签.非常好.
这种"动态代码段"的想法适用于任何代码完成引擎.您只需要一种方法来映射方法或函数签名,如下所示:
function(int arg1, string arg2, char arg3)
Run Code Online (Sandbox Code Playgroud)
到yasnippet模板定义字符串,如下所示:
function(${1:int arg1}, ${2:string arg2}, ${3:char arg3})
Run Code Online (Sandbox Code Playgroud)
这是一个非常微不足道的小调子.
记录:即使再过7年,我仍然对骨骼感到非常满意。我的初始化文件中有很多可用的文件:https : //github.com/ska2342/ska-init-files/blob/master/dot.emacs.d/init.el
归档时间: |
|
查看次数: |
3170 次 |
最近记录: |