想要在emacs中添加文件头有好几种方法:
- 直接手打
- 使用模板yasnippet
- 使用header2
- 使用内置的package auto-insert
header2可能是最方便的一种自动添加文件头的方式,但我之前使用过,想要自定义自己想要的内容很难,而且白白浪费header2的功能
今天主要说一说emacs内置里auto-insert,使用它在创建文件时自动添加文件头信息
基础使用
直接(auto-insert-mode)
并且设置
(setq auto-insert-query nil) ;; 不提醒
自定义文件头
(setq auto-insert-alist '(((python-mode . "Python program") nil "#!/usr/bin/env python\n" "# -*- coding: utf-8 -*-\n" "# **************************************************************************\n" "# Copyright © " (substring (current-time-string) -4) " " (user-full-name) "\n" "# File Name: " (file-name-nondirectory buffer-file-name) "\n" "# Author: " (user-full-name)"\n" "# Email: " user-mail-address "\n" "# Created: " (format-time-string "%Y-%m-%d %T (%Z)" (current-time)) "\n" "# Last Update: " (format-time-string "%Y-%m-%d %T (%Z)" (current-time)) "\n" "# By: \n" "# Description: \n" "# **************************************************************************\n") ((c-mode . "C program") nil "/**************************************************************************\n" " Copyright © " (substring (current-time-string) -4) " " (user-full-name) "\n" " File Name: " (file-name-nondirectory buffer-file-name) "\n" " Author: " (user-full-name)"\n" " Email: " user-mail-address "\n" " Created: " (format-time-string "%Y-%m-%d %T (%Z)" (current-time)) "\n" " Last Update: \n" " By: \n" " Description: \n" " **************************************************************************/\n" "#include<stdio.h>\n" "#include<string.h>\n") ((sh-mode . "Shell script") nil "#!/bin/bash\n" "# **************************************************************************\n" "# Copyright © " (substring (current-time-string) -4) " " (user-full-name) "\n" "# File Name: " (file-name-nondirectory buffer-file-name) "\n" "# Author: " (user-full-name)"\n" "# Email: " user-mail-address "\n" "# Created: " (format-time-string "%Y-%m-%d %T (%Z)" (current-time)) "\n" "# Last Update: \n" "# By: \n" "# Description: \n" "# **************************************************************************/\n")))
提取文件头公共信息
之前的模板有很多重复的内容,写一个函数把公共的信息提取出来
- 基础信息
(defun maple//insert-string() (concat (make-string 80 ?*) "\n" "Copyright © " (substring (current-time-string) -4) " " (user-full-name) "\n" "File Name: " (file-name-nondirectory buffer-file-name) "\n" "Author: " (user-full-name)"\n" "Email: " user-mail-address "\n" "Created: " (format-time-string "%Y-%m-%d %T (%Z)" (current-time)) "\n" "Last Update: \n" " By: \n" "Description: \n" (make-string 80 ?*)))
- 插入注释信息
<2018-03-16 五>更新:
(defun maple/insert-string(&optional prefix) (replace-regexp-in-string "^" (or prefix comment-start) (maple//insert-string)))
原代码:
(defun maple/insert-string(&optional prefix) (or prefix (setq prefix comment-start)) (mapconcat (lambda (x) (concat prefix x)) (split-string (maple//insert-string) "\n") "\n"))
- 更改模板
(setq auto-insert-alist '(((ruby-mode . "Ruby program") nil "#!/usr/bin/env ruby\n" "# -*- encoding: utf-8 -*-\n" (maple/insert-string) "\n") ((python-mode . "Python program") nil "#!/usr/bin/env python\n" "# -*- coding: utf-8 -*-\n" (maple/insert-string) "\n") ((c-mode . "C program") nil "/*" (string-trim-left (maple/insert-string " ")) "*/\n" "#include<stdio.h>\n" "#include<string.h>\n") ((sh-mode . "Shell script") nil "#!/bin/bash\n" (maple/insert-string) "\n") ((go-mode . "Go program") nil "/*" (string-trim-left (maple/insert-string " ")) "*/\n")))
相关的配置可以在我的github上找到