Table of Contents
.el なファイルの先頭にあるライセンスとかが書かれているアレをどうにか自動挿入したい。
そもそものアレの名前もわからない。 Library Headers - GNU Emacs Lisp Reference Manual によればヘッダコメントなるものらしい。
ヘッダコメントを自動挿入してくれるツールを探すと以下な記事あり。
EmacsWiki: Automatic File Headers
どうやら Auto Insert Mode なるものがある模様。
以下なマニュアルに、より噛み砕いた説明あり。
Autoinserting - Features for Automatic Typing
Auto Insert Mode お試し
適当に foo.el ファイルを開き M-x auto-insert すると以下な流れに。なお当方の Emacs は GNU Emacs 24.3.1 。
- Short description を訊かれる
一行程度で書くものらしい。お試しで "Support for FOO" と入力してみる。 詳しくは Library Headers - GNU Emacs Lisp Reference Manual にあり。
- Keyword を訊かれる
パッケージを M-x finder-by-keyword で探すときに使われるキーワードとのこと。 適当に "local" と入力しエンター。 詳しくは Library Headers - GNU Emacs Lisp Reference Manual にあり。
なおプロンプトが表示されているときに C-h をタイプすると利用可能と思われるキーワードが表示される。 いつか使うかもしれないので簡単にメモ。
- abbrev: 略記のハンドリング、タイピングショートカット、マクロ
- bib: 参考文献一覧の機構
- c: Cに関するプログラミング言語
- calendar: カレンダとかタイムマネジメントなツール
- comm: 通信、ネットワーク、リモートファイルアクセス
- convenience: より速い編集に便利なもの
- data: テキストでないデータの編集
- docs: Emacs 文献の便宜
- emulations: 他エディタのエミュレーション
- extensions: Emacs Lisp言語の拡張
- faces: テキストのフォントとカラー
- files: ファイルの編集と操作
- frames: Emacsのフレームとウィンドウシステム
- games: ゲーム、ジョーク、娯楽
- hardware: システムハードウェアとのインタフェース
- help: オンラインヘルプシステム
- hypermedia: テキストや他メディアタイプとの結びつけ
- i18n: 国際化とキャラクタセットのサポート
- internal: Emacs内部向けコード、ビルドプロセス、デフォルト
- languages: 言語編集向けの専用モード
- lisp: Emacs Lisp含むLispのサポート
- local: あなたのサイトでのローカルコード
- maint: Emacs 開発ツールおよび支援
- mail: メールの閲読と投稿
- matching: 検索、マッチング、並べ替え
- mouse: マウスサポート
- multimedia: 画像と音楽
- news: USENET ネットニュースの閲読と投稿
- outlines: 階層的なアウトラインとメモ取り
- processes: プロセス、サブシェル、コンパイル
- terminals: テキストターミナル(tty)
- tex: TeX ドキュメントフォーマッタ
- tools: プログラミングツール
- unix: UNIX の機能とのインタフェースとエミュレータ
- vc: バージョン管理
- wp: 文書処理
以上により以下なヘッダコメントが foo.el ファイルに挿入される。
;;; foo.el --- Support for FOO ;; Copyright (C) 2014 Chiyanop ;; Author: chiyanop <chiyanop@local> ;; Keywords: local ;; This program is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation, either version 3 of the License, or ;; (at your option) any later version. ;; This program is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; You should have received a copy of the GNU General Public License ;; along with this program. If not, see <http://www.gnu.org/licenses/>. ;;; Commentary: ;; ;;; Code: (provide 'foo) ;;; foo.el ends here
おしい。 Author の設定どうやるんだろ。あと This file is not part of GNU Emacs. なメッセージも一緒に入ってほしいところ。
Auto Insert Mode のカスタマイズ
結論は以下の設定。これを ~/.emacs.d/init.el とかに書いておくと所望するコメントが挿入されました。
(setq user-full-name "Your name") (setq user-mail-address "Your email address") (eval-after-load 'autoinsert '(setq auto-insert-alist (put-alist '("\\.el\\'" . "Emacs Lisp header") '("Short description: " ";;; " (file-name-nondirectory (buffer-file-name)) " --- " str " ;; Copyright (C) " (format-time-string "%Y") " " (getenv "ORGANIZATION") | (progn user-full-name) " ;; Author: " (user-full-name) '(if (search-backward "&" (line-beginning-position) t) (replace-match (capitalize (user-login-name)) t t)) '(end-of-line 1) " <" (progn user-mail-address) "> ;; Keywords: " '(require 'finder) '(setq v1 (mapcar (lambda (x) (list (symbol-name (car x)))) finder-known-keywords) v2 (mapconcat (lambda (x) (format "%12s: %s" (car x) (cdr x))) finder-known-keywords "\n")) ((let ((minibuffer-help-form v2)) (completing-read "Keyword, C-h: " v1 nil t)) str ", ") & -2 " \;; This file is not part of GNU Emacs. \;; This program is free software; you can redistribute it and/or modify \;; it under the terms of the GNU General Public License as published by \;; the Free Software Foundation, either version 3 of the License, or \;; (at your option) any later version. \;; This program is distributed in the hope that it will be useful, \;; but WITHOUT ANY WARRANTY; without even the implied warranty of \;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the \;; GNU General Public License for more details. \;; You should have received a copy of the GNU General Public License \;; along with this program. If not, see <http://www.gnu.org/licenses/>. \;;; Commentary: \;; " _ " \;;; Code: \(provide '" (file-name-base) ") \;;; " (file-name-nondirectory (buffer-file-name)) " ends here\n") auto-insert-alist)))
以降、設定に至るまでの云々。まずヘッダコメントの雛形はどのように定義されてるのか。
どうやら auto-insert-alist 変数に雛形が保持されているらしく M-x describe-variable して変数の説明を確認することに。
曰く auto-insert-alist は (CONDITION . ACTION) または ((CONDITION . DESCRIPTION) . ACTION) な要素からなるリストで、 CONDITION はファイル名にマッチする正規表現かメジャーモードのお名前、 DESCRIPTION はプロンプトか何かに使われる文字、 ACTION は挿入の骨組みになる部分、とある。
auto-insert-alist の初期値は autoinsert.el に定義されていて内容は以下。 ACTION がどの辺りに該当するのかわかりにくい。
(("\\.el\\'" . "Emacs Lisp header") "Short description: " ";;; " (file-name-nondirectory (buffer-file-name)) " --- " str " ;; Copyright (C) " (format-time-string "%Y") " " (getenv "ORGANIZATION") | (progn user-full-name) " ;; Author: " (user-full-name) '(if (search-backward "&" (line-beginning-position) t) (replace-match (capitalize (user-login-name)) t t)) '(end-of-line 1) " <" (progn user-mail-address) "> ;; Keywords: " '(require 'finder) ;;'(setq v1 (apply 'vector (mapcar 'car finder-known-keywords))) '(setq v1 (mapcar (lambda (x) (list (symbol-name (car x)))) finder-known-keywords) v2 (mapconcat (lambda (x) (format "%12s: %s" (car x) (cdr x))) finder-known-keywords "\n")) ((let ((minibuffer-help-form v2)) (completing-read "Keyword, C-h: " v1 nil t)) str ", ") & -2 " \;; This program is free software; you can redistribute it and/or modify \;; it under the terms of the GNU General Public License as published by \;; the Free Software Foundation, either version 3 of the License, or \;; (at your option) any later version. \;; This program is distributed in the hope that it will be useful, \;; but WITHOUT ANY WARRANTY; without even the implied warranty of \;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the \;; GNU General Public License for more details. \;; You should have received a copy of the GNU General Public License \;; along with this program. If not, see <http://www.gnu.org/licenses/>. \;;; Commentary: \;; " _ " \;;; Code: \(provide '" (file-name-base) ") \;;; " (file-name-nondirectory (buffer-file-name)) " ends here\n")
Autoinserting - Features for Automatic Typing によれば "Short description: " とそれ以降が ACTION にあたるらしい。 記法は Skeleton Language - Features for Automatic Typing によるもの。
さらに Skeleton Language - Features for Automatic Typing によれば "Short description: " はプロンプトに表示される文字で、それより後に続く要素が挿入されていく模様。
要は変数 user-full-name と user-mail-address を設定すればよさそう。 あと This program is… の前の行に This file is not part of GNU Emacs. を挿入してあげればよさげ。
かくかくしかじかで先に説明した設定に至りましたと。
これにて Emacs Lisp なパッケージを量産できるようになるのか。