[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

37. テンプレートと更新時刻の入力 (2007/12/19)

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=meadow&node=template"
"MeadowMemo/テンプレートと更新時刻の入力"へのコメント(無し)


この章で紹介していること



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

37.1 更新時間を自動で入力 ― time-stamp (2004/02/03)

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=meadow&node=time-stamp"
"MeadowMemo/更新時間を自動で入力―time-stamp"へのコメント(無し)

お勧め度:★★★★★.これはよく使う.標準機能か関数を使うかは,用途による.標準 機能の方が,モードによりカスタマイズしやすい.

標準機能と関数を紹介します.

37.1.1 Meadow に付属の time-stamp (2004/02/03)   
37.1.2 time-stamp を入力する関数 (2003/09/27)   
37.1.3 現在の時刻を入力 (2004/02/01)   
37.1.4 複数の書式で日付けを入力 ― instamp (2004/02/01)   



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

37.1.1 Meadow に付属の time-stamp (2004/02/03)

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=meadow&node=meadow%20time-stamp"
"MeadowMemo/Meadowに付属のtime-stamp"へのコメント(無し)

何が問題なのか?

ファイルに

Time-stamp: <2003 年/09 月/27 日>
更新時刻 "2003 年/09 月/27 日 22 時 28 分 50 秒"

のように更新時刻を入れたい時があります.しかし,これらの書式はモードによってばら ばらなのが普通です.

しかし,そのたびに毎回手で入力するのは面倒すぎます.

何ができるのか?

ファイルに更新時刻を自動で入力できます.

インストール方法

Meadow に付属しています.

どうやって動くのか

更新時刻の挿入は time-stamp.el で行います.

これがどのように動くのかを理解すると,設定が分かりやすくなりますので,説明してお きます.

ただし,以降の説明はあくまで概念です.実際に Elisp がそうなっているわけではありま せん.

設定すべき項目

基本的な動作を追うと分かるように,設定すべきものは

です.

開始/終了文字の設定

開始/終了文字を正規表現で指定します.

例えば

Time-stamp: <2003/09/27 22:26:04>

であれば,

 
(setq time-stamp-start "Time-stamp:[ \t]*<")
(setq time-stamp-end ">")

となります.「 [ \t]+ 」 はスペースかタブが 0 回以上繰り返されていることを意味します. 要はスペースがあってもなくても関係ないようにしています.

「 Time-stamp:」の部分を変えれば,開始文字は好きに変更できますし, 「 time-stamp-start 」と「 time-stamp-end 」の「<>」を変更すれば,更新時刻の前後の文 字も自由に変更できます.

更新時刻の書式

まずはサンプルです

 
(setq time-stamp-format "%:y 年/%02m 月/%02d 日 %02H 時%02M 分%02S 秒")

これで,「 2003 年/09 月/27 日 22 時 28 分 50 秒」という書式になります.日付であ れば,これを参考に編集すれば簡単に書くことができます.

対応させれば分かるように「%」で始まる部分がそれぞれ書式になっています.例えば 「%:y 」で「 2003 」のような年を出力でき,「%02m 」で「 09 」のような月になります.

「%:y 」と「%02m 」は書式が違いますね.「%:m 」でいいのでは? と感じるかもしれませ ん.これはその通りで,「%:m 」のように「 02 」を「:」に変えても動作します.ただし, 出力は少し違い,「%02m 」では「 09 」に,「%:m 」では「 9 」になります.

つまり,「 02 」は桁数を表しているのです.そして,「 0 」の部分は空いた部分を「 09 」 のように 0 で埋めることを意味しています.これを「%2m 」とすると, 1 桁の時には空いた 部分はスペースになります.

以降で他の書式についても簡単に説明しておきます.

更新時刻の自動挿入

ここまでで指定すべき 3 つの変数は設定できると思います.設定したら,早速ファイルの 先頭に

Time-stamp: <>

のように指定した書式を入れてみましょう.そして,M-x time-stampとします.こ れで,タイムスタンプが挿入されます.

しかし,これでは毎回コマンドを入力する必要があり面倒です.そこで,以下を.emacs に 追加します.

 
(if (not (memq 'time-stamp write-file-hooks))
    (setq write-file-hooks
          (cons 'time-stamp write-file-hooks)))

これで,ファイルを保存するだけで,タイムスタンプを変更してくれます.

モード毎に書式を変えたい

まず12.2 フックの意味と探し方 (2004/01/24)を参考にフックを探します.そして,

 
 (add-hook 'yahtml-mode-hook
           '(lambda ()
              (setq time-stamp-start "Time-stamp:[ \t]+<")
              (setq time-stamp-end ">")
              (setq time-stamp-format "%:y 年/%02m 月/%02d 日")
              ))

のように探したフック (例では yahtml-mode-hook) に対して設定を行います.

ファイル毎に書式を変えたい

ファイルの末尾に

@c Local Variables:
@c time-stamp-start: "Time-stamp:[ \t]+<"
@c time-stamp-end: ">"
@c time-stamp-format: "%:y 年/%02m 月/%02d 日 %:S"
@c buffer-file-coding-system: euc-jp
@c End:

のように追加します.これは Texinfo の例です.

テキストファイルなら

Local Variables:
time-stamp-start: "Time-stamp:[ \t]+<"
time-stamp-end: ">"
time-stamp-format: "%:y 年/%02m 月/%02d 日 %:S"
buffer-file-coding-system: euc-jp
End:

HTML なら







という風に適当に変える必要があります.

カスタマイズ

動作を追うと不満な点は 2 箇所でしょうか.

書式をもっと変更したい

書式は

 
(setq time-stamp-format
   '(time-stamp-yyyy/mm/dd time-stamp-hh:mm:ss))

のようにも指定できます.「 time-stamp-yyyy/mm/dd 」という部分は関数名で, 「 time-stamp.el 」内で

 
(defun time-stamp-yyyy/mm/dd ()
  "Return the current date as a string in \"YYYY/MM/DD\" form."
  (format-time-string "%Y/%m/%d"))

のように定義されてます.単純ですね.

例えば,

 
(defun time-stamp-japanese-a ()
  "Return a day of the week"
  (let ((aw (string-to-number (format-time-string "%w" (current-time)))))
    (cond
     ((= aw 0)
      "日曜日")
     ((= aw 1)
      "月曜日")
     ((= aw 2)
      "火曜日")
     ((= aw 3)
      "水曜日")
     ((= aw 4)
      "木曜日")
     ((= aw 5)
      "金曜日")
     ((= aw 6)
      "土曜日"))))


(setq time-stamp-format
      '(time-stamp-yyyy/mm/dd time-stamp-hh:mm:ss
                              time-stamp-japanese-a))

「 2003/09/28 16:43:08 日曜日」という書式になります.関数が書ける人であれば,あ りとあらゆる書式を設定できます.

format-time-string の書式は 時刻の変換 が参考になります.



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

37.1.2 time-stamp を入力する関数 (2003/09/27)

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=meadow&node=myfunc%20time-stamp"
"MeadowMemo/time-stampを入力する関数"へのコメント(無し)

何ができるのか?

$Lastupdate: 2004/02/01 10:00:33 $

という行があれば探して, 更新時間を書き換えてくれます.

設定方法

以下を.emacs に追加します.

フォーマットは適当に変更できます.

 
(defvar my-save-buffer-hook nil)
(defun save-buffer-wrapper ()
  (interactive)
  (let ((tostr (concat "$Lastupdate: " (format-time-string "%Y/%m/%d %k:%M:%S") " $")))
    (save-excursion
        (goto-char (point-min))
        (while (re-search-forward
                "\\$Lastupdate\\([0-9/: ]*\\)?\\$" nil t)
          (replace-match tostr nil t)))
    (run-hooks 'my-save-buffer-hook)
    (save-buffer)))

(global-set-key "\C-x\C-s" 'save-buffer-wrapper)



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

37.1.3 現在の時刻を入力 (2004/02/01)

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=meadow&node=time%20string"
"MeadowMemo/現在の時刻を入力"へのコメント(無し)

何ができるのか?

特に自動でなくて構わないが,特定の書式で時間を入力したいという場合には自分で作る のが簡単です.

設定方法

簡単なサンプルは以下のようになります.

 
(defun my-insert-time ()
  (interactive)
  (insert (concat
           "Time:" (format-time-string "%H:%M:%S"))))

詳しい使い方

上記を.emacs に追加して,M-x my-insert-time とすると,

Time:20:15:12

のように現在時刻が入力されます.日付けの入力や時刻の書式を変えたい場合には, 「%H:%M:%S 」の部分を変更します.

書式に関しては, マニュアルの書式の変換が参考になります.

現在時刻を挿入するコマンド

上記のことを使うと,以下のようなコマンドを作ることができます.

これで

C-x T → Sat Aug 02 12:55:42 2003
C-u C-x T → 2003 年 8 月 02 日 12 時 55 分 55 秒 (土曜日)

という風に時刻が挿入されます.

 
;;; -*- Emacs-Lisp  ; Coding: iso-2022-jp -*-
;; Masatake YAMATO ;; Insert current time string;;
;; C-x T でこんな風に: Thu Apr 25 09:58:35 1996
;; C-u C-x T で日本語で: 1996 年 4 月 25 日 09 時 58 分 52 秒 (木曜日)
;; な風に現在時刻が入ります。
;;
;; 日本語に変換する時に current-time-string を分解しているので,
;; そこを変えればお好みのスタイルに加工できると思います。
(define-key ctl-x-map "T" 'insert-time)
(defun insert-time (arg)
  "Insert current time.
With prefix argumet ARG, insert current time string in Japanese."
  (interactive "P")
  (if arg
      (insert (current-time-japanese-string))
    (insert (current-time-string))))
(defun current-time-japanese-string ()
  "Return the current time, as a human-readable JAPANESE string."
  (let ((base (current-time-string))
        (time-j-table
         '(("Jan" . "1") ("Feb" . "2") ("Mar" . "3")
           ("Apr" . "4") ("May" . "5") ("Jun" . "6")
           ("Jul" . "7") ("Aug" . "8") ("Sep" . "9")
           ("Oct" . "10") ("Nov" . "11") ("Dec" . "12")
           ("Mon" . "月") ("Tue" . "火") ("Wed" . "水")
           ("Thu" . "木") ("Fri" . "金") ("Sat" . "土")
           ("Sun" . "日")))
        jadotw jmonth jday jhour jmin jsec jyear
        last)
    (string-match
       (mapconcat
        (lambda (f) f)
        '(
          "\\([a-zA-Z]+\\)\\W+"
          "\\([a-zA-Z]+\\)\\W+"
          "\\([0-9]+\\)\\W+"
          "\\([0-9]+\\):\\([0-9]+\\):\\([0-9]+\\)"
          "\\W+\\([0-9]+\\)"
          ) "")
     base)
    (setq jadotw (substring base (match-beginning 1) (match-end 1)))
    (setq jmonth (substring base (match-beginning 2) (match-end 2)))
    (setq jday (substring base (match-beginning 3) (match-end 3)))
    (setq jhour (substring base (match-beginning 4) (match-end 4)))
    (setq jmin (substring base (match-beginning 5) (match-end 5)))
    (setq jsec (substring base (match-beginning 6) (match-end 6)))
    (setq jyear (substring base (match-beginning 7) (match-end 7)))
    (setq last (concat jyear "年 "))
    (setq last (concat last (cdr (assoc jmonth time-j-table)) "月 "))
    (setq last (concat last jday "日 "))
    (setq last (concat last jhour "時 "))
    (setq last (concat last jmin "分 "))
    (setq last (concat last jsec "秒 "))
    (setq last (concat last "(" (cdr (assoc jadotw time-j-table)) "曜日)"))
    last))



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

37.1.4 複数の書式で日付けを入力 ― instamp (2004/02/01)

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=meadow&node=instamp"
"MeadowMemo/複数の書式で日付けを入力―instamp"へのコメント(無し)

要約

日付けや時刻を設定しておいた書式で入力できます.

情報源

作者様の日記より.

何が問題なのか?

日付けや時刻を入力したくなる時があります.他で紹介した方法を使うこともできますが, これらの方法では書式を変更するために毎回ソースを変更する必要があります.

何ができるのか?

4-2-1 (Sun)
2/1 (Sun)
2004/2/1

などの書式で日付けを入力できます.しかも,これらの書式は簡単に切り替えることがで きます.

インストール方法

instamp.elをダウンロード してロードパスの通ったところに置きます.

設定方法

以下を.emacs に追加します.キーバインドは好みに合わせて変更してください.

 
(autoload 'instamp
  "instamp" "Insert TimeStamp on the point" t)
(define-key global-map "\C-cs" 'instamp)

詳しい使い方

C-cs で日付けを入力できます.その直後にC-nC-p とすると,書式 を変更することができます.一度ある書式で入力すると,次回にはC-csとするだけ で,その書式が呼び出されます.また,C-cs後にz とすると,「 2004/2/1 (日) 」が「 2004/02/01 (日) 」のようになります.



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

37.2 テンプレート機能 (2007/12/19)

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=meadow&node=new%20file"
"MeadowMemo/テンプレート機能"へのコメント(無し)

ファイルを新規に作る時などに便利なものを紹介します.

37.2.1 多彩なテンプレート機能 ― autoinsert (2004/02/01)   
37.2.2 定型文を選択して入力   



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

37.2.1 多彩なテンプレート機能 ― autoinsert (2004/02/01)

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=meadow&node=autoinsert"
"MeadowMemo/多彩なテンプレート機能―autoinsert"へのコメント(無し)

ワードなどでは,テンプレート機能があります.これは,共通の部分だけを書いたファイ ルを用意しておき,自動的に挿入する機能です.

Meadow にもこの機能があります.ただし,もっと多彩なことができるようになっています.

まずは,共通の設定項目です.以下を入れておくと,テンプレートがあれば,自動的に挿 入するようになります.

 
;; テンプレートの保存先
(setq auto-insert-directory "~/insert/")
(auto-insert-mode 1)
;; テンプレート挿入時に尋ねない
;; デフォルトは 'function
(setq auto-insert-query nil)

それでは,テンプレートの指定方法を紹介します.

37.2.1.1 指定したファイルを挿入する (2003/02/24)   
37.2.1.2 対話的にテンプレートを挿入 (2004/02/01)   
37.2.1.3 テンプレートとして関数を設定 (2003/02/24)   



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

37.2.1.1 指定したファイルを挿入する (2003/02/24)

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=meadow&node=autoinsert%20normal"
"MeadowMemo/指定したファイルを挿入する"へのコメント(無し)

最も基本的なテンプレート機能です.

機能は単純で,指定したファイルをそのまま挿入するというものです.

これは,以下のように設定します.

 
(setq auto-insert-alist
      (append
       '(
         ;; モード名で指定
         (yahtml-mode . "test.html")
         ;; ファイル名で指定
         ("\\.html$" . "test.html")
         )
       auto-insert-alist))

そして,「~/insert/test.html 」を作成しておきます.これで, HTML を編集する時には自 動的に,テンプレートファイル「~/insert/test.html 」を挿入してくれるようになります.

モードや名前に応じて設定しておくと非常に便利です.



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

37.2.1.2 対話的にテンプレートを挿入 (2004/02/01)

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=meadow&node=autoinsert%20rec"
"MeadowMemo/対話的にテンプレートを挿入"へのコメント(無し)

さて,テンプレートファイルによるテンプレートも便利なのですが,

といった不満があると思います.その場合,ファイルによるテンプレートでは,変更箇所 を探して,編集する必要があり少し面倒です.

そこで,少し複雑になりますが,以下のようなテンプレートを使います.

 
(setq auto-insert-alist
  (append
   '(
     (yahtml-mode
      "\n"
      "\n"
      "\n"
      ""</span> (read-string <span style="color:#ffa07a;">"タイトル: "</span>) <span style="color:#ffa07a;">"\n"</span>
      <span style="color:#ffa07a;">"<meta http-equiv="content-type" content="text/html; charset=utf-8">\n"</span>
      <span style="color:#ffa07a;">"</head>\n"</span>
      <span style="color:#ffa07a;">"<BODY BGCOLOR=\"#"</span> (read-string <span style="color:#ffa07a;">"背景色: "</span>) <span style="color:#ffa07a;">"\""</span>
      <span style="color:#ffa07a;">" TEXT=\"#"</span> (read-string <span style="color:#ffa07a;">"文字色: "</span>)<span style="color:#ffa07a;">"\">\n\n"</span>
      <span style="color:#ffa07a;">"メールアドレス:"</span>
      (concat user-mail-address)
     <span style="color:#ffa07a;">"\n\n</span>\n"
      <span style="color:#ffa07a;">"</html>\n"</span>)
     )
   auto-insert-alist))
</pre>
      </td>
    </tr>
  </table>
  <p>見ての通り,基本的には文字を「""」で括っているだけです.ただし,「"」を入力した い時には,「\"」,改行は「\n 」とします.「\」は「\\」,タブは「\t 」になります.</p>
  <p>また,この中で関数を使うこともできます.</p>
  <p></p>
  <table>
    <tr>
      <td> </td>
      <td class="example">
        <pre>(read-string <span style="color:#ffa07a;">"タイトル: "</span>)
</pre>
      </td>
    </tr>
  </table>
  <p>などとしているのが,いい例でしょう.</p>
  <p>これは,ここまでテンプレートを挿入すると,ミニバッファ に「タイトル: 」と表示し,ユーザに文字入力を求めます.そして,入力された文字を, そこへ入れることができます.こういう風にファイルによって変わる文字も簡単にテンプ レートとして扱うことができます.</p>
  <p>また,メールアドレスは「 user-mail-address 」という変数で設定されていますので,</p>
  <p></p>
  <table>
    <tr>
      <td> </td>
      <td class="example">
        <pre>(concat user-mail-address)
</pre>
      </td>
    </tr>
  </table>
  <p>とすると,指定した箇所にメールアドレスを入力できます.</p>
  <p><a name="autoinsert%20func"></a></p>
  <hr size="6">
  <br>
  <a name="SEC553" id="SEC553"></a>
  <table cellpadding="1" cellspacing="1" border="0">
    <tr>
      <td valign="middle" align="left">[ <a href="meadow_37.html#SEC552"><</a> ]</td>
      <td valign="middle" align="left">[ <a href="meadow_37.html#SEC554">></a> ]</td>
      <td valign="middle" align="left"> </td>
      <td valign="middle" align="left">[ <a href="meadow_37.html#SEC549"><<</a> ]</td>
      <td valign="middle" align="left">[ <a href="meadow_37.html#SEC550">Up</a> ]</td>
      <td valign="middle" align="left">[ <a href="meadow_37.html#SEC554">>></a> ]</td>
      <td valign="middle" align="left"> </td>
      <td valign="middle" align="left"> </td>
      <td valign="middle" align="left"> </td>
      <td valign="middle" align="left"> </td>
      <td valign="middle" align="left">[<a href="meadow.html#SEC_Top">表紙</a>]</td>
      <td valign="middle" align="left">[<a href="meadow_toc.html#SEC_Contents">目次</a>]</td>
      <td valign="middle" align="left">[<a href="meadow_69.html#SEC951">索引</a>]</td>
      <td>[検索] [<a href="#top">上端</a> / <a href="#bottom">下端</a>] [?]</td>
    </tr>
  </table>
<a name="autoinsert%20func"></a>
  <h4>37.2.1.3 テンプレートとして関数を設定 <em>(2003/02/24)</em>
</h4>
  <div class="info">
    URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=meadow&node=autoinsert%20func"<br>
    "MeadowMemo/テンプレートとして関数を設定"へのコメント(無し)
  </div>
  
  <p>ここまでの機能ではまだ満足できない.もっと自由に設定したいという人は,自分で関数 を書くといいでしょう.</p>
  <p>設定はこんな風にします.</p>
  <p>この例は単純な例ですが,用途に応じて自由に書くことができるので,どんなテンプレー トでも作ることができます.</p>
  <p></p>
  <table>
    <tr>
      <td> </td>
      <td class="example">
        <pre>(setq auto-insert-alist
      (append
       '(
         <span style="color:#ff7f24;">;; ファイル名が「 time 」に一致したら,
</span>         <span style="color:#ff7f24;">;; my-date を実行する
</span>         (<span style="color:#ffa07a;">"time"</span> . my-date)
         )
       auto-insert-alist))

(<span style="color:#00ffff;">defun</span> <span style="color:#87cefa;">my-date</span> ()
  (insert (format-time-string <span style="color:#ffa07a;">"%D"</span> (current-time))))
</pre>
      </td>
    </tr>
  </table>
  <p><a name="my-template" id="my-template"></a></p>
  <hr size="6">
  <br>
  <a name="SEC554" id="SEC554"></a>
  <table cellpadding="1" cellspacing="1" border="0">
    <tr>
      <td valign="middle" align="left">[ <a href="meadow_37.html#SEC553"><</a> ]</td>
      <td valign="middle" align="left">[ <a href="meadow_38.html#SEC555">></a> ]</td>
      <td valign="middle" align="left"> </td>
      <td valign="middle" align="left">[ <a href="meadow_37.html#SEC550"><<</a> ]</td>
      <td valign="middle" align="left">[ <a href="meadow_37.html#SEC549">Up</a> ]</td>
      <td valign="middle" align="left">[ <a href="meadow_38.html#SEC555">>></a> ]</td>
      <td valign="middle" align="left"> </td>
      <td valign="middle" align="left"> </td>
      <td valign="middle" align="left"> </td>
      <td valign="middle" align="left"> </td>
      <td valign="middle" align="left">[<a href="meadow.html#SEC_Top">表紙</a>]</td>
      <td valign="middle" align="left">[<a href="meadow_toc.html#SEC_Contents">目次</a>]</td>
      <td valign="middle" align="left">[<a href="meadow_69.html#SEC951">索引</a>]</td>
      <td>[検索] [<a href="#top">上端</a> / <a href="#bottom">下端</a>] [?]</td>
    </tr>
  </table>
<a name="my-template" id="my-template"></a>
  <h3>37.2.2 定型文を選択して入力</h3>
  <div class="info">
    URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=meadow&node=my-template"<br>
    "MeadowMemo/定型文を選択して入力"へのコメント(無し)
  </div>
  
  <div class="comment">
    要約
  </div>
  <p>あらかじめ設定しておいた文章などを簡単に入力できます.</p>
  <p></p>
  <div class="comment">
    情報源
  </div>
  <p>2ちゃんねる</p>
  <p></p>
  <div class="comment">
    何が問題なのか?
  </div>
  <p>よく入力する文章やコードなどがあります.レジスタなどを使えば,こうした文章などを 貼り付けることはできますが,どこに何をコピーしたか覚えておかなければなりません.</p>
  <p></p>
  <div class="comment">
    何ができるのか?
  </div>
  <p>あらかじめ指定しておいた文章などのリストが表示され,そのリストから選択して挿入で きます.</p>
  <p></p>
  <div class="comment">
    設定済みMeadowでは
  </div>
  <p>設定していません.</p>
  <p></p>
  <div class="comment">
    設定方法
  </div>
  <p>以下を .emacs に追加します.</p>
  <p></p>
  <table>
    <tr>
      <td> </td>
      <td class="example">
        <pre>(<span style="font-weight:bold;color:#00ffff;">defvar</span> <span style="color:#eedd82;">my-template-text-file</span> <span style="color:#f0e68c;">"~/.template"</span>)
(<span style="font-weight:bold;color:#00ffff;">defvar</span> <span style="color:#eedd82;">my-template-buffer</span> nil)
(<span style="font-weight:bold;color:#00ffff;">defvar</span> <span style="color:#eedd82;">my-template-point</span> nil)

(<span style="font-weight:bold;color:#00ffff;">defun</span> <span style="font-weight:bold;color:#ffff00;">my-template-insert</span> ()
  (interactive)
  (<span style="font-weight:bold;color:#00ffff;">let</span> (content)
    (<span style="font-weight:bold;color:#00ffff;">when</span> (setq
           content
           (get-text-property (point) <span style="font-weight:bold;color:#00ffff;">:content</span>))
      (<span style="font-weight:bold;color:#00ffff;">save-excursion</span>
        (set-buffer my-template-buffer)
        (<span style="font-weight:bold;color:#00ffff;">save-excursion</span>
          (goto-char my-template-point)
          (insert content))))))

(<span style="font-weight:bold;color:#00ffff;">defun</span> <span style="font-weight:bold;color:#ffff00;">my-template-select</span> ()
  (interactive)
  (<span style="font-weight:bold;color:#00ffff;">let</span> ((buffer
         (get-buffer-create <span style="color:#f0e68c;">"*select template*"</span>))
        templates begin template-map text)
    (setq my-template-buffer (current-buffer)
          my-template-point  (point))
    (<span style="font-weight:bold;color:#00ffff;">unless</span> (file-readable-p my-template-text-file)
      (<span style="font-weight:bold;color:#ffc0cb;">error</span> <span style="color:#f0e68c;">"Couldn't read template file: %s"</span>))
    (<span style="font-weight:bold;color:#00ffff;">with-temp-buffer</span>
      (insert-file-contents my-template-text-file)
      (goto-char (point-min))
      (<span style="font-weight:bold;color:#00ffff;">while</span> (re-search-forward <span style="color:#f0e68c;">"^\\*</span><span style="color:#f0e68c;">\\</span><span style="color:#f0e68c;">(</span><span style="color:#f0e68c;">.*</span><span style="color:#f0e68c;">\\</span><span style="color:#f0e68c;">)</span><span style="color:#f0e68c;">$"</span> nil t)
        (<span style="font-weight:bold;color:#00ffff;">when</span> begin
          (setq templates
                (cons
                 (cons
                  (car templates)
                  (buffer-substring
                   begin (1- (match-beginning 0))))
                 (cdr templates))))
        (setq templates (cons (match-string 1) templates))
        (setq begin (1+ (match-end 0))))
      (<span style="font-weight:bold;color:#00ffff;">when</span> begin
        (setq templates
              (cons
               (cons
                (car templates)
                (buffer-substring begin (point-max)))
               (cdr templates)))))
    (pop-to-buffer buffer)
    (setq buffer-read-only nil
          major-mode       'template-select-mode
          mode-name        <span style="color:#f0e68c;">"Select Template"</span>
          template-map     (make-keymap))
    (suppress-keymap template-map)
    (define-key template-map <span style="color:#f0e68c;">" "</span>    'my-template-insert)
    (define-key template-map <span style="color:#f0e68c;">"\C-m"</span> 'my-template-insert)
    (define-key template-map <span style="color:#f0e68c;">"n"</span>    'next-line)
    (define-key template-map <span style="color:#f0e68c;">"p"</span>    'previous-line)
    (define-key template-map <span style="color:#f0e68c;">"q"</span>    'kill-buffer-and-window)
    (use-local-map template-map)
    (buffer-disable-undo)
    (delete-region (point-min) (point-max))
    (<span style="font-weight:bold;color:#00ffff;">dolist</span> (tt templates)
      (setq text (concat (car tt) <span style="color:#f0e68c;">"\n"</span>))
      (put-text-property
       0 (length text) <span style="font-weight:bold;color:#00ffff;">:content</span> (cdr tt) text)
      (insert text)
      (goto-char (point-min)))
    (delete-region (1- (point-max)) (point-max))
    (setq buffer-read-only t)
    (set-buffer-modified-p nil)))
</pre>
      </td>
    </tr>
  </table>
  <p></p>
  <div class="comment">
    詳しい使い方
  </div>
  <p>入力したい文章を my-template-text-file で指定したファイル(デフォルトは ~/.template )に入力します.</p>
  <p>例えば以下のように.</p>
  <p></p>
  <div class="meadow">
    <pre><span style="">*</span><span style="">あいさつ</span>
こんにちは・・・・

<span style="">*</span><span style="">おわび</span>
このたびは・・・の件につき御迷惑をおかけてして・・・
</pre>
  </div>
  <p>「*」で始まる行が名前になり,それ以外が入力される文章となります.</p>
  <p>こうしておいて,<kbd>M-x my-template-select</kbd> とすると,別ウィンドウに</p>
  <p></p>
  <div class="meadow">
    <pre>あいさつ
おわび
</pre>
  </div>
  <p>と表示されます.</p>
  <p>で,例えば,「あいさつ」にカーソルをあわせて<kbd>RET</kbd>とすると,その名前の文章が 入力されます.</p>
  <p><kbd>q</kbd> でそのバッファは閉じることができます.</p>
  <p><a name="make%20memo"></a></p>
  <hr size="6">
  <table cellpadding="1" cellspacing="1" border="0">
    <tr>
      <td valign="middle" align="left">[ <a href="meadow_37.html#SEC550"><<</a> ]</td>
      <td valign="middle" align="left">[ <a href="meadow_38.html#SEC555">>></a> ]</td>
      <td valign="middle" align="left"> </td>
      <td valign="middle" align="left"> </td>
      <td valign="middle" align="left"> </td>
      <td valign="middle" align="left"> </td>
      <td valign="middle" align="left"> </td>
      <td valign="middle" align="left">[<a href="meadow.html#SEC_Top">表紙</a>]</td>
      <td valign="middle" align="left">[<a href="meadow_toc.html#SEC_Contents">目次</a>]</td>
      <td valign="middle" align="left">[<a href="meadow_69.html#SEC951">索引</a>]</td>
      <td>[検索] [<a href="#top">上端</a> / <a href="#bottom">下端</a>] [?]</td>
    </tr>
  </table>
<a name="bottom" id="bottom"></a> 
  <script type="text/javascript" src="style2.js"></script>
  <div class="footer">
    <br>
    このページはMeadow (Emacs) の紹介ページです<br>
    このWebページの各文書は自由にリンク・複製・再配布・改変していただいて構いません.<br>
    ただし,複製・再配布・改変の場合は Meadow Memo のURLを記載しておいて下さい.<br>
    Medow memoへのリンクについて.<br>
    
    <br>
    <br>
    <a href="/cgi-bin/xct.cgi">ページ別カウンタ</a><br>
    Since 2002/12/13<br>
  </div>
</body>
</html>