What's new

log-mode

log-mode とは、議事の log などを取るためのemacs のマイナーモードです。

マイナーモードなので、例えば text-mode等と併用することができます。

インストール

インストール方法は簡単です。 load-path の通ったディレクトリに log-mode.el を置き、 ~/.emacs に
         (autoload 'log-mode  "log-mode" nil t)
      
と書くだけです。

カスタマイズ1

インデントに応じた文字列をカスタマイズすることも可能です。
インデントのカスタマイズは log-mode-indent-prefix-list という変数を 定義することで行います。
たとえば、~/.emacs に
        (setq log-mode-indent-prefix-list  [
                "  * "         ; level 1
                "    + "       ; level 2
                "      - "     ; level 3
                "        # "   ; level 4
                ])
      
こんな感じで書いておきます。

カスタマイズ2

バッファの先頭に日付や著者の情報を挿入することができますが、 挿入する文字列をカスタマイズすることができます。
カスタマイズに使う変数は、log-mode-header-format と log-mode-header-value です。

log-mode-header-format は、format関数で使用するフォーマット文字列で す。
log-mode-header-value は、format関数に与える変数をリストにしたもので す。

log-mode-header-value に使える symbol は以下の表の通りです。

symbol名説明
year4桁の西暦 (ex. 2000)
month月(1〜12)
day日(1〜31)
hour時間(0〜23)
min分(0〜59)
sec秒(0〜59)
Jweek曜日("日"〜"土")
Week曜日("Sun"〜"Sat")
Month月("Jan"〜"Dec")
TZタイムゾーン(ex. "JST")
Usernameユーザ名
Mailaddrメールアドレス


symbol名の頭が大文字のものは文字列ですので、log-mode-header-format では %s を使ってください。
頭が小文字のものは数値ですので %d を使ってください。

例.
    (setq log-mode-header-format 
	"日付: %d年 %d月 %d日 (%s曜日)\n記録者: %s (%s)\n\n")
    (setq log-mode-header-value '(year month day Jweek Username Mailaddr))
	  
結果.
       日付: 2000年 1月 9日 (日曜日)
       記録者: Christopher Robin (chris@izawa.sh)
	  

使い方

log-mode に入るには、
        M-x log-mode
    
を実行します。
モードラインに 『ログ取り君1号』が表示されれば、log-modeに入っていま す。
もう一度実行すると、log-modeから抜けます。

log-modeのキーバインドは以下の表のようになっています。
PowerPointのアウトラインモードと同じキーバインドですので、馴染みやす いと思います。

キーバインド効果
TABインデントに応じたprefixを自動表示します。
続けて押すとインデントが進みます。
Shift+TABインデントが戻ります。
RETURN改行し、前行と同じprefixを自動的につけます。
M-RETURN単に改行します。
C-cC-aバッファの先頭に日付や著者の情報を挿入します。


Tips

hookを使う。
log-mode には、3つのhook が用意されています。
log-mode-hook
log-modeがonになったときに呼ばれるhook。

例えば、log-mode-indent-prefix-list を kfill の prefix-tableに登録する場合には、log-mode-hook を用いると簡単 です。

ちなみに、kfill.el はこちら。

(add-hook 'log-mode-hook
'(lambda ()
(let ((len (length log-mode-indent-prefix-list))
      (i 0))
  (while (< i len)
    (progn
      (pushnew (cons (regexp-quote (aref log-mode-indent-prefix-list i))
                     'kfill:hanging-list)
               kfill:prefix-table)
      (setq i (1+ i)))))))

log-mode-off-hook
log-modeがoffになったときに呼ばれるhook。

例えば、log-mode-indent-prefix-list を kfill の prefix-tableから削除する場合には、log-mode-off-hook を用いると簡単 です。
(add-hook 'log-mode-off-hook
'(lambda ()
(let ((len (length log-mode-indent-prefix-list))
      (i 0)
      (tmp-list kfill:prefix-table))
  (while (< i len)
    (progn
      (setq tmp-list (remassoc (regexp-quote (aref log-mode-indent-prefix-list i)) tmp-list))
      (setq i (1+ i))))
  (setq kfill:prefix-table tmp-list))))

log-mode-insert-header-hook
ヘッダのインサートが行われた直後に呼ばれるhook。

例えば、ヘッダ挿入時に独自の情報を挿入する場合に使うと便利で す。
以下の例は、議題の入力をユーザに促し、入力された議題をバッファ の先頭に挿入します。
(add-hook 'log-mode-insert-header-hook '(lambda () (interactive)
  (save-excursion
   (goto-char 1)
   (insert (concat "Subject: "(read-string "Subject: " ) "\n")))))



トラブルシューティング

[Q.1] Shift TAB が効かないようなのですが。
[A.1] X のイベントがうまく出ていないためだと思われます。
解決方法は xmodmap を使って TAB の keysymを変更することです。 (武智さんに感謝。)

      .xmodmap に keysym  Tab = Tab ISO_Left_Tab を追加する。
     あるいは、
      xmodmap -e "keysym  Tab = Tab ISO_Left_Tab" を実行する。
	  
[Q.2] ヘッダの挿入時に、Username や Mailaddr が "Your Full Name" や "you@your.domain" になってしまうのですが。
[A.2] お使いのemacsでは user-mail-address() や user-full-name() を使えないようです。
log-mode-user-full-name にあなたのユーザ名を、 log-mode-user-mail-address にあなたのメールアドレスを設定してください。

例.
        (setq log-mode-user-full-name "井澤 ゆきみつ")
        (setq log-mode-user-mail-address "izawa@izawa.sh")
	  
この方法は、user-mail-address() や user-full-name()で得られる値を、上書きしたい場合にも有効です。


[Q.3] ヘッダの挿入時に、"Symbol's function definition is void: mapcar*" といわれてしまうのですが。
[A.3] お使いのemacsでは mapcar*() を使えないようです。
cl.el をロードするように設定してください。

例.
        (load "cl.el")
	  
このときに、"Cannot open load file: cl.el" と怒られるときはCL(Common Lisp)パッケージをインストールしてください。

Yukimitsu Izawa
Last modified: Tue Jan 25 20:00:36 JST 2000