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

38. メモを書こう (2006/01/18)

URL="http://www.bookshelf.jp/cgi-bin/goto.cgi?file=meadow&node=make%20memo"
"MeadowMemo/メモを書こう"へのコメント(2007/12/28)
検索全文Elisp


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

Wiki にも関連記事 があります.

メモを書く Elisp は様々なものがあります.それらにはそれぞれ特徴があり,いくつかの タイプに分けられます.

本ページでもいくつか紹介していますが,ざっくりと日付けで管理するかしないかで分け て概略を述べておきます.

日付けで管理するものとして,日記指向のものがnDiarynikki.作業記録など短い文に向くものがclmemomemo-mode.日記や Todo など多様な使い方ができるhowmがあ ります.

日付けで管理しないものとしては,内容でまとめてメモするposit(ポストイッ ト) やテキストをコピーするためのスクラップツールがあります.

以下でもう少し詳しく紹介します.

使い分けの実例

私の場合主に使っているのはclmemohowm自 作の簡易スクラップ です.

URL のように比較的短いものは clmemo にメモをして, occur で検索します.で,少し長いも のとか,不定形のメモはhowmへメモをします.

自作の簡易スクラップは 2 ちゃんねるとかで気になった記事をメモるのに 使ってます (スクラップの実例) .



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

38.1 Chanelog でメモを書こう − clmemo (2005/04/05)

URL="http://www.bookshelf.jp/cgi-bin/goto.cgi?file=meadow&node=clmemo"
"MeadowMemo/Chanelogでメモを書こう−clmemo"へのコメント(無し)
検索全文Elisp

メモとして ChangeLog を使うというのは 44.3.1 Chanelog を書こう ― add-change-log-entry (2003/07/20) で紹介しましたが,その ChangeLog メモをもっと便利にする方法を紹介します.

まずは,ChangeLog メモを試してみよう から clmemo.el , clkwd.el と clgrep.el をダウンロードしてきま す.そして,ダウンロードしたファイルをロードパスの通ったところへ置き,以下を .emacs に追加します.

clmemo-entry-list はメモのエントリなので,適当に変更してください.

こうしておくと,C-x M でメモを取ることができます.エントリは TAB で補完できます.また,メモの画面で,C-c C-g とするとメモを検索できます.また,C-c C-t とするとメモのエントリだけを検索できるので,C-c C-t をしてから C-c C-g をするとうまく絞り込むことができます.

まだ,使い始めたばかりですが,意外に便利そうです.

