Emacs自动添加文件头


想要在emacs中添加文件头有好几种方法:

  • 直接手打

  • 使用模板yasnippet

  • 使用header2

  • 使用内置的package auto-insert

header2可能是最方便的一种自动添加文件头的方式,但我之前使用过,想要自定义自己想要的内容很难,而且白白浪费header2的功能

今天主要说一说emacs内置里auto-insert,使用它在创建文件时自动添加文件头信息

基础使用

直接(auto-insert-mode) 并且设置

1(setq auto-insert-query nil) ;; 不提醒

自定义文件头

 1(setq auto-insert-alist
 2      '(((python-mode . "Python program") nil
 3         "#!/usr/bin/env python\n"
 4         "# -*- coding: utf-8 -*-\n"
 5         "# **************************************************************************\n"
 6         "# Copyright © " (substring (current-time-string) -4) " " (user-full-name) "\n"
 7         "# File Name: " (file-name-nondirectory buffer-file-name) "\n"
 8         "# Author: " (user-full-name)"\n"
 9         "# Email: " user-mail-address "\n"
10         "# Created: " (format-time-string "%Y-%m-%d %T (%Z)" (current-time)) "\n"
11         "# Last Update: " (format-time-string "%Y-%m-%d %T (%Z)" (current-time)) "\n"
12         "#          By: \n"
13         "# Description: \n"
14         "# **************************************************************************\n")
15        ((c-mode . "C program") nil
16         "/**************************************************************************\n"
17         " Copyright © " (substring (current-time-string) -4) " " (user-full-name) "\n"
18         " File Name: " (file-name-nondirectory buffer-file-name) "\n"
19         " Author: " (user-full-name)"\n"
20         " Email: " user-mail-address "\n"
21         " Created: " (format-time-string "%Y-%m-%d %T (%Z)" (current-time)) "\n"
22         " Last Update: \n"
23         "           By: \n"
24         " Description: \n"
25         " **************************************************************************/\n"
26         "#include<stdio.h>\n"
27         "#include<string.h>\n")
28        ((sh-mode . "Shell script") nil
29         "#!/bin/bash\n"
30         "# **************************************************************************\n"
31         "# Copyright © " (substring (current-time-string) -4) " " (user-full-name) "\n"
32         "# File Name: " (file-name-nondirectory buffer-file-name) "\n"
33         "# Author: " (user-full-name)"\n"
34         "# Email: " user-mail-address "\n"
35         "# Created: " (format-time-string "%Y-%m-%d %T (%Z)" (current-time)) "\n"
36         "# Last Update: \n"
37         "#          By: \n"
38         "# Description: \n"
39         "# **************************************************************************/\n")))

提取文件头公共信息

之前的模板有很多重复的内容,写一个函数把公共的信息提取出来

  • 基础信息

     1(defun maple//insert-string()
     2  (concat
     3   (make-string 80 ?*)
     4   "\n"
     5   "Copyright © " (substring (current-time-string) -4) " " (user-full-name) "\n"
     6   "File Name: " (file-name-nondirectory buffer-file-name) "\n"
     7   "Author: " (user-full-name)"\n"
     8   "Email: " user-mail-address "\n"
     9   "Created: " (format-time-string "%Y-%m-%d %T (%Z)" (current-time)) "\n"
    10   "Last Update: \n"
    11   "         By: \n"
    12   "Description: \n"
    13   (make-string 80 ?*)))
  • 插入注释信息 <2018-03-16 五>更新:

    1(defun maple/insert-string(&optional prefix)
    2  (replace-regexp-in-string
    3   "^" (or prefix comment-start)
    4   (maple//insert-string)))

    原代码:

    1(defun maple/insert-string(&optional prefix)
    2  (or prefix (setq prefix comment-start))
    3  (mapconcat
    4   (lambda (x) (concat prefix x))
    5   (split-string (maple//insert-string) "\n") "\n"))
  • 更改模板

     1(setq auto-insert-alist
     2      '(((ruby-mode . "Ruby program") nil
     3         "#!/usr/bin/env ruby\n"
     4         "# -*- encoding: utf-8 -*-\n"
     5         (maple/insert-string) "\n")
     6        ((python-mode . "Python program") nil
     7         "#!/usr/bin/env python\n"
     8         "# -*- coding: utf-8 -*-\n"
     9         (maple/insert-string) "\n")
    10        ((c-mode . "C program") nil
    11         "/*"
    12         (string-trim-left (maple/insert-string " ")) "*/\n"
    13         "#include<stdio.h>\n"
    14         "#include<string.h>\n")
    15        ((sh-mode . "Shell script") nil
    16         "#!/bin/bash\n"
    17         (maple/insert-string) "\n")
    18        ((go-mode . "Go program") nil
    19         "/*"
    20         (string-trim-left (maple/insert-string " ")) "*/\n")))

相关的配置可以在我的github上找到

作者: honmaple
链接: https://honmaple.me/articles/2018/01/emacs自动添加文件头.html
版权: CC BY-NC-SA 4.0 知识共享署名-非商业性使用-相同方式共享4.0国际许可协议
wechat
alipay

加载评论