fudist

QFixHowm - 快適に使うためのtips

vim/gvim用howmプラグインの検索高速化とtips

このページはvim/gvim用howmプラグイン「QFixHowm」のオプション設定についての解説ページです。
howmの基本的な使い方は「howmの基本的な使い方」を参照して下さい。

操作一覧
コマンド一覧
解説ページ
QFixHowm | インストール | 基本的な使い方 | コマンド一覧 | 検索リンクとアクションロック | 予定とTODO | オプション | 快適な使用のために | 更新時間の管理



快適に使用するための設定

エントリファイルが増えてきて処理速度的に問題が出てきたと思ったら、まず内部grep(vimgrep)ではなく外部grepを使用してください。
全ての検索処理が最低でも4~5倍程度は高速化されます。

使用方法にも依りますが、メモ取りシステム全般で扱うファイルの9割以上が最近作成/更新されたファイルであるようです。
これは最近作成/更新したファイルだけでも高速アクセス可能なら、かなり快適に扱えるということを意味します。
コマンドとしては ,m 「MRUリスト」 ,u 「クイックメモ」 ,<Space> 「日記を書く」がオンメモリで処理するのでもっとも高速です。
エントリにアクセスするには ,m をメインに使用して、必要に応じて ,l で一覧表示するか、,s で検索するというのがおすすめです。

まず最近 作成/更新/閲覧 したファイルにアクセスするには ,mの「MRUリストを最近更新のファイル検索として使用する」を使用して下さい。
MRUリストはgrepを使わずオンメモリで高速に処理されるため体感速度が相当上がります。

単に一時的なメモ、一行だけのメモが多いなら「クイックメモ」をテンポラリメモに使用すると瞬時にアクセスできます。
クイックメモのように一ファイル複数エントリで使用する際の補助コマンドとして「一ファイル複数エントリの補助コマンド」が用意されています。
エントリは ,W コマンドで個別エントリに分割したり、単純なファイル連結や連結表示で一ファイル複数エントリに変更することが可能です。
アウトラインモード」を使用すると特定エントリ以外は折りたたむ事も出来ます。

QFixHowmではQuickfixウィンドウを使用している関係で、パフォーマンス的にはファイル数が一番大きな要素になります。
このため古くて基本的に更新しないようなファイルはバックアップを取って削除(howm_dir外へ移動)する手もありますが、一ファイルにまとめてしまうと速くなります。
ファイルは単純に連結してやると、一ファイル複数エントリのhowmファイルとして扱えます。
この時「更新時間の管理」を使用すれば、一ファイル複数エントリでも個別に更新時間管理が行えます。
また「更新時間の管理」を利用すると、副作用的に「,l で最近更新したファイルを検索」が高速化されます。

仕事と、プライベート、あるいはプロジェクト単位などで環境を切り替えることも出来ます。
この時に検索対象のディレクトリごと切り替えると、検索対象ファイル数が減るので速度も上がります。
howmでカテゴリ分けは必須ではありませんが、必要な場合のみカテゴリタグを付加することも可能です。
howmの設定を切り替える

作者の実際の使用法は「QFixHowmの使い方」にまとめました。

howmでは日本語を扱うことが多いと思いますが、vimで日本語入力が面倒だと感じると howmを使う意味が半減します。
たとえば vimではノーマルモードと挿入モードを行き来して編集しますが、日本語入力/編集の際にはIMEの切替が面倒に感じるかもしれません。
QFixHowmと直接の関係は有りませんが、日本語を扱う際の個人的な対処についてまとめました。
vimで日本語を使いやすくする



1. MRUリストを最近更新のファイル検索として使用する

最近更新・閲覧したファイルへアクセスするのを高速化するために ,m のMRUリストをメインに使用します。
MRUリストでアクセスできないファイルには、 ,l で「最近更新したファイルを検索」するか普通に検索して探す、という使い方になります。

MRUはgrepを使用せず、オンメモリで処理するため非常に高速です。
内部grepを使用している場合や、howmファイルをUSBメモリやネットワークドライブに置いていてgrepが遅いときなどにも有効です。
howm専用MRUを使用する

,m ,l ,L のキーマップはカスタマイズ可能ですので、使いやすいように設定してください。
最近 "作成/更新/閲覧" したファイル表示のキーマップ


2. 「最近更新したファイルを検索」を高速化する

