Emacs で断片的なメモをどんどんとるための環境です. 分類機能はあえてつけません. かわりに, 全文検索とメモ間リンクが手軽にできるようにしました. 自由書式なので改宗も不要 :-)
(howm-mode)
こんなテンプレートが表示される
= ■ ←(タイトル欄) [2002-09-16 20:08] >>> /home/hira/elisp/howm/howm-mode.el ↑(作成日 & その前に見てたファイル)
次のように書くと, foo と bar がタイトル
= foo (… ほげほげ …) = bar (… ふがふが …)
正確な書式は,
(行頭)=(空白)(タイトル)(行末)
タイトルなしで, 単にメモの区切りとして使うだけでも OK
(… ほげほげ …) = (… ふがふが …) = (… へろへろ …)
goto リンク: ファイル(ディレクトリ)名 or 含まれる文字列
>>> ~/.emacs >>> /usr/src >>> ほげほげ
come-from リンク: 他のメモで「ふがふが」という文字列が出てきたら, ぜんぶこのメモへのリンクに
<<< ふがふが
Wiki 風リンク: goto と同じ. ただし「<<< へろへろ」がもしなければ作る.
[[へろへろ]]
たとえば, 「>>> emacs」ならこんな一覧
<<< emacs ← ずばりの come-from 宣言をしたメモ <<< emacs lisp ← 「emacs」を含む come-from を宣言したメモ <<< 自作 emacs lisp grep, ruby, emacs の regexp の違い ← 本文中に「emacs」を含むメモ emacs 用検索ツール?[2001-08-13] (新しい順) …
browse-url を使用. 必要なら適当に設定.
(setq browse-url-browser-function 'browse-url-mozilla)
(一覧モード)
Dired-X の使い方は, info dired-x 等を参照
v → 中身を見る (q → 戻る) d → 「消すぞ」マーク x → マークしたファイルたちを本当に消す
(予定表・todo)
メモ中に
[2002-10-20]+ ハイウェイ惑星 買おう
のように書いておくと, 一覧で見ることができます
覚書 (-)
[2002-10-20]- ハイウェイ惑星 買おう
沈むのを遅くするには, 猶予日数で指定(デフォルト 1 日)
[2002-10-20]-14 ハイウェイ惑星 買おう → 14 日間ぐらいは気にかけよう
todo (+)
[2002-10-20]+ ハイウェイ惑星 買うべし
浮きあがる速さは, 猶予日数で指定(デフォルト 7 日)
[2002-10-20]+14 ハイウェイ惑星 買うべし → 14 日間ぐらいのうちに
〆切 (!)
[2002-10-20]! ハイウェイ惑星 〆切
何日前から浮きはじめるかは, 猶予日数で指定(デフォルト 7 日)
[2002-10-20]!14 ハイウェイ惑星 〆切 → 14 日前ぐらいからぼちぼち
保留 (~)
[2002-10-20]~ ハイウェイ惑星 買おうか
何日周期で浮き沈みするかは, 猶予日数で指定(デフォルト 30 日)
[2002-10-20]!14 ハイウェイ惑星 買おうか → 14 日周期
予定 (@)
[2002-10-20]@ ハイウェイ惑星
済 (.)
[2002-10-20]. ハイウェイ惑星
例
[2002-10-20]+9 ほげほげ
の「+9」にカーソル置いてリターンたたくと, ミニバッファにメニューが出て…
そのままリターン → 「済」
[2002-10-20]. [2002-10-20]:+9 ほげほげ
x を入力 → 「cancel」
[2002-10-20]. cancel [2002-10-20]:+9 ほげほげ
- を入力 → 種類を覚書に変更
[2002-10-20]-9 ほげほげ
14 を入力 → 猶予日数を 14 日に変更
[2002-10-20]+14 ほげほげ
後ろめたければ, 猶予日数の長い「覚書」に
[2002-11-10]-10 ハイウェイ惑星
緊急ではないが重要なこと
[2002-11-10]-999 ●ハイウェイ惑星
目立たせたいこと
[2002-11-10]! ★★ハイウェイ惑星
xemacs の場合
./configure --with-xemacs
インストール先の変更例
./configure --with-howmdir=$HOME/elisp --prefix=$HOME
case 1: emacs 起動時に読み込む
(setq howm-menu-lang 'ja) (require 'howm)
case 2: はじめて C-c , , した時に読み込む
(setq howm-menu-lang 'ja) (global-set-key "\C-c,," 'howm-menu) (autoload 'howm-menu "howm" "Hitori Otegaru Wiki Modoki" t)
いずれも, もし「Cannot open load file」とかエラーが出るなら, 上記の前にこれを追加
(add-to-list 'load-path "/usr/share/emacs/site-lisp/howm/")
置き場に応じて, ↓のように記述
(add-to-list 'load-path "~/elisp/howm/")
お好みで, バイトコンパイル
cd ~/elisp/howm \emacs -batch -q --no-site-file --eval '(progn (add-to-list (quote load-path) ".") (byte-recompile-directory "." 0))'
お好みで, ~/.emacs に設定を追加 (→カスタマイズ)
;; 設定例 (define-key global-map [katakana] 'howm-menu) ; [カタカナ] キーでメニュー (setq howm-file-name-format "%Y/%m/%Y_%m_%d.txt") ; 1 日 1 ファイル (setq howm-keyword-case-fold-search t) ; <<< で大文字小文字を区別しない (setq howm-list-title nil) ; 一覧時にタイトルを表示しない (setq howm-menu-refresh-after-save nil) ; save 時にメニューを自動更新せず (setq howm-refresh-after-save nil) ; save 時に下線を引き直さない (setq howm-menu-expiry-hours 2) ; メニューを 2 時間キャッシュ
区別する場合
find ~/howm -name '*.txt' -print | xargs ruby -ne '$_ =~ /<<<\s+(.+)$/ and puts $1.split(/\s*<<<\s*/).join "\t"' | sort -u > ~/.howm-keys
区別しない場合
find ~/howm -name '*.txt' -print | xargs ruby -ne '$_ =~ /<<<\s+(.+)$/ and puts $1.downcase.split(/\s*<<<\s*/).join "\t"' | sort -u > ~/.howm-keys
.emacs に以下を書いておかないと, Dired-X に C-x C-j を奪われます
(setq dired-bind-jump nil)
下線が表示されない端末なら
(set-face-foreground 'action-lock-face "blue") ;; 下線のかわりに色つけ
リンク記号を変更する
;; 例: .emacs (howm ロードより前)に (setq howm-ref-header "==>") ; goto リンク (setq howm-keyword-header "<==") ; come-from リンク
基本的には M-x customize → [Applications] → [Howm] で. ぴんとこない項目も, [Show] でありがちな既定値から選択可能.
そこにない設定については, ~/.emacs (~/.emacs.el かも)へ, 以下のように直接書く. (もっと網羅的だが古い解説は, <URL:OLD.rd>を参照)
howm 関連の全バッファに共通の色設定
;; 「ほげ」と「[ふが]」に着色 ;; ・設定法の詳細は, 変数 font-lock-keywords のヘルプを参照 ;; ・face の一覧は M-x list-faces-display (setq howm-user-font-lock-keywords '( ("ほげ" . (0 'highlight prepend)) ("\\[ふが\\]" . (0 'font-lock-doc-face prepend)) ))
内容バッファに rd-mode な色をつける
;; rd-mode.el が読み込まれているという前提で (setq howm-view-contents-font-lock-keywords rd-font-lock-keywords)
「カタカナ」でメニュー, 「Ctrl-カタカナ」で新規メモ
(define-key global-map [katakana] 'howm-menu) (define-key global-map [(control katakana)] 'howm-create)
[tab]([alt]-[tab])で次(前)のリンクに移動
(define-key howm-mode-map [tab] 'action-lock-goto-next-link) (define-key howm-mode-map [(meta tab)] 'action-lock-goto-previous-link)
メモ置き場/年/年月日-時分秒.txt に
(setq howm-file-name-format "%Y/%Y%m%d-%H%M%S.txt")
1 日 1 ファイル (メモ置き場/年/月/年_月_日.txt に)
(setq howm-file-name-format "%Y/%m/%Y_%m_%d.txt")
キーワード一覧を ~/howm/.howm-keys に置く
(setq howm-keyword-file "~/howm/.howm-keys") ;; デフォルトは ~/.howm-keys
一覧で「!」したときの初期コマンドを変更
(setq howm-view-summary-shell-last-file "_FILE_") (setq howm-view-summary-shell-hist '("mv _FILE_ ~/gomi" "touch _FILE_" "ls -l _FILE_"))
一覧バッファの色つけ例
(setq howm-view-summary-font-lock-keywords '(("^2003" . 'highlight)))
カスタマイズ
(setq howm-menu-recent-num 20) ;; 表示する個数
ただし, 登録した関数しか使えません (おっかないから)
(setq howm-menu-allow (append '(foo bar) howm-menu-allow)) ;; foo と bar を許可
メニューをメモ扱いしない (メモ一覧・検索の対象外に)
;; mv ~/howm/0000-00-00-000000.txt ~/hoge/fuga/menu.txt しといて… (setq howm-menu-file "~/hoge/fuga/menu.txt")
%reminder の仕切り例
(setq howm-menu-reminder-separators '( (-1 . "━━━━━━━今日↓↑超過━━━━━━━") (0 . "━━━━━━━予定↓━━━━━━━") (3 . "━━━━━━━もっと先↓↑3日後まで━━━━━━━") (nil . "━━━━━━━todo↓━━━━━━━") ;予定とtodoの境 ))
grep 使用時の coding system 指定
(setq howm-process-coding-system 'euc-japan-unix) ;; 読み書き共通 (setq howm-process-coding-system '(utf-8-unix . sjis-unix)) ;; (読.書)
Tips: gc-cons-threshold の値を増やすと速くなる場合がある. ref > 220,234-236
(setq gc-cons-threshold (* 4000 10000))
全文検索のとき, メモに加えて指定ディレクトリ以下も再帰的に探す
(setq howm-search-path '("~/Mail" "~/News")) (setq howm-search-other-dir t) ;; 下記のトグルの初期値 (t か nil)
物騒なので, ↓を書いとかないと無効
(setq howm-kill-all-enable-force t)
こんなふうに
Subject: タイトルバーに時計を表示 ←直前のリージョンの内容 Date: Thu, 12 Sep 2002 15:45:59 +0900 In-Reply-To: </home/hira/sawfish/rich-title/rich-title.jl> ←直前ファイル ■ ← カーソル
~/.emacs に
(setq howm-template "Subject: %title\nDate: %date\n%file\n%cursor") (setq howm-template-date-format "%a, %d %b %Y %H:%M:%S %z") (setq howm-template-file-format "In-Reply-To: <%s>\n")
テンプレートを複数指定
;; C-u 2 C-c , c → 2 番目のテンプレートで新規メモ ;; メニューから C-u 2 c でも同様 (setq howm-template '("= %title%cursor\n%date %file\n\n" "%date: %title%cursor"))
タイトル(メモ区切り) @@@ …
(setq howm-view-title-header "@@@")
goto リンク ==>…, come-from リンク <==…
(setq howm-ref-header "==>") (setq howm-keyword-header "<==")
goto リンク ((<…>)), come-from リンク ((:…:))
;; <>:は半角に直してください (setq howm-ref-regexp "((<\\([^>\r\n]+\\)>))") (setq howm-ref-regexp-pos 1) (setq howm-keyword-format "((:%s:))") (setq howm-keyword-regexp "\\(((:\\)\\([^:\r\n]+\\):))") (setq howm-keyword-regexp-hilit-pos 1) ;; 「関連キーワード」用 (setq howm-keyword-regexp-pos 2) (setq howm-keyword-regexp-format "%s") ;; M-x describe-variable 参照
「<<< hoge」の作成後は, 「hoge」にも下線
(setq howm-wiki-regexp "\\[\\[\\([^]\r\n]+\\)\\(\\]\\]\\)") (setq howm-wiki-regexp-hilit-pos 2) (setq howm-wiki-regexp-pos 1)
日付入力(C-c , d または [日↓])で年や月を略したら, 「未来」と解釈
(setq howm-insert-date-future t)
「http://」でリターン押したら, URL を kill-ring へ
(setq action-lock-no-browser t)
リマインダ記号(!+-~@.)から RET 一発で「済」に
(setq howm-action-lock-reminder-done-default "")
予定表・todo 一覧からリマインダ記号上で直接 RET したとき, 叩かれ先バッファを自動 save
(setq howm-action-lock-forward-save-buffer t)
保留の浮沈範囲
(setq howm-todo-priority-defer-init -14) ;; 初期値 = 下限 (setq howm-todo-priority-defer-peak 0) ;; 上限
例: メニューで, 「潜伏中は非表示」「済は表示」
(setq howm-menu-todo-priority -50000) (setq howm-todo-priority-done-bottom -44444)
todo 一覧(M-x howm-list-todo)の仕切り例
(setq howm-todo-separators '( (0 . "━━━━━━━↑超過━━━━━━━") (nil . "━━━━━━━潜伏中↓━━━━━━━") ))
{ } (トグルスイッチ)の変更
;; howm の load 前に (setq action-lock-switch-default '("{ }" "{*}" "{-}")) ;; 何個でも
{_} (未処理)の変更
(setq howm-dtime-format "[%a %b %d %H:%M:%S %Y]") ;; {_} (setq howm-template-date-format "[%Y-%m-%d %H:%M]") ;; テンプレート
「file://…」や「http://…」の変更 (ましな設定募集) thx > 945
;; howm (正確には action-lock.el) のロードより前に. ;; ・file://… (setq action-lock-open-regexp "\\<file://\\(localhost\\)?\\([-!@#$%^&*()_+|=:~/?a-zA-Z0-9.,;]*[-!@#$%^&*()_+|=:~/?a-zA-Z0-9]+\\)\\>") (setq action-lock-open-regexp-pos 2) ;; 2 個目の「\\(…\\)」がファイル名 ;; ・http://… (setq action-lock-browse-regexp "\\<\\([htp]\\{3,5\\}s?\\|ftp\\)://\\([-!@#$%^&*()_+|=:~/?a-zA-Z0-9.,;]*[-!@#$%^&*()_+|=:~/?a-zA-Z0-9]+\\)\\>" (setq action-lock-browse-regexp-pos 0) ;; マッチした全体が URL
action-lock 追加例: 「Message-ID: …」でリターン押したら, 該当メールを namazu で検索
;; howm を load した後に (defun my-howm-search-message-id (id) (message "Searching...") (let* ((query (format "+message-id:%s" id)) (args `("-l" "-n" "1" ,query "/home/hoge/NMZ/Mail")) (found (car (howm-call-process "namazu" args)))) (if found (progn (find-file found) (re-search-forward "^$" nil t) (message "Done.")) (message "No match.")))) (setq action-lock-default-rules (cons (action-lock-general 'my-howm-search-message-id "Message-[Ii][Dd]: \\(.*\\)$" 1) action-lock-default-rules))
おまけ
(setq howm-congrats-format '( "(´・ω・`) %s" "(`・ω・´) %s" ;; …以下略… )) (setq howm-congrats-command '("play" "~/sound/fanfare.wav"))
(同梱ツールは ext/ に)
メモディレクトリ ~/howm/ を変換して ~/converted/ に吐く
./howm2 ~/howm/ ~/converted/
<<< の大文字小文字を無視
./howm2 -i ~/howm/ ~/converted/
リンク書式の指定
./howm2 -comefrom='<<<' -goto='>>>' ~/howm/ ~/converted/
「ほげ」を含むファイルだけ HTML 化
grep -rl 'ほげ' ~/howm/ | howm2 -list ~/converted/
カレンダー(予定・〆切・済みの一覧)を出力
hcal.rb -schedule_mark='○' -deadline_mark='●' -done_mark='/' ~/howm/*/*/*.txt
こんな感じでずらずら
----------------<6>---------------- 2003 01 Sun 02 Mon ●田中先生に連絡 ○B4輪講 小林 ○工学基礎実験 12:40 <<<<##>>>> …
こんな感じで alias しとくと便利
alias hcal="hcal.rb -schedule_mark='○' -deadline_mark='●' -done_mark='/' ~/howm/*/*/*.txt | less '+/<<<<#'"
コマンドラインで
hcal.rb -l memo.txt
emacs から M-x grep して
Run grep (like this): hcal.rb -l ~/memo/*.txt
キーワードを決めて, 日記中に書いておく
$食費$ 500円 ラーメン
(バグの指摘をくださる方へ)
できるだけ make test をお願いします
cd howm-○.○.○ make test
元ネタ参照. 特に, Q-pocket・HashedWiki・ChangeLog メモからいっぱいまねしてます. 感謝.
thx > patch・改良案・指摘をくださった皆様
一覧時の内容バッファにファイル全体を表示させる
(setq howm-view-preview-narrow nil)
リマインダのカスタマイズ thx
;; 新しい型のリマインダ「*」を定義する例: ;; 「[2004-07-11]* ほげ」は, 指定日まで上昇し, そのあと下降. ;; (旬度 = - |遅れ / 猶予日数|. 猶予日数のデフォルトは 3) ;; 1. 旬度関数を準備 (遅れと猶予日数(とアイテム)を食って旬度を吐く) ;; 遅れ: 指定日から今日までの日数. まだならマイナス. ;; 猶予: 「[2004-07-11]*8」なら 8. 「[2004-07-11]*」だけなら nil. ;; 旬度: 大きいほど上. 「覚書」なら初日が 0 で毎日 1 ずつ減る. ;; (アイテム: ふつうは使わないけどついでに. howm-backend.el 参照) (defun my-priority (late lazy item) (let ((r (howm-todo-relative-late late lazy 3))) ;; r = late / lazy. 無指定時は lazy = 3. (- (abs r)))) ;; 2. face を準備 (defface my-face '((t (:foreground "cyan"))) "my face") (setq my-face 'my-face) ;; 3. 記号, 旬度関数, face を登録. ;; 残りの引数二つは, 「予定表に表示するか」「todo リストに表示するか」. (howm-define-reminder "*" #'my-priority 'my-face nil t)
日付上で RET×2 してから…
-, + → 前日, 翌日 (, ) → 前日, 翌日 {, } → 前月, 翌月 [, ] → 前年, 翌年
ヒットしなかったらその先の日付を順に探す
(setq howm-date-forward-ymd-limit 90) ;; 90日先で give up
日付入力「C-c , d」したときの動作をさらに小賢しく
(setq howm-insert-date-pass-through t)
一覧表示にいちいち戻ることなく, 一覧の次項目を直接開く:
(defun my-howm-next-hit (n) (interactive "p") (let ((buf (save-window-excursion (howm-return-to-list) (when (not (eq major-mode 'howm-view-summary-mode)) (error "Sorry. This case is not cared.")) (forward-line n) (let ((howm-view-summary-keep-cursor nil)) (howm-view-summary-open)) (current-buffer)))) (switch-to-buffer buf))) (defun my-howm-previous-hit (n) (interactive "p") (my-howm-next-hit (- n)))
howm-search-path に, 通常の「ディレクトリ」以外も書ける
;; namazu folder と rot13 folder を検索対象に追加 ;; (M-x howm-toggle-search-other-dir で有効・無効を切りかえ) (let* ((nd "~/PATH/NMZ/Mail") ;; namazu インデックスのあるディレクトリ (rd "~/g/r13") ;; このディレクトリ以下のファイルは rot13 される (nf (howm-make-folder:namazu nd)) (rf (howm-make-folder:rot13dir rd))) (setq howm-search-path (list nf rf))) (howm-toggle-search-other-dir 1) ;; 0 なら初期状態は「無効」
新規メモ作成をすべて howm-remember にするには…
;; howm-create をすべて howm-remember にすりかえる (defadvice howm-create (around remember activate) (if (interactive-p) (howm-remember) ad-do-it)) (setcdr (assoc "[新規]" howm-menu-command-table-ja) '(howm-remember current)) ;; [2006-05-15] 修正
メニューにこう書くと, 「foo」「bar」「baz」を含む todo を 分類して表示
%here%(howm-menu-categorized-reminder ("foo" "bar" "baz"))
さらに, 各行の「foo」「bar」「baz」を消したければ
%here%(howm-menu-categorized-reminder ("foo" "bar" "baz") nil t)
「misc.」を非表示にしたければ
%here%(howm-menu-categorized-reminder ("foo" "bar" "baz") nil nil t)
一覧バッファのマッチ内容の左にタイトルを表示. ちなみに従来のは, 「マッチ内容のかわりにタイトルを表示」. thx > Highfly さん
(setq howm-view-list-title-type 2) ;; マッチ内容の左にタイトルを表示 (setq howm-view-summary-format "") ;; ファイル名を消したければ
一覧時にウィンドウ分割を壊さない設定. thx
(setq riffle-keep-window t) (setq riffle-window-initializer nil)
バッファ名を, ファイル名ではなくタイトルにする. thx > Mielke-san (peter at exegenix.com), thx
;; emacs 上でのバッファ名を, ファイル名ではなくタイトルに. ;; (ファイル名自体は変更しない) (add-hook 'howm-mode-hook 'howm-mode-set-buffer-name) (add-hook 'after-save-hook 'howm-mode-set-buffer-name)
タイトル「ほげ」のメモのバッファ名を「=ほげ」に thx
;; タイトルが AAA ならバッファ名を =AAA に. ;; 下の howm-mode-set-buffer-name を設定した上で… (setq howm-buffer-name-format "=%s")
一覧バッファで「ファイル | マッチ行」のかわりにこんな表示に. このときタイトル先頭の「=」は表示しないように. (experimental) thx thx > Albert-san (areiner at tph.tuwien.ac.at)
タイトル A| |マッチ行 A1 |マッチ行 A2 タイトル B| |マッチ行 B1 |マッチ行 B2
設定
(setq howm-view-list-title-type 2) ;; Show title before summary. (setq howm-view-summary-format "") ;; If you want to delete file names. (setq howm-entitle-items-style2-max-length 50) (setq howm-entitle-items-style2-format "%-0s|%s") ;; for title and summary (setq howm-entitle-items-style2-title-line t) ;; independent title line?
日付入力時の動作を拡張 thx > Albert-san (areiner at tph.tuwien.ac.at)
;; 「[2003-12-27]」上で RET して年や月を略したら… (setq howm-action-lock-date-future t) ;; 2003-12-27 より未来と解釈 ;(setq howm-action-lock-date-future 'closer) ;; 2003-12-27 に近い方で解釈
新規入力時にだけそういう動作にしたければ
;; 日付入力(C-c , d または [日↓])で年や月を略したら… (setq howm-insert-date-future t) ;; 「未来」と解釈 ;(setq howm-insert-date-future 'closer) ;; 今日に近い方で解釈