基本は ChangeLog なので,このメモの名前などは 44.3.1 Chanelog を書こう ― add-change-log-entry (2003/07/20) のように設定します.

 
(autoload 'clmemo "clmemo" "ChangeLog memo mode." t)
(define-key ctl-x-map "M" 'clmemo)
(setq clmemo-entry-list
      '("emacs" "book" "url" "idea" "download" "soft" "meadowmemo"))
(autoload 'clgrep "clgrep" "grep mode for ChangeLog file." t)
(autoload 'clgrep-title "clgrep" "grep first line of entry in ChangeLog." t)
(autoload 'clgrep-header "clgrep" "grep header line of ChangeLog." t)
(autoload 'clgrep-other-window "clgrep" "clgrep in other window." t)
(autoload 'clgrep-clmemo "clgrep" "clgrep directly ChangeLog MEMO." t)
(add-hook 'change-log-mode-hook
          '(lambda ()
             (define-key change-log-mode-map "\C-c\C-g" 'clgrep)
             (define-key change-log-mode-map "\C-c\C-t" 'clgrep-title)))

基本的にはこれだけで動きます.私はさらに,

 
;; 2003-01-15
;; 日誌のときだけ ChangeLog メモに曜日を入れる
;;
;; 使用前: 2003-01-15  Satoru Takabayashi  <satoru@namazu.org>
;; 使用後: 2003-01-15 (Wed)  Satoru Takabayashi  <satoru@namazu.org>
;;
(defvar change-log-diary-file-name-regexp "clmemo.txt")
(defun add-log-iso8601-time-string-with-weekday ()
  (let ((system-time-locale "C"))
    (concat (add-log-iso8601-time-string)
            " " "(" (format-time-string "%a") ")")))

(add-hook 'change-log-mode-hook
          (function
           (lambda ()
             (if (and (buffer-file-name)
                      (string-match change-log-diary-file-name-regexp
                                    (buffer-file-name)))
                 (set (make-local-variable 'add-log-time-format)
                      'add-log-iso8601-time-string-with-weekday)))))

という設定を追加しています.

38.1.1 clmemo のエントリを自動補完 (2005/04/05)  



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

38.1.1 clmemo のエントリを自動補完 (2005/04/05)

URL="http://www.bookshelf.jp/cgi-bin/goto.cgi?file=meadow&node=entry%20clmemo"
"MeadowMemo/clmemoのエントリを自動補完"へのコメント(無し)
検索全文Elisp
要約

clmemo のエントリを設定しなくてもある程度補完できる.

何が問題なのか?

clmemo は後で検索しやすいようにエントリを入力します.そして,メモであるためにエン トリは日を追って変化します.

しかし,その度に設定を見直すのも面倒なものです.

何ができるのか?

clmemo で補完候補にないエントリを入力すると,次回には補完候補として登録されます.

さらに, Meadow を起動時に最近メモした分からエントリを読み込み,補完候補として登録 します.これにより,いちいち登録しなくても補完候補を保つことができます.

設定方法

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

 
;; 常に入れておきたいタイトルのリスト
(defvar clmemo-title-list
  '("idea" "system" "url" "computer")
  "*List of entries.
Set your favourite entry of ChangeLog MEMO.")

;; 最近の記事からヘッダを拾い出す
(when (file-exists-p clmemo-file-name)
  (with-temp-buffer
    ;; 行頭から5000文字を拾い出す
    (insert-file-contents clmemo-file-name
                          nil 0 5000)
    (let ((entry nil) (subentry nil))
      (goto-char (point-min))
      (while (re-search-forward
              "^\t\\*[ ]+\\([^:\n]+\\):" nil t)
        (setq entry
              (buffer-substring-no-properties
               (match-beginning 1)
               (match-end 1)))
        (when (string-match "(" entry)
          (setq subentry
                (substring
                 entry
                 (+ (string-match "(" entry) 1)
                 (- (length entry) 1)))
          (setq entry
                (substring entry
                           0
                           (string-match "(" entry)))
          (if (or (member subentry clmemo-title-list)
                  (not entry))
              ()
            (setq clmemo-title-list
                  (cons subentry clmemo-title-list))
            (setq subentry nil)))
        (if (or (member entry clmemo-title-list)
                (not entry))
            ()
          (setq clmemo-title-list
                (cons entry clmemo-title-list))
          (setq entry nil))))))

(defadvice clmemo-completing-read
  (after set-entry activate)
  (let ((entry ad-return-value))
    (if (or (member entry clmemo-title-list)
            (not entry))
        ()
      (if (string-match "+" entry)
          (setq entry
                (substring
                 entry
                 0
                 (string-match "+" entry))))
      (setq clmemo-title-list
            (cons entry clmemo-title-list)))))

詳しい使い方

普通に clmemo を使うだけです.これで,エントリは増えていきます.

Meadow を起動時にエントリがあまり増えないようであれば,

 
     clmemo-file-name nil 0 10000)

の 10000 を少し大きくします.



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

38.2 ポストイット − postit (2003/05/30)

URL="http://www.bookshelf.jp/cgi-bin/goto.cgi?file=meadow&node=posit"
"MeadowMemo/ポストイット−postit"へのコメント(2007/12/28)
検索全文Elisp

お勧め度:★★★★☆.ふと思いついたことなどを,メモしたりするのに使っている.外 部ファイルへのリンクもできる点が便利.

環境によっては動かないかもしれません.動いても,保存された結果がおかしい場合がありますので,適当に文字を入れて再起動しても正しく読むことができているかを確認してから使ってください.

また, Meadow 1.99 (Emacs 21) では動作しません

Meadow でメモを書くのに便利なものです.

postitよりダウンロードして,ロードパスの通ったところへ置き,

 
(autoload 'postit "postit" nil t)
(setq postit-colorize 'dark)
;; ファイルの圧縮はしない
(setq postit-compress-commands nil)

を追加するだけで使うことができます. 2 行目は黒に近い背景でなければ不要です.

これで,M-x postit でメモを書くことができます.普通のテキストファイルやリンクも登録できて非常に便利です.

書いたメモは s で検索もできて,非常に便利です.

上記ではうまく動かない (Meadow 1.99 や Emacs 21) ,文字化けするということもあるようです.その場合には,http://www.bookshelf.jp/elc/postit.el を試してみてください.使い方は同じです.ただし, postit.elc は消してから上書きしてください.



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

38.3 日記を書くためのモード ― nikki (2003/05/30)

URL="http://www.bookshelf.jp/cgi-bin/goto.cgi?file=meadow&node=nikki%20schedule"
"MeadowMemo/日記を書くためのモード―nikki"へのコメント(無し)
検索全文Elisp

お勧め度:★★★☆☆.私は ndiary と組み合わせて,頻繁に使ってます.ただ,これ単独 でとなると, html にも出力できない, 1 ヶ月表示のみというのは使い難いかなと思う.

postit はテーマなどを自分で設定して,メモを書いていくという形式でした.

しかし,今日何をしたのかをメモしたい,日記を書きたいということもあります.そんな時に便利なのが, nikki.el です.これは,schedule.el という Elisp を元に改良されたものです.

画面はこんな感じ です.日付があって,ずらずらと文章を書いている様子が分かるでしょうか.

インストールは nikki.el をダウンロードして,ロードパスの通ったところへ置き,以下を .emacs に追加します.

 
;; 日記のファイルが作成されるディレクトリ
(setq schedule-dir "~/Calendar")
(autoload 'schedule "nikki" nil t)

これで,M-x schedule とすると, 1 ヶ月単位で日記が表示できます.ここで,適当な日付で e とすると,その日の日記を編集できます.

編集が終わったら C-c C-c で元の画面に戻ります.

v で詳細表示と一行表示の切り替え,q で終了,h で文字を隠すことができます.

日付で管理できるので,簡単なスケジュールやその日のことをメモしたりするのに便利です.



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

38.4 参考になる文章をメモしたい (2004/02/03)

URL="http://www.bookshelf.jp/cgi-bin/goto.cgi?file=meadow&node=my%20memo"
"MeadowMemo/参考になる文章をメモしたい"へのコメント(無し)
検索全文Elisp

簡単にコピーできる機能が欲しかったので,適当に作ったものです.

何が問題なのか?

メール, WWW などを Meadow で行っていると,すぐには役に立たないけど,とりあえずメモ しておきたいということがあります.

しかし,そのたびに適当なファイルを開いて,場所を指定して,ペーストをするのも面倒 です.

何ができるのか?

リージョン内のテキストをファイルへ保存できます.

機能はそれだけです.そのため,単なるコピペだけではなく,いろいろと編集したいとい う時には使いものになりませんので,その場合は別のものを利用してください.

moccur を利用した一覧表示もできますが,color-moccurが必要 です.

設定方法

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

また, my-memo-dir で指定したディレクトリをあらかじめ作成しておきます.

 
(setq my-memo-list
      '("emacs.txt" "url.txt"))
(setq my-memo-dir "~/memo/puti")

(defvar my-memo-window-conf nil)

(require 'newcomment)
(defun my-memo-insert (category memo-text str)
  (let ((coding-system-for-read 'euc-jp-unix)
        (coding-system-for-write 'euc-jp-unix)
        memo-buf (cbuf (current-buffer))
        )

    (if (get-file-buffer
         (expand-file-name category my-memo-dir))
        (setq memo-buf
              (get-file-buffer
               (expand-file-name category my-memo-dir)))
      (setq memo-buf
            (find-file-noselect
             (expand-file-name  category my-memo-dir))))

    (set-buffer memo-buf)
    (goto-char (point-min))
    (insert
     (concat
      (format-time-string "[%Y/%m/%d %k:%M:%S] ")
      memo-text))
    (if (and comment-add
             (= comment-add 0))
        ()
      (comment-region
       (save-excursion (goto-char (point-min))
                       (push-mark nil nil t) (point))
       (save-excursion (end-of-line) (point))))

    (insert (concat
             "\n"
             str
             "\n\n"))

    (insert
     (concat
      "------------------------------------------------------------"
      "\n"))
    (forward-line -1)
    (if (and comment-add
             (= comment-add 0))
        ()
      (comment-region
       (save-excursion
         (beginning-of-line) (push-mark nil nil t) (point))
       (save-excursion
         (forward-line 1) (beginning-of-line) (point))))
    (save-buffer)
    (set-buffer cbuf)
    (kill-buffer memo-buf)
    ))

(defun my-memo-initialize ()
  (if (and (file-exists-p my-memo-dir)
           (file-directory-p my-memo-dir))
      ()
    (make-directory my-memo-dir))
  )

(defun my-memo-read-category ()
  (let ((file-list nil) category)
    ;; directory list
    (setq file-list (mapcar '(lambda (file)
                               (if (and (string-match ".+$" file)
                                        (not (file-directory-p file)))
                                   file))
                            (directory-files my-memo-dir)))

    (setq file-list (delq nil file-list))
    (setq file-list (append my-memo-list file-list))
    (setq category (completing-read
                    "memo category : "
                    (mapcar 'list file-list)
                    nil nil))
    (if (file-name-extension category)
        ()
      (setq category (concat category ".txt")))
    category
    ))

(defun my-memo-new ()
  (interactive)
  (let (category memo-text str)
    (setq str (buffer-substring (point-min) (point-max)))
    (my-memo-initialize)
    (setq category (my-memo-read-category))
    (setq memo-text (read-from-minibuffer "input memo : "))
    (my-memo-insert category memo-text str)
    (kill-buffer (current-buffer))
    (set-window-configuration my-memo-window-conf)
    ))

(defun my-memo (&optional arg)
  (interactive "P")
  (let (category memo-text str
                 (cbuf (current-buffer))
                 )
    (setq my-memo-window-conf (current-window-configuration)))

  (cond
   (arg
    (let ((moccur-use-migemo nil)
          (dmoccur-mask-internal '(".*"))
          (moccur-split-word nil))
      (dmoccur my-memo-dir "\\[[/0-9]+ [/:0-9]+\\]" nil)))

   (mark-active
    (setq str (buffer-substring (region-beginning) (region-end)))
    (my-memo-initialize)
    (setq category (my-memo-read-category))
    (setq memo-text (read-from-minibuffer "input memo : "))
    (my-memo-insert category memo-text str)
    )
   (t
    (with-output-to-temp-buffer "*my-memo*"
      (switch-to-buffer "*my-memo*")
      (kill-all-local-variables)

      (local-set-key "\C-c\C-c" 'my-memo-new)))

   ))

;; 必要に応じてキーバインドを追加
(global-set-key "\C-c\C-w" 'my-memo)

詳しい使い方

メモしたいテキストをリージョンで選択し,M-x my-memoとします.そうすると, 追加するファイルを尋ねられます.補完入力になっていますが,候補以外の指定も可能で す.候補以外のものを指定すると,そのカテゴリ名のファイルが作成されます.

その後に一行メモを入力します.何か入れておくと,後で見る時に便利でしょう.

これで,指定したファイルの先頭にリージョン内のテキストが追加されます.

他のソフトの内容をコピーする場合には,リージョンを選択せずにM-x my-memoと します.そうすると,新しいバッファができますので,そこにコピーし,C-c C-c とします.後は,リージョン選択時と同様に追加できます.

また, color-moccur を使っていれば,C-u M-x my-memoで一覧を表示できます.一 覧といっても, moccur で検索しているだけですけど.



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

38.5 階層下されたメモを書くモード ― memo-mode (2003/10/06)

URL="http://www.bookshelf.jp/cgi-bin/goto.cgi?file=meadow&node=memo-mode"
"MeadowMemo/階層下されたメモを書くモード―memo-mode"へのコメント(無し)
検索全文Elisp

何ができるのか?

[2003/09/22]
Meadow memo
  -->索引を増やそう
  -->項目の追加
    -->Emacs Wiki からのピックアップ
---

のように階層下したメモを書くことができます.

インストール方法

http://mibai.tec.u-ryukyu.ac.jp/~oshiro/Programs/から memo-mode.el と get-date.el をダウン ロードし,ロードパスの通ったところへ置きます.

無ければ,memo-mode.elget-date.elをどうぞ.

設定方法

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

 
(autoload 'memo-mode "memo-mode" "Memo mode" t)

詳しい使い方

ファイルを開き,M-x memo-modeとします.すると, memo-mode になります.

私が使う機能は以下のようなもの.

コメント

作者様のページが詳しいので,分からない部分はそちらを参照してください.

このモードは単独で使うよりも,簡単な変更履歴やメモなど他のファイルに埋め込んで使 うのが便利です.

そのために,埋め込み用のモードもあります (紹介はそのうちに...) .

38.5.1 埋め込みメモモード ― embed-memo (2003/10/06)  



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

38.5.1 埋め込みメモモード ― embed-memo (2003/10/06)

URL="http://www.bookshelf.jp/cgi-bin/goto.cgi?file=meadow&node=embed-memo"
"MeadowMemo/埋め込みメモモード―embed-memo"へのコメント(無し)
検索全文Elisp

要約

memo-mode で書くメモを適当なコメントを行頭に入れて,他のファイルに埋め込むことが できる.

何が問題なのか?

memo-mode は便利なのですが,これで 1 ファイルという使い方よりも,変更履歴などのメモ を残しておくという使い方が便利です.

しかし, Elisp などにそのままメモを書くと邪魔になってしまいます.かといって,コメ ントに入れようにも,行頭にコメントの記号を入れる必要があり, memo-mode を使うこと ができません.

何ができるのか?

別のバッファを表示し,そこで memo-mode を利用したメモを書くことができます.

そして,そのメモに適当なコメント記号をつけて,ファイルに埋め込むことができます.

インストール方法

embed-memo.elをダウンロードし, ロードパスの通ったところへ置きます.

設定方法

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

 
(provide 'embed-memo)

詳しい使い方

まず適当なファイルを開き,コメント記号を入力します. Elisp なら「;;」を行頭に入力 します.

入力したコメント記号の後にカーソルがある状態でM-x embedded-memoとします. すると,新しいバッファができます.

そこでは,普通に memo-mode でメモを書くことができます.書き終わったら,C-c C-cで終了します.

すると,元のバッファに作成したメモが書き込まれます.各行頭にはコメント記号も入力 されます.

再編集する場合には,適当な場所でM-x embedded-memoとします.

コメント

オリジナルを一箇所だけ変更しています.



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

38.6 書き散らかしメモツール ― howm (2006/01/18)

URL="http://www.bookshelf.jp/cgi-bin/goto.cgi?file=meadow&node=howm"
"MeadowMemo/書き散らかしメモツール―howm"へのコメント(2007/12/28)
検索全文Elisp
要約

Wiki のようなリンク,期日付近で浮き上がってくる予定など多彩な機能を持つ Elisp です.

howm チュートリアルもあります.最新 のものはYahoo のブリーフケー スからダウンロードできます.

何が問題なのか?

メモを取るための Elisp はたくさんあります.しかし,それらの多くは特有な書式が必要 だったり,後で見返すのが面倒だったりします.

何ができるのか?

デフォルトでは 1 メモ 1 ファイルでメモをとっていくことができます. howm を使わな くても,普通のテキストでメモをとることもできます.

howm が提供するのは,それらの書き散らかしたメモを検索したり,メモから予定を抜き 出して Todo を管理したりといった機能です.

一応,行頭に「=」があれば,それがタイトルになりますが,別に無ければならないもの ではありません. howm ならどんなテキストでも検索してくれますので,書式に拘る必要 はないのです.

インストール方法

howm のペー ジよりダウンロードして解凍します.

その後で, bash を起動し,

./configure
make
make install

として Elisp をインストールします (上記が面倒なら,*.el のファイルだけロードパスの 通ったところへコピーしても構いません) .

次に,解凍したディレクトリの ja の中にある 0000-00-00-000000.howm を ~/howm に移 動します.~/howm が無ければ作っておきます.

設定方法

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

 
(setq howm-menu-lang 'ja)
(global-set-key "\C-c,," 'howm-menu)
(mapc
 (lambda (f)
   (autoload f
     "howm" "Hitori Otegaru Wiki Modoki" t))
 '(howm-menu howm-list-all howm-list-recent
             howm-list-grep howm-create
             howm-keyword-to-kill-ring))

私は以下のような設定も入れています.

 
;; リンクを TAB で辿る
(eval-after-load "howm-mode"
  '(progn
     (define-key howm-mode-map [tab] 'action-lock-goto-next-link)
     (define-key howm-mode-map [(meta tab)] 'action-lock-goto-previous-link)))
;; 「最近のメモ」一覧時にタイトル表示
(setq howm-list-recent-title t)
;; 全メモ一覧時にタイトル表示
(setq howm-list-all-title t)
;; メニューを 2 時間キャッシュ
(setq howm-menu-expiry-hours 2)

;; howm の時は auto-fill で
(add-hook 'howm-mode-on-hook 'auto-fill-mode)

;; RET でファイルを開く際, 一覧バッファを消す
;; C-u RET なら残る
(setq howm-view-summary-persistent nil)

;; メニューの予定表の表示範囲
;; 10 日前から
(setq howm-menu-schedule-days-before 10)
;; 3 日後まで
(setq howm-menu-schedule-days 3)

;; howm のファイル名
;; 以下のスタイルのうちどれかを選んでください
;; で,不要な行は削除してください
;; 1 メモ 1 ファイル (デフォルト)
(setq howm-file-name-format "%Y/%m/%Y-%m-%d-%H%M%S.howm")
;; 1 日 1 ファイルであれば
(setq howm-file-name-format "%Y/%m/%Y-%m-%d.howm")

(setq howm-view-grep-parse-line
      "^\\(\\([a-zA-Z]:/\\)?[^:]*\\.howm\\):\\([0-9]*\\):\\(.*\\)$")
;; 検索しないファイルの正規表現
(setq
 howm-excluded-file-regexp
 "/\\.#\\|[~#]$\\|\\.bak$\\|/CVS/\\|\\.doc$\\|\\.pdf$\\|\\.ppt$\\|\\.xls$")

;; いちいち消すのも面倒なので
;; 内容が 0 ならファイルごと削除する
(if (not (memq 'delete-file-if-no-contents after-save-hook))
    (setq after-save-hook
          (cons 'delete-file-if-no-contents after-save-hook)))
(defun delete-file-if-no-contents ()
  (when (and
         (buffer-file-name (current-buffer))
         (string-match "\\.howm" (buffer-file-name (current-buffer)))
         (= (point-min) (point-max)))
    (delete-file
     (buffer-file-name (current-buffer)))))

;; http://howm.sourceforge.jp/cgi-bin/hiki/hiki.cgi?SaveAndKillBuffer
;; C-cC-c で保存してバッファをキルする
(defun my-save-and-kill-buffer ()
  (interactive)
  (when (and
         (buffer-file-name)
         (string-match "\\.howm"
                       (buffer-file-name)))
    (save-buffer)
    (kill-buffer nil)))
(eval-after-load "howm"
  '(progn
     (define-key howm-mode-map
       "\C-c\C-c" 'my-save-and-kill-buffer)))

howm は保存時にいくつかの処理を行います.そのため,自動保存 の設定 を使っていると,保存のたびに待たされてしまいます.回避策は,自動 保存 を howm ではしないようにするか,以下を追加して howm 側の処理をしないようにし ておきます.

 
 ;; メニューを自動更新しない
(setq howm-menu-refresh-after-save nil)
;; 下線を引き直さない
(setq howm-refresh-after-save nil)

詳しい使い方

C-c,,で起動します.そうすると,

= <<<%menu%
 c[新規] D[複製] 検索 (s[固定] g[正規] m[roma])
 a[一覧] l[最近] A[前後] y[予定] t[Todo] [全消]
 K[題↑] [名↑] d[日↓] i[鍵↓] r[更新] [menu 更新] [menu 編集]
-------------------------------------
[予定] … 予定@, 〆切! を 7 日先まで表示
-------------------------------------
[Todo] … 〆切!, todo+, 覚書- を上位 50 個まで表示
-------------------------------------

というバッファが表示されます.ここで,オレンジのキーを押すと,それぞれの処理を実 行できます.例えば,c で新規のメモを書くことができます.

実際に,c とすると

=
[2004-01-24 17:51] >>> ~/www/soft/memo.texi

のようなバッファができます.~/www/soft/memo.texi の部分は C-c,, を入力する 直前にいたバッファによって変わります.

後は適当に文を書いていき,保存するだけです.= の行にはタイトルを書きますが,面倒 なら空欄でも構いません.

こんな風に書いていきます.

= メモのタイトル
[2004-01-24 21:52] >>> ~/www/soft/memo.texi

本文をずらずらと書いていく.
書式は特に無いので自由に書くことができます.

一覧を表示する

C-c,,の画面で lC-c,lとすると,以下のように複数のメモを 1 つの メモのように連結して表示できます.

==========================>>> ~/data/howm/2004/01/2004-01-24-175318.howm
= Meadow
[2004-01-24 17:53] >>> ~/data/howm/2004/01/2004-01-24-175251.howm

howm ネタを追加

==========================>>> ~/data/howm/2004/01/2004-01-24-175251.howm
= 
[2004-01-24 17:52] >>> ~/www/soft/memo.texi

2 つめのメモ

==========================>>> ~/data/howm/2004/01/2004-01-24-175123.howm
= 
[2004-01-24 17:51] >>> ~/www/soft/memo.texi

以下続く

C-c,,の画面で aC-c,aとすると,以下のようにリストで表示され, 別ウィンドウにはカーソルがある行のメモが表示されます.

2004-01-24-175318.howm | 
2004-01-24-175251.howm | 
2004-01-24-175123.howm | 
2004-01-24-172302.howm | 
0000-00-00-000000.howm | 

どちらの形式であっても,RET を入力することで,現在カーソルがあるメモを編集 することができるようになります.

リンクを使う

以下のように「>>> キーワード」という形式でリンクを書くことができます.カーソルを 合わせてRET を押すと,キーワードで全文検索し,一致したメモだけが一覧表示さ れます.

>>> Meadow

しかし,これではいちいちリンクを書かないといけません.そこで,「これは頻繁に検索 して一覧表示したいな」というキーワードがあれば,「<<< キーワード」という形式で書 いておきます

<<< Meadow

そうすると,

Meadow

のようにキーワードを普通に書くだけでリンクになります.

Todo など

howm の特徴の 1 つである Todo システムを紹介します.予定や Todo の管理というのは多くの 人が実行していると思います.しかし, Todo が多くなると管理は困難になります.そこで, 重要度を導入して管理しようとするわけですが,結局重要なものしか見ないからすべて重 要扱いになってしまう...

そこで, howm では重要度の概念は無くなっています.その変わりに予定日付近で浮き上がっ てくるという機能があります.

詳しく紹介します. howm の起動時の画面にあるように, Todo 関連には以下のようなものが あります.

[2002-10-21]@  予定  (予定表に表示)
[2002-10-21]+7 todo  指定日になってから 7 日間かけて徐々に浮かび続ける
[2002-10-21]!7 〆切  指定日の 7 日前から徐々に浮かび、指定日以降浮きっぱなし
[2002-10-21]-1 覚書  指定日に浮かび上がり、以降 1 日かけて単位量だけ徐々に沈む
[2002-10-21].  済み  常に底
(記号の後の数字はデフォルト値)

予定は単純です.C-c,,で表示される画面に 7 日先の分まで表示されます. C-c,, の後でyC-c,yで全予定の一覧も表示できます.

分かりにくいのはそれ以外でしょうか. Todo 関連は C-c,, の後でtC-c,tで一覧表示できます.

そうすると,重要なものほど上に,重要でないものほど下へ行くようになっています.そ の重要さを判断するのが,

[2002-10-21]+7 todo  指定日になってから 7 日間かけて徐々に浮かび続ける
[2002-10-21]!7 〆切  指定日の 7 日前から徐々に浮かび、指定日以降浮きっぱなし
[2002-10-21]-1 覚書  指定日に浮かび上がり、以降 1 日かけて単位量だけ徐々に沈む
[2002-10-21].  済み  常に底

の書式です.「 [2002-10-21]. 」は単純です.これは,一覧では一番下になります.それ 以外は,指定日前後で徐々に上がったり下がったりするのです.これは,メニューの文字 を参考に何度か使ってみるといいと思います.

チェックボックス

これは細かいネタですが,

{ }

と入力すると,この部分がリンクになります.RETを入力すると,「{*}」「{-}」 「{ }」と切り替わります.

日付けの入力が面倒

以下の設定を.emacs に追加します.

 
(eval-after-load "calendar"
  '(progn
     (define-key calendar-mode-map
       "\C-m" 'my-insert-day)
     (defun my-insert-day ()
       (interactive)
       (let ((day nil)
             (calendar-date-display-form
         '("[" year "-" (format "%02d" (string-to-int month))
           "-" (format "%02d" (string-to-int day)) "]")))
         (setq day (calendar-date-string
                    (calendar-cursor-to-date t)))
         (exit-calendar)
         (insert day)))))

後はM-x calendar で好きな日付けを選び,RETとします.これで,所望の日 付けを入力できます.カレンダを見ながらなので,再来週の土曜といった希望でも簡単に 入力できます.

他の方法として,

{_}

({}の間に下線) と入力して,RETを入力します.そうすると,今日の日付けになり ます. [2004-01-24]

日付けを入力すると下線が引かれて,リンクになります,この状態でRETを入力す うと,メニューが出てきて 3 日先へとかの指定が簡単にできます.

http://pc.2ch.net/test/read.cgi/unix/1063800495/598-599n にあるように以下 を追加しても簡易入力が可能です.

 
(defun my-get-date-gen (form)
  (insert (format-time-string form)))
(defun my-get-date ()
  (interactive)
  (my-get-date-gen "[%Y-%m-%d]"))
(defun my-get-time ()
  (interactive)
  (my-get-date-gen "[%H:%M]"))
(defun my-get-dtime ()
  (interactive)
  (my-get-date-gen "[%Y-%m-%d %H:%M]"))
(global-set-key "\C-c\C-d" 'my-get-date)
(global-set-key "\C-c\C-t" 'my-get-time)
(global-set-key "\C-c\ed" 'my-get-dtime)

アウトラインと組み合わせる

ネタ元:http://www.unix-fan.com/celt/blog/20031203.html

以下を.emacs に追加します.これでアウトラインモード同様,行頭に「* 」をつけておく とそれがリンクになります.そして,RETで表示・非表示を切り替えることができ ます.

 
(autoload 'howm-mode
  "howm-mode" "Hitori Otegaru Wiki Modoki" t)
(defadvice howm-mode
  (before outline-minor activate)
  (outline-minor-mode t))
(require 'outline)
(defun my-outline-flip-subtree (&optional dummy)
  (interactive)
  (if (save-excursion
        (forward-line 1)
        (let ((p (overlays-at (line-beginning-position)))
              (ol nil))
          (while (and p (not ol))
            (setq ol (overlay-get (car p) 'invisible))
            (setq p (cdr p)))
          ol))
      (show-subtree)
    (hide-subtree)))
(defun add-my-action-lock-rule ()
  (let ((rule
         (action-lock-general
          'my-outline-flip-subtree
          (if (and
               buffer-file-name
               (string-match "\\.howm$" buffer-file-name))
              "^ *\\(\\*\\**\\)"
            (concat "\\(" outline-regexp "\\)"))
          1 1)))
    (if (not (member rule action-lock-default-rules))
        (progn (setq action-lock-default-rules
                     (cons rule action-lock-default-rules))
               (action-lock-set-rules action-lock-default-rules)))))
(add-hook 'action-lock-mode-on-hook 'add-my-action-lock-rule)

コミックの発売日を howm の登録

daiyan の日記よりスクリプトをダウンロードし てきます.他にjcode.pl と wget (Cygwin に入ってま す) も必要です.

スクリプトを解凍すると, comic.pl があるので,これを適当なところへ置きます.同じと ころに, jcode.pl も置いておきます.

次に, comic.pl を開き,以下を参考に編集します.

#文字コード変換ライブラリ
require "/home/zaurus/sbin/jcode.pl";
を
require "jcode.pl";

/mnt/card/home/howm/
となっている部分を
d:/home/howm/
などに

#何ヶ月先の予定まで調べるか
$SEACHMONTH = 3;
これは好みで変更

#作業ディレクトリの指定
$TMPDIR     = "/home/zaurus/tmp/";
は
$TMPDIR     = "d:/home/tmp/";
などに

変更が終われば保存します.

次に,~/howm/comic.bookmark を作成します.中身は空で構いません.

これで準備完了です.後は bash を起動し,

cd ~/bin/
perl comic.pl

のように, comic.pl のあるディレクトリへ cd で移動した後で,「 perl comic.pl 」として 実行すると, howm の予定を作ってくれます.

コミックに興味がないという方も,M-% comic bunko として全部置換してしまえば, 文庫発売予定としても利用できます.

さて,~/howm/comic.bookmark (あるいは ~/howm/bunko.bookmark) を空で実行すると, 以下のように大量の予定が登録されます.そこで,~/howm/comic.bookmark に適当にキー ワードを入力しておきましょう. 1 行 1 キーワードで入力して,再度実行すると,キー ワードを含む予定だけが登録されます.

= <<<%menu%
 %"c"[新規] %"D"[複製] 検索 (%"s"[固定] %"g"[正規] %"m"[roma])
 %"a"[一覧] %"l"[最近] %"A"[前後] %"y"[予定] %"t"[Todo] [全消]
 %"K"[題↑] [名↑] %"d"[日↓] %"i"[鍵↓] %"r"[更新] [menu 更新] [menu 編集]
-------------------------------------
[予定] … 予定@, 〆切! を 7 日先まで表示
> 日  0 [2004-01-25]@ 私立彩陵高校超能力部 (2) 発売日
> 月 -1 [2004-01-26]@ (成) PINK SPOT 発売日
> 月 -1 [2004-01-26]@ 7SEEDS (セブンシーズ) (4) 発売日
> 月 -1 [2004-01-26]@ Reverse!? 発売日
> 月 -1 [2004-01-26]@ おヨメ・サンバ (2) 発売日
> 月 -1 [2004-01-26]@ こっちむいて! みい子 (14) 発売日
> 月 -1 [2004-01-26]@ それでも君を奪う発売日
> 月 -1 [2004-01-26]@ そんなんじゃねえよ (3) 発売日
> 月 -1 [2004-01-26]@ そんな声だしちゃイヤ! (4) 発売日
> 月 -1 [2004-01-26]@ そんな声だしちゃイヤ! 〔特別版〕 (4) 発売日
> 月 -1 [2004-01-26]@ ぺぱーみんと・エイジ (4) 発売日

メモ

38.6.1 howm と カレンダの併用 (2005/04/11)  
38.6.2 howm にキャプチャを書く ― imcap (2005/03/25)  



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

38.6.1 howm と カレンダの併用 (2005/04/11)

URL="http://www.bookshelf.jp/cgi-bin/goto.cgi?file=meadow&node=howm%20calendar"
"MeadowMemo/howmとカレンダの併用"へのコメント(無し)
検索全文Elisp
要約

howm とカレンダを併用することで,日付けの管理が随分と楽になります.

情報源

アイデアは 「howm と diary と calendar と 」を読んでいて思いついた.

「 calendar から検索」は http://d.hatena.ne.jp/daiyan/20040114#p3 のものを 利用しています.

何ができるのか?

のように diary か howm のスケジュールがある日に色をつけたり,

[ diary ] (7 日先まで表示)
>>d [2004-01-29] 2004/1/24 から 5 日おきの予定
>>d [2004-01-29] 会議
>>d [2004-02-03] 2004/1/24 から 5 日おきの予定
>>d [2004-02-04] 水曜はごみの日
-------------------------------------

のように,C-c,, のメニューに diary のスケジュールを表示したりできます.

設定方法

 
(require 'calendar)
(require 'howm-mode)
(setq
 calendar-date-display-form
 '("[" year "-" (format "%02d" (string-to-int month))
   "-" (format "%02d" (string-to-int day)) "]"))
(setq diary-file
      (expand-file-name "diary" howm-directory))

(defun howm-mark-calendar-date ()
  (interactive)
  (require 'howm-reminder)
  (let* ((today (howm-reminder-today 0))
         (limit (howm-reminder-today 1))
         (howm-schedule-types
          howm-schedule-menu-types)
         (raw (howm-reminder-search
               howm-schedule-types))
         (str nil) (yy nil) (mm nil) (dd nil))
    (while raw
      (setq str (nth 1 (car raw)))
      (when
          (string-match
           "\\([0-9]+\\)-\\([0-9]+\\)-\\([0-9]+\\)"
           str)
        (setq yy (match-string 1 str))
        (setq mm (match-string 2 str))
        (setq dd (match-string 3 str)))
      (when (and yy mm dd)
        (mark-calendar-date-pattern
         (string-to-int mm)
         (string-to-int dd)
         (string-to-int yy)))
      (setq mm nil)
      (setq dd nil)
      (setq yy nil)
      (setq raw (cdr raw))
      )))

(defadvice mark-diary-entries
  (after mark-howm-entry activate)
  (howm-mark-calendar-date))

(setq
 howm-menu-display-rules
 (cons
  (cons "%hdiary[\n]?" 'howm-menu-diary)
  howm-menu-display-rules
   ))

(defun howm-menu-diary ()
  (require 'diary-lib)
  (message "scanning diary...")
  (delete-region
   (match-beginning 0) (match-end 0))
  (let* ((now (decode-time (current-time)))
         (diary-date
          (list (nth 4 now) (nth 3 now) (nth 5 now)))
         (diary-display-hook 'ignore)
         (cbuf (current-buffer))
         (howm-diary-entry nil)
         (howm-diary-entry-day nil)
         (str nil))
    (unwind-protect
        (setq howm-diary-entry
              (list-diary-entries
               diary-date howm-menu-schedule-days))
      (save-excursion
        (set-buffer
         (find-buffer-visiting diary-file))
        (subst-char-in-region
         (point-min) (point-max) ?\^M ?\n t)
        (setq selective-display nil)))

    (while howm-diary-entry
      (setq howm-diary-entry-day (car howm-diary-entry))
      (setq mm (nth 0 (car howm-diary-entry-day)))
      (setq dd (nth 1 (car howm-diary-entry-day)))
      (setq yy (nth 2 (car howm-diary-entry-day)))
      (setq str (nth 1 howm-diary-entry-day))
      (setq howm-diary-entry (cdr howm-diary-entry))
      (insert
       (format
        ">>d [%04d-%02d-%02d] %s\n" yy mm dd str))))
  (message "scanning diary...done")
  )

(setq diary-date-forms
      '((month "/" day "[^/0-9]")
        (month "/" day "/" year "[^0-9]")
        ("\\[" year "-" month "-" day "\\]" "[^0-9]")
        (monthname " *" day "[^,0-9]")
        (monthname " *" day ", *" year "[^0-9]")
        (dayname "\\W")))

(defun howm-open-diary (&optional dummy)
  (interactive)
  (let ((date-str nil) (str nil))
    (save-excursion
      (beginning-of-line)
      (when (re-search-forward
             ">>d \\(\\[[-0-9]+\\]\\) " nil t)
        (setq str
              (concat
               "^.+"
               (buffer-substring-no-properties
                (point) (line-end-position))))
        (setq date-str
              (concat
               "^.+"
               (buffer-substring-no-properties
                (match-beginning 1)
                (match-end 1))
               " " str))
        (find-file
         (substitute-in-file-name diary-file))
        (howm-mode t)
        (goto-char (point-min))
        (if (re-search-forward date-str nil t)
            ()
          (re-search-forward str nil t))))))

(defun add-diary-action-lock-rule ()
  (let ((rule
         (action-lock-general
          'howm-open-diary
          "^\\(>>d\\) "
          1 1)))
    (if (not (member rule action-lock-default-rules))
        (progn
          (setq action-lock-default-rules
                (cons rule action-lock-default-rules))
          (action-lock-set-rules
           action-lock-default-rules)))))

(add-hook 'action-lock-mode-on-hook
          'add-diary-action-lock-rule)

(defadvice make-diary-entry
  (after howm-mode activate)
  (text-mode)
  (howm-mode t))

メニューに追加

さらに, howm のメニュー (~/howm/0000-00-00-000000.howm) に以下を追加します.

[ diary ] (%sdays 日先まで表示)
%hdiary
-------------------------------------

calendar から検索

ネタ元:http://d.hatena.ne.jp/daiyan/20040114#p3

以下を.emacs に追加します.すると,M-x calendar とした後で日付けを選び, d とすると,その日付けで検索できます.

 
;; M-x calendar しといて M-x howm-from-calendar
;;         → その日付を検索
(defun howm-from-calendar ()
  (interactive)
  (require 'howm-mode)
  (let* ((mdy (calendar-cursor-to-date t))
         (m (car mdy))
         (d (second mdy))
         (y (third mdy))
         (key (format-time-string
               howm-date-format
               (encode-time 0 0 0 d m y))))
    (howm-keyword-search key)))

;;カレンダーの上で d を押すと grep
(add-hook 'initial-calendar-window-hook
          '(lambda ()
             (local-set-key
              "d" 'howm-from-calendar)))

howm からカレンダを起動

http://d.hatena.ne.jp/daiyan/20040202#1075698025 より

howm のメニューからカレンダを起動するためには,以下を.emacs に追加します.

 
;;howm のメニューで d でカレンダー
(add-hook 'howm-menu-hook
          '(lambda ()
             (local-set-key "d" 'calendar)))

詳しい使い方

M-x calendar としてカレンダを表示させます.ここで,m とすると,スケ ジュールのある日に色がつきます.メニューができるので,適当に触ってみてください. howm のような日付けでのスケジュール指定のほかに毎週水曜などの指定もできます.

ここで,d とすると,カーソルがある場所の日付けで検索ができます.

さらに,メニューに追加しておけば,メニューにスケジュールが表示されます.行の先頭 でRET を入力すると,その行がある場所へジャンプできます (同じ文章が複数ある と違う場所へ飛んでしまいます) .

コメント

実際に使ってみると何だかちぐはぐな感じ.指定した日付けの予定一覧とか機能を追加し ていくと多少は使いものになるかも.



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

38.6.2 howm にキャプチャを書く ― imcap (2005/03/25)

URL="http://www.bookshelf.jp/cgi-bin/goto.cgi?file=meadow&node=imcap"
"MeadowMemo/howmにキャプチャを書く―imcap"へのコメント(無し)
検索全文Elisp

要約

メモとしてブラウザの画面などのスクリーンキャプチャを howm に記入できます.

情報源

http://howm.sourceforge.jp/cgi-bin/hiki/hiki.cgi?ImageCapture

何ができるのか?

こんなメモを簡単に取ることができます.ファイル名は日付けと時間で勝手に付けてくれ るので,余計なことに悩む必要もありません.

インストール方法

howm Wiki の 画像取り込み より imcap.el をコピーし,ロードパスの通ったところに imcap.el の名で 保存します.

次にWinShotをダウンロードして,解 凍します.できたファイルを適当なディレクトリにコピーします.

設定方法

以下を.emacs に追加します. Winshot のパスは環境に合わせて変更しておきます.

 
(setq
 howm-excluded-file-regexp
 (concat
  "\\(^\\|/\\)\\([.]\\|CVS/\\)\\|"
  "[~#]$\\|"
  "\\.\\("
  (mapconcat
   (lambda (f) f)
   '(
     "doc" "pdf" "ppt" "xls"
     "bak" "elc" "gz" "aux"
     "toc" "idx" "dvi" "jpg"
     "gif" "png"
     ) "\\|") "\\)$"))
(setq imcap-capture-command-format
      (concat
       "d:/home/bin/WinShot.exe"
       " -Jpeg -Rectangle -Close -File %s"))
(autoload 'imcap-capture "imcap"
  "Hitori Otegaru Wiki Modoki image capture" t)
(autoload 'imcap-display "imcap"
  "Hitori Otegaru Wiki Modoki image capture" t)
(add-hook 'howm-view-open-hook 'imcap-display)

詳しい使い方

M-x imcap-capture とします.そうすると,

Winshot を起動すると小さな画面が表示されます

のように小さなウィンドウが表示され,マウスで範囲を選択できるようになります.そこ で,開始点と終了点を左クリックで選択することで,その範囲が jpeg として保存されま す.メモにはその画像が表示されます.

ファイル名は 2004-01-30-194015.jpg (2004/01/30 19:40:15 に作ったもの) のようにな り,メモには

>>> 2004-01-30-154015.jpg

のように記入されます.

メモをC-xC-fで開いた際などに,画像を表示させたい場合には,M-x imcap-display とします.

画像を削除したい

メモに画像を書くことができるのはとても便利なのですが,問題はそれをどう管理するか です.メモを消しても画像は残ってしまうので,一個一個確認して消さないといけません.

そこで以下の設定を.emacs に追加します.これで,画像をC-w で切り取ると,ファ イルを削除するかどうか確認します.y と答えるとファイルを削除します.

 
(defadvice kill-region
  (around delete-image-file activate)
  (when (and (boundp 'howm-mode)
             howm-mode)
    (let ((str
           (split-string
            (buffer-substring-no-properties
             (ad-get-arg 0)
             (ad-get-arg 1)) "[\n\r]+"))
          (line nil)
          (imagefile nil))
      (while str
        (setq line (car str))
        (if (string-match
             ">>> \\(.*\\.\\(jpg\\|png\\|gif\\)\\)"
             line)
            (setq imagefile (match-string 1 line)))
        (when (and imagefile
                   (file-exists-p
                    (expand-file-name imagefile)))
          (if (y-or-n-p
               (format
                "Delete image file %s?" imagefile))
              (progn
                (setq imagefile
                      (expand-file-name imagefile))
                (delete-file imagefile))))
        (setq imagefile nil)
        (setq str (cdr str)))))
  ad-do-it)

コメント

imcap.el は Pooh のページ がもとになってい ます.

38.6.2.1 画像のリサイズが可能な imcap (2005/03/25)  



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

38.6.2.1 画像のリサイズが可能な imcap (2005/03/25)

URL="http://www.bookshelf.jp/cgi-bin/goto.cgi?file=meadow&node=imcap%20resize"
"MeadowMemo/画像のリサイズが可能なimcap"へのコメント(無し)
検索全文Elisp
要約

imcap で表示した画像の拡大・縮小が可能になります.

何が問題なのか?

画面のスクリーンショットなどで大きい画面を貼り付けることがあります.しかし,それ では全体を見ることができません.

何ができるのか?

画像を縮小したり拡大したりできます.

設定済みMeadowでは

入れてあります.画像が表示された状態で f11 で縮小, f12 で拡大になり ます.

インストール方法

imcap.el をダウンロードし,ロードパス の通ったところへ置きます.

設定方法

通常の imcap と同じです.

詳しい使い方

まずは,M-x imcap-display で画像を表示します.

そして,縮小したい画像の前にカーソルを移動し,M-x imcap-image-downsize と します.

何度か繰り返して実行すると,どんどん画像が縮小されていきます.

拡大したい時には,その画像の前にカーソルを移動し,M-x imcap-image-upsize と します.

必要に応じて以下を参考にキーバインドを設定ください.

 
(autoload 'imcap-image-downsize "imcap"
  "imcap" t)
(autoload 'imcap-image-upsize "imcap"
  "imcap" t)

(eval-after-load "howm-mode"
  '(progn
     (define-key howm-mode-map [f11]
       'imcap-image-downsize)
     (define-key howm-mode-map [f12]
       'imcap-image-upsize)))


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