ファイル数が増えてくると、「,l で最近更新したファイルを検索」や「,a で全エントリを一覧表示」が遅くなります。
これらのコマンドは全エントリを検索してからファイルの更新時間を取得し、ソートして表示しているのですが、ファイル数が増えるとgrepではなく、Quickfixウィンドウへの登録処理時間の増大が顕著になるためです。

更新時間の管理」は本来、一ファイル複数エントリでもファイル単位ではなく各エントリ個別に更新時間を扱うためのもので、高速化を目的としたものではありませんが、副作用として「最近更新したファイルを検索」コマンドが高速化されます。
これは「更新時間の管理」を使用した場合は、grepの時点で検索結果数が絞り込まれているために登録処理数が減ることによります。

テストケース

以下は ,l の「最近更新したファイルを検索」で「更新時間の管理」を利用した場合と、しない場合の処理時間を表にしたものです。
外部grepの処理時間は grep実行時間+Quickfix登録時間で、内部grepの登録処理時間は0なので検索時間のみです。
何度か同じ検索を実行した上での3回平均なので、ディスク関係の処理時間はほぼ一定です。
このケースでは単純にhowm_dir 内のファイルをディレクトリごと何度もコピーしているので階層が非常に深くなっていて、実際に運用した際の grep速度より遅くなっているかもしれません。

外部grepの場合

ファイル数220、最近更新したファイル20
更新時間の管理  外部grep  外部grep実行時間  Quickfix登録時間
 使用する
 0.67秒  0.63秒  0.04秒
使用しない
 0.82秒  0.64秒  0.18秒

ファイル数2400、最近更新したファイル60
更新時間の管理  外部grep  外部grep実行時間  Quickfix登録時間
 使用する  1.57秒  1.46秒  0.11秒
使用しない
 5.62秒  1.58秒  4.04秒

ファイル数が少ないうちは大して変わりませんが、ファイル数が増えてくるとかなり違ってくるのがわかると思います。
更新時間の管理」を使用しない場合は、ファイル数が多くなるほどQuickfix登録処理時間が増えていきますが、「更新時間の管理」を使用した場合は、処理時間がほぼgrep時間と同じになります。

内部grepの場合


ファイル数220、最近更新したファイル20
更新時間の管理  内部grep
 使用する
 5.35秒
使用しない
 5.54秒

ファイル数2400、最近更新したファイル60
更新時間の管理  内部grep
 使用する  58.62秒
使用しない
 66.29秒

正直な所、内部grep使用では実用レベルと言いづらい速度です。
ちなみに ,aコマンドでは内部grepと外部grepで平均で4~6倍程度の差がつきます。

環境の関係で外部grepを使用できない場合は、,m の 「MRUリスト」をメインに使用することを検討して下さい。
MRUリスト」はオンメモリで処理されるので処理時間は0です。

また、一度検索した結果を保存しておくと、g,kで呼び出す事が出来ます。
こちらもgrepと前処理する時間が0になります。
Quickfixウィンドウの保存と読込


3. 一ファイル複数エントリで使用する

howmは一ファイル複数エントリで使用することも出来ます。
速度的には一ファイル複数エントリでまとめてしまった方が有利になります。

また一日一ファイルにすれば g,c でファイルを開いた時、存在していれば今日のファイルが検索なしで開かれることになります。
一日単位の仕事メモなどには最適かもしれません。
一月一ファイルなどで使用するとパフォーマンス的には非常に有利になります。
"一日一ファイルで使用する
let howm_filename     = '%Y/%m/%Y-%m-%d-000000.howm'

一ファイル複数エントリでも、エントリ単位で更新時間を管理する事が出来ます。
更新時間をhowmタイムスタンプとして埋め込むと、一ファイル一エントリと変わらない感じで扱えます。
更新時間の管理

一ファイル複数エントリで使用する際の補助コマンドは以下にまとめてあります。
一ファイル複数エントリの補助コマンド


4. 古いファイルを一つにまとめる

ファイルが増えてきた場合、古いファイルを削除する代わりに一つのファイルにすると速度が上がります。
ファイルの連結や削除・移動はQFixHowmの機能を使わず、他のファイラやテキストファイルの連結ソフトなりコマンドなりを使用した方がよいかもしれません。
ファイル自体は単純に連結すれば、問題なく一ファイル複数エントリのファイルとして扱えます。
この場合も「更新時間の管理」を使用してやると、一ファイル複数エントリでも更新時間の管理が出来ます。

