使用模板启动扩展名为.c的任何Emacs缓冲区

时间:2009-01-11 16:50:44

标签: emacs templates

我写了很多短暂的一次性程序,我发现自己反复做的一件事就是键入代码

#include <stdio.h>
#include <stdlib.h>

int main(void){

}

为了保存一些肌腱命中,我想知道每当我创建一个扩展名为.c的缓冲区时,是否可以插入一个简单的模板。

9 个答案:

答案 0 :(得分:18)

.emacs

中加入这样的内容
(define-skeleton c-throwaway
  "Throwaway C skeleton"
  nil
  "#include <stdio.h>\n"
  "#include <stdlib.h>\n"
  "\n"
  "int main(void){\n"
  "\n"
  "}\n")

和eval(C-x C-e)它。那会给你一个 插入模板的函数(c-throwaway)。

要自动插入,您需要激活 auto-insert-mode。完成此操作后,您可以describe-variable auto-mode-alist阅读有关emacs如何打开其中的内容 文件魔术。然后定义auto-insert-alist以便在您使用时应用它 找到一个新文件。

也许是这样的

(define-auto-insert "\\.\\([Cc]\\|cc\\|cpp\\)\\'" 'c-throwaway)

更多细节:

答案 1 :(得分:10)

我使用http://emacs-template.sourceforge.net/

中的template.el

基本上,我创建一个名为〜/ .templates / TEMPLATE.c的文件,然后将其插入到我的.c文件中。如果您不想将文本转储到缓冲区,也可以使用特殊标记和任意lisp表达式。我使用此功能,以便当它们命名为lib / Foo / Bar.pm时,Perl模块以“package Foo :: Bar”开头。非常方便。

答案 2 :(得分:4)

以下函数将询问文件名,然后插入文件并更改为c-mode。唯一的问题是你必须调用这个函数来创建缓冲区,而不是你的正常方式。

(defun defaultCtemplate(cfilename)
    (interactive "sFilename: ")
    (switch-to-buffer (generate-new-buffer cfilename))
    (insert-file-contents "~/Desktop/test.c")
    (c-mode)
)

P.S感谢您提出这个问题,现在我知道如何为自己做这件事:)

答案 3 :(得分:4)

您还可以将YASnippet template system用于Emacs,它只有一个名为main的内置模板。因此,在编写代码时,只需键入main,然后点击TAB,它就会将其扩展为您想要的格式。 (并且您始终可以编写自己的代码段模板。)

答案 4 :(得分:1)

这个问题很老,但这可能对某人有所帮助。查看this site,我将此部分复制并粘贴到我的.emacs文件中:

;; automatic insertion of templates
(require 'autoinsert)
(auto-insert-mode)  ;;; Adds hook to find-files-hook
(setq auto-insert-directory "~/Documents/Emacs/templates/") ;;; *NOTE* Trailing slash important
;;(setq auto-insert-query nil) ;;; If you don't want to be prompted before insertion
(define-auto-insert "\.tex" "my-latex-template.tex")
(define-auto-insert "\.cpp" "my-cpp-template.cpp")
(define-auto-insert "\.h" "my-cpp-template.h")

更改目录和文件名后,它可以完美运行。

答案 5 :(得分:0)

我使用following code从模板创建文件。有几个模板,它们是实际文件名的替代品等

答案 6 :(得分:0)

我是这样做的(因为我不知道自动插入模式: - )

(require 'tempo)

(setq c-new-buffer-template 
      '(
        "#include <stdio.h>\n"
        "#include <stdlib.h>\n"
        "\n"
        "int main(void){\n"
        "\n"
        "}\n"
        ))

(defun my-c-style ()
  "My editing style for .c files."
  (c-mode)
  (if (zerop (buffer-size))
      (tempo-template-c-skeleton)))

(setq auto-mode-alist
      (cons '("\\.c\\'" . my-c-style) auto-mode-alist))

(tempo-define-template "c-skeleton" c-new-buffer-template
               nil
               "Insert a skeleton for a .c document")

答案 7 :(得分:0)

我使用Defaultcontent.elYASnippet.el的组合。前者用默认内容填充全新文件。后者是一种轻量级代码宏的东西。键入“for”并命中TAB并插入for循环的骨架。等等。您可以非常轻松地定义自己的代码段。 “swi TAB”为您提供完整的切换声明。等等。

答案 8 :(得分:0)

yasnippet擅长扩展文件中的模板,并且很容易创建代码段。 自动插入擅长用模板填充新文件,但编写自己的模板很难。有一个很好的包yatemplate填补了YASnippet和自动插入模式之间的空白,我可以用YASnippet编写自动插入规则。