轻轻松松为源程序增加文件头信息

安装 header.el

google download header.el 下载 header.el . 按照 Emacs 安装一个扩展包的方法 安装.

(require 'header)

配置 header.el

这是一个很灵活的扩展,几乎可以生成任何文件头信息. header.el 太灵活了,以至于我无法描述他的所有功能.总之他可以输出任意格式 的信息.

当我们保存文件的时候,有很多信息可以自动更新.如何自动更新信息, 更新那些信息,也是可以完全自己配置. 包括文件名称,最后一次修改 时间,文件保存次数,最后一次修改的作者等等.

(setq make-header-hooks '(header-mode-line
                            header-blank
                            header-file-name
                            header-blank
                            header-copyright
                            header-blank
                            header-rcs
                            header-author
                            header-creation-date
                            header-modification-author
                            header-modification-date
                            header-update-count
                            header-blank
                            header-history
                            header-blank
                            ))

然后就可以用 M-x make-header 自动生成文件头信息. 生成的结果 如下:


//  -*- C++ -*-
//
// a.cc -
//
// Copyright (C) 1994 Karsten Thygesen (karthy@kom.auc.dk).
//
//
//
// $Locker:  $
// $Log: EmacsSourceCodeHeader.muse,v $
// Revision 1.1  2006-04-26 08:55:10  chunywan
// Initial revision
//
// Revision 1.1.1.1  2004/10/20 07:24:06  chunyewang
// this is my home page.
//Revision 1.1  2001/02/01 20:15:57  lassenye filer
// Author          : ChunYe Wang
// Created On      : Thu Jul 15 16:51:14 2004
// Last Modified By: ChunYe Wang
// Last Modified On: Wed Apr 26 12:15:21 2006
// Update Count    : 36
//
// HISTORY
//

如果想修改版权信息可以.

(setq header-copyright-notice " Copyright (C) 2999 your Company or Name " )

我自己配置了一个比较复杂的东西,但是可能对别人没有 太多用处, 因为很多信息都是公司特有的东西.我还是把 他贴出来,希望对读者有些启发.

(require 'header)
(defvar wcy-header-project-name "XXXXXX")
(defun wcy-c-mode-config-header ()
  (interactive)
  (setq header-copyright-notice "

   (c) 2002 XXXX.LtD
   XXX(CHINA) INVESTMENT CO.,LTD.
   addr: XXX House 1, No.1211 He Ping Li Dong Jie, Beijing, 100013 PRC
   tel : int +86-10-xxxx  Ext. xxxx
   fax : int +86-10-xxxx

   The program may be used and/or copied only with the written
   permission of Nokia or in accordance with the terms and conditions
   stipulated in the agreement/contract under which the program heve
   been supplied.

")
  (make-local-variable 'user-full-name)
  (make-local-variable 'user-mail-address)
  (setq user-full-name "ChunYe Wang")
  (setq user-mail-address "")

  (setq  make-header-hooks '(header-mode-line
                             header-blank
                             ;;header-rcs
                             ;;header-AFS
                             wcy-header-file-name
                             wcy-header-project-name
                             wcy-header-file-description
                             header-creation-date
                             ;;header-rcs
                             header-author
                             wcy-header-author-email
                             ;;header-modification-author
                             ;;header-modification-date
                             ;;header-update-count
                             header-blank
                             header-copyright
                             header-blank

                             ;;header-status
                             ;; Re-enable the following lines if you wish
                             header-blank
                             ;;header-history
                             ;;header-purpose
                             ;;header-toc
                             header-blank
                             wcy-header-end-comment

                             ))
  (setq file-header-update-alist nil)
  (progn
    (register-file-header-action "[ \t]Update Count[ \t]*: "
                                 'update-write-count)
    (register-file-header-action "[ \t]Last Modified By[ \t]*: "
                                 'update-last-modifier)
    (register-file-header-action "[ \t]Last Modified On[ \t]*: "
                                 'update-last-modified-date)
    (register-file-header-action " File            : *\\(.*\\) *$" 'wcy-update-file-name)
    ))


(defun wcy-header-file-name ()
  "Places the buffer's file name and leaves room for a description."
  (insert header-prefix-string "File            : " (buffer-name) "\n")
  (setq return-to (1- (point))))
(defun wcy-header-project-name ()
  (insert header-prefix-string "Program/Library : " wcy-header-project-name "\n"))
(defun wcy-header-file-description()
  (insert header-prefix-string "Description     : \n"))
(defun wcy-header-author-email ()
  (insert header-prefix-string "Mail            : " user-mail-address "\n"))

(defun wcy-header-end-comment ()
  (if comment-end
      (insert  comment-end "\n")))
(defun wcy-update-file-name ()
  (beginning-of-line)
  ;; verify that we are looking at a file name for this mode
  (if (looking-at
       (concat (regexp-quote (header-prefix-string)) "File            : *\\(.*\\) *$"))
      (progn
        (goto-char (match-beginning 1))
        (delete-region (match-beginning 1) (match-end 1))
        (insert (file-name-nondirectory (buffer-file-name)) )
        )))