QFixHowmで連結する場合は以下のようになります。
  1. ,a コマンドで全てのエントリ検索
  2. 逆順にソート
  3. まとめたい古いファイルをビジュアルモードで選択
  4. @コマンドで連結
  5. ========>>> のセパレータを削除してから ,w で保存
  6. gv コマンドで再選択して Dコマンドで削除か、Rコマンドでhowm_dirへ移動してから適当な場所へバックアップする。
まとめたファイルは何時でも ,W で個別ファイルに分割保存できます。


5. 外部grepのオプションを活用する

howm_dir を subversionなどのバージョン管理ソフトを使用して管理している場合、差分を保存するディレクトリが howm_dir内に作成されることがあります。
grepで --exclude 等のオプションが使えるなら設定してやると速くなるかもしれません。
外部grepに独自のオプションを指定して実行したい場合は、 MyGrepcmd_useroptに設定します。
let MyGrepcmd_useropt = '--exclude-dir=CVS'
MyGrep_ExcludeRegを使用しても同様に特定のディレクトリ内のファイルを無視することが出来ます。
ほとんどの場合どちらでも速度はさほど変わりませんが、--excludeを使用した方が速くなることがあります。
grepの対象にしたくないファイル名の正規表現

howmの設定を切り替える

カタゴリタグ

howmではカテゴリ分け自体は推奨されていませんが、カテゴリタグが有効な場合もあります。
特定の時だけカテゴリタグを付けたいという時は以下のキーマップを .vimrcに追加して下さい。
キーマップは特にg,を使用する必要はありませんので、お好みで変更してください。
適当なファイルで :vimや :privateを Wikiスタイルリンクにしておくとカテゴリ検索になります。
nnoremap <silent> g,ht :<C-u>call QFixHowmCreateNewFileWithTag('[ ]')<CR>
let QFixHowm_UserSwActionLock = ['[ ]', '[:private]', '[:work]', '[:vim]']
ユーザーアクションロック」でカテゴリタグを定義しているので<CR>で変更できます。
カテゴリタグはタイトル行になければいけないという物でもないので、キーマップを使わず直接 [ ] を入力して、アクションロックで変更しても良いでしょう。

デフォルトの QFixHowmCreateNewFileWithTag(tag)は以下のようなスクリプトです。
function! QFixHowmCreateNewFileWithTag(tag)
  let bak = g:QFixHowm_Cmd_New
  let title = g:QFixHowm_Title. ' '. a:tag
  let g:QFixHowm_Cmd_New = "i".title." \<CR>\<C-r>=strftime(\"[%Y-%m-%d %H:%M]\")\<CR>\<CR>\<ESC>kk$a"
  call 
QFixHowmCreateNewFile()
 let g:QFixHowm_Cmd_New = bak
endfunction


カスタマイズしたQFixHowmCreateNewFileWithTag(tag) は.vimrcか、適当なファイルに追加してランタイムパスの通った場所にコピーしてください。
ユーザ定義のQFixHowmCreateNewFileWithTag(tag)が存在する場合はそちらが優先されます。
新規ファイル作成時のテンプレートについては「コマンドで挿入されるテンプレートのカスタマイズ」を参考に適当にカスタマイズして下さい。

howm-chenv.vim

またhowm-chenv.vimを使用すると、仕事用とプライベート用など howm環境を簡単に切り替えることが出来て、vimを終了しても前回終了時と同じ設定が使えます。
以下のスクリプトQFixHowmと同じディレクトリにコピーして下さい。
howm-chenv.vim

.vimrcの設定
.vimrcで、必ずQFixHowmChDirかhowm_dirを明示的にを設定する必要があります。

let QFixHowmChDir = 'c:/howm'

"howmディレクトリの切替
nnoremap <silent> g,hh :echo g:howm_dir<CR>
nnoremap <silent> g,ha :call HowmChEnv('',      'time', '=')<CR>
nnoremap <silent> g,hm :call HowmChEnv('main',  'time', '=')<CR>
nnoremap <silent> g,hv :call HowmChEnv('vim',   'time', '= [:vim]')<CR>
nnoremap <silent> g,hw :call HowmChEnv('work',  'day',  '=')<CR>
nnoremap <silent> g,hd :call HowmChEnv('diary', 'day',  '=')<CR>

この例ではc:\howm以下にhowmのデータを設定することになります。
c:\howmというフォルダを作成してから実行してみてください。
それぞれの環境ごとに異なるディレクトリを使用してデータを格納します。
上記の例の g,hw なら c:\howm\work というディレクトリにデータが作成される事になります。  

g,hhで現在の環境を表示します。
g,hmとg,hvでは一エントリ一ファイルで、g,hwとg,hdでは一日一ファイルで実行します。
g,hvの時はタイトルにカテゴリタグ '= [:vim] ' を常に付加します。
g,haでは全てのエントリを検索することが出来ます。

インストール後の初回使用時のみ必ず、g,haなど、どれかのコマンドを実行してください。
以降は前回の設定が使用されます。

あんまり細かく分けてしまうと適当にメモを書いて適当に検索するhowmの良さが無くなりますが、仕事のメモとプライベートなメモなどを分けておくのは有効かと思います。
キーマップやpath、ファイル設定などは「コマンドで挿入されるテンプレートのカスタマイズ」も参考に適当にカスタマイズして下さい。

またWindowsでは QFixHowmChDir を次のように設定すると、vimと同じドライブのデータを参照できます。
let QFixHowmChDir = matchstr($VIM, '^[A-Za-z]:').'/howm'
vim/gvimをUSBメモリなどから起動している場合などは便利です。
本サイトで配布している「vim UTF-8日本語版」は、レジストリを使用しませんので、そういう用途に適しているかもしれません。

一ファイル複数エントリの補助コマンド

QFixHowmを一ファイル複数エントリでも利用しやすいように、いくつかのhowmバッファローカルコマンドが用意されています。
  • 新規エントリは ,C ,n ,N ,p ,P 等を使用して追加
  • ,x ,Xでエントリ単位の削除、移動
  • ファイル内のエントリはhowmタイムスタンプを利用して ,rs ,rS でソート。
    更新時間の管理」を利用しているなら、更新時間順でソートして保存する事も出来ます。
    このとき ,wで保存するとhowmタイムスタンプは変更されません。
  • ,Wでファイル内のエントリを個別に分割して保存できます。
  • ファイルを検索してから@コマンドで連結出来ます。
  • 一日一ファイルで複数エントリの場合、「アウトラインモード」が便利です。

,C  現在行の次に新規エントリを追加する。
 エントリ追加にはQFixHowm_Key_Cmd_C で定義されるコマンドが使用される。
,n  現エントリの次に新規エントリを追加する。
 エントリ追加にはQFixHowm_Key_Cmd_n で定義されるコマンドが使用される。
 3g,n のようにカウント指定すると指定したエントリ数後へ追加します。
,N  現バッファの最後に新規エントリを追加する。
 エントリ追加にはQFixHowm_Key_Cmd_N で定義されるコマンドが使用される。
,p
 現エントリの前に新規エントリを追加する。
 エントリ追加にはQFixHowm_Key_Cmd_p で定義されるコマンドが使用される。
 3g,p のようにカウント指定すると指定したエントリ数前へ追加します。
,P  現バッファの先頭に新規エントリを追加する。
 エントリ追加にはQFixHowm_Key_Cmd_P で定義されるコマンドが使用される。
,S  「カーソル位置の howmタイムスタンプを現在時間に更新
,o  「アウトラインモード
 デフォルトでは zi コマンドで折りたたみがON/OFFされます。 
,w  「更新時間の管理」を使用していても、タイムスタンプを変更せずにファイルを保存する。
 連結表示バッファでは、スクラッチバッファから通常のバッファに変更して保存します。
,W  一ファイル複数エントリや連結表示されたファイルをを分割して保存する。
 ビジュアルモードの選択時には、選択範囲内のエントリのみ出力されます。
 「分割保存
,x  現在位置のエントリを削除する。 
,X  現在位置のエントリを新規howmファイルへ移動する。
 「QFixHowmの自動生成ファイル
,rs
 現バッファのエントリをhowmタイムスタンプの新しい順番でソートする。
 「更新時間の管理」を使用すると、更新時間順になります。
,rS  現バッファのエントリをhowmタイムスタンプの古い順番でソートする。
 「更新時間の管理」を使用すると、更新時間順になります。



前のページ「オプション」へ戻る



QFixHowm | インストール | 基本的な使い方 | コマンド一覧 | 検索リンクとアクションロック | 予定とTODO | オプション | 快適な使用のために | 更新時間の管理