QFixHowm - 快適に使うためのtips
vim/gvim用howmプラグインの検索高速化とtips
快適に使用するための設定
QFixHowmにおいて最も重い処理は grepの実行と結果登録です。
日記やクイックメモとMRUリストのような軽いコマンドをメインに使用することで必要なエントリへのアクセス速度を上げることが出来ます。
実際に作者の使い方ではクイックメモとMRUリストだけでほとんど間に合っていて grepが実行される回数は非常に少ない状態です。
またWindowsの場合、かならず「外部grepを設定」するようにしてください。
デフォルト設定(findstr)のままでは一部コマンドの動作が異なったり、遅かったり(vimgrepが使用される)することがあります。
howmと直接の関係はありませんが、個人的に有用だと思われるものは以下にまとめてあります。
- 複数のPCでhowm_dirを共有したい場合は、Dropboxやネットワークドライブ、バージョン管理ツールのリポジトリなどを使って下さい。
- QFixHowmをUSBメモリのvim/gvimから実行したい場合は以下も参考になるかもしれません。
- 「USBメモリからvim/gvimを実行する場合のTips」
- QFixHowmでは日本語を扱うことが多いと思いますが、vimで日本語入力が面倒だと感じると howmを使う意味が半減します。
- vimで日本語を扱う際の個人的な対処について以下にまとめました。
- 「vimで日本語を使いやすくする」
- QFixHowmのエントリをHTML変換表示して画像と同時に表示する事も出来ます。
- 画像はサムネイル表示が行われ、一部のはてな記法はテーブルやリスト、引用部分などのHTMLタグに変換可能です。
- 「howmファイルをHTML変換してローカルblogのように使用する」
howmのsyntax(色分け表示)
QFixHowmは主に雑多なメモ取りを目的としていて、文書構造については出来るだけユーザが自由に設定できる様になっています。
何らかの文書構造ルールでメモを取っている場合、構造に応じた色分け表示を行うと見やすくなります。
独自に設定するのが面倒な場合は markdown やVimWikiなど任意のバッファを使用する事も出来ます。
エントリへのアクセス速度
使用方法にも依りますが、メモ取りシステム全般で扱うファイルの9割以上が最近「作成/更新/閲覧」されたファイルであるようです。
これは最近「作成/更新/閲覧」したファイルだけでも高速アクセス可能なら、かなり快適に扱えるということを意味します。
コマンドとしては ,m 「MRUリスト」 ,u 「クイックメモ」 ,<Space> 「日記を書く」 ,j 「ペアリンクhowmファイル」 がオンメモリで処理するのでもっとも高速です。
エントリにアクセスするには ,m をメインに使用して、必要に応じて ,l で一覧表示するか、,s で検索するというのがおすすめです。
最近「作成/更新/閲覧」したファイルにアクセスするには ,mをメインコマンドとして使用してみて下さい。
MRUリストはgrepを使わずオンメモリで高速に処理されるため体感速度が相当上がります。
MRUリストの登録数を少し大きめにしておいて、sコマンドで絞り込みをして使うのも手です。
単に一時的なメモ、一行だけのメモが多いなら「クイックメモ」をテンポラリメモに使用すると瞬時にアクセスできます。
「クイックメモ」では複数のクイックメモを扱うことも可能です。
クイックメモのように一ファイル複数エントリで使用する際の補助コマンドとして「一ファイル複数エントリの補助コマンド」が用意されています。
エントリは ,W コマンドで個別エントリに分割したり、単純なファイル連結や連結表示で一ファイル複数エントリに変更することが可能です。
「アウトラインモード」を使用すると特定エントリ以外は折りたたむ事も出来ます。
ファイル数とパフォーマンス
QFixHowmではQuickfixウィンドウを使用している関係で、パフォーマンス的にはファイル数が一番大きな要素になります。
QFixHowm仕事と、プライベート、あるいはプロジェクト単位などで環境を切り替えることも出来ますので、検索対象のディレクトリを切り替えると検索対象ファイル数が減るので速度も上がります。
howmでカテゴリ分けは必須ではありませんが、必要な場合のみカテゴリタグを付加することも可能です。
「カテゴリ検索」
作者の実際の使用法は「QFixHowmの使い方」にまとめました。
1. MRUリストを最近更新のファイル検索として使用する
最近更新・閲覧したファイルへアクセスするのを高速化するために ,m のMRUリストをメインに使用します。
MRUリストでアクセスできないファイルには、 ,l で「最近更新したファイルを検索」するか普通に検索して探す、という使い方になります。
MRUはgrepを使用せず、オンメモリで処理するため非常に高速です。
内部grepを使用している場合や、howmファイルをUSBメモリやネットワークドライブに置いていてgrepが遅いときなどにも有効です。
,m ,l ,L のキーマップはカスタマイズ可能ですので、使いやすいように設定してください。
「最近 "作成/更新/閲覧" したファイル表示のキーマップ」
2. 「最近更新したファイルを検索」を高速化する
ファイル数が増えてくると、「,l で最近更新したファイルを検索」や「,a で全エントリを一覧表示」が遅くなります。
これらのコマンドは全エントリを検索してからファイルの更新時間を取得し、ソートして表示しているのですが、ファイル数が増えるとgrepではなく、Quickfixウィンドウへの登録処理時間の増大が顕著になるためです。
「更新時間の管理」は本来、一ファイル複数エントリでもファイル単位ではなく各エントリ個別に更新時間を扱うためのもので、高速化を目的としたものではありませんが、副作用として「最近更新したファイルを検索」コマンドが高速化されます。
これは「更新時間の管理」を使用した場合は、grepの時点で検索結果数が絞り込まれているために登録処理数が減ることによります。
テストケース
以下は ,l の「最近更新したファイルを検索」で「更新時間の管理」を利用した場合と、しない場合の処理時間を表にしたものです。
外部grepの処理時間は grep実行時間+Quickfix登録時間で、内部grepの登録処理時間は0なので検索時間のみです。
何度か同じ検索を実行した上での3回平均なので、ディスク関係の処理時間はほぼ一定です。
このケースでは単純にhowm_dir 内のファイルをディレクトリごと何度もコピーしているので階層が非常に深くなっていて、実際に運用した際の grep速度より若干遅くなっています。
外部grepの場合
ファイル数220、最近更新したファイル20
ファイル数2400、最近更新したファイル60
ファイル数が少ないうちは大して変わりませんが、ファイル数が増えてくるとかなり違ってくるのがわかると思います。
「更新時間の管理」を使用しない場合は、ファイル数が多くなるほどQuickfix登録処理時間が増えていきますが、「更新時間の管理」を使用した場合は、処理時間がほぼgrep時間と同じになります。
なんにせよgrepを使用しない方が早いので、,m の 「MRUリスト」をメインに使用することを検討して下さい。
「MRUリスト」はオンメモリで処理されるので処理時間は0です。
また、一度検索した結果を保存しておくと、g,kで呼び出す事が出来ます。
こちらもgrepと前処理する時間が0になります。
3. 一ファイル複数エントリで使用する
howmは一ファイル複数エントリで使用することも出来ます。
一日一ファイルにすれば g,c でファイルを開いた時、存在していれば今日のファイルが検索なしで開かれることになります。
一日単位の仕事メモなどには最適かもしれません。
"一日一ファイルで使用する
let howm_filename = '%Y/%m/%Y-%m-%d-000000.howm'
一ファイル複数エントリで使用する際の補助コマンドは以下にまとめてあります。
一ファイル複数エントリでも、エントリ単位で更新時間を管理する事が出来ます。
更新時間をhowmタイムスタンプとして埋め込むと、一ファイル一エントリと変わらない感じで扱えます。
「更新時間の管理」
4. 外部grepのオプションを活用する
howm_dir を subversionなどのバージョン管理ソフトを使用して管理している場合、差分を保存するディレクトリが howm_dir内に作成されることがあります。
grepで --exclude 等のオプションが使えるなら設定してやると速くなるかもしれません。
外部grepに独自のオプションを指定して実行したい場合は、 MyGrepcmd_useroptに設定します。
let MyGrepcmd_useropt = '--exclude-dir=CVS'
MyGrep_ExcludeRegを使用しても同様に特定のディレクトリ内のファイルを無視することが出来ます。
ほとんどの場合どちらでも速度はさほど変わりませんが、--excludeを使用した方が速くなることがあります。
5. 予定・TODO表示を高速化する
長期間QFixHowmを使っていて予定・TODO表示が遅くなってきたら以下を参照してください。
「予定・TODOの検索場所指定 (予定・TODO表示の高速化)」
特に副作用はありませんので最初から使用していても問題ありません。
カテゴリ検索
カテゴリ検索やタイトル検索としてはエントリフィルタを使用してみて下さい。
「エントリフィルタ」
howmではカテゴリ分け自体は推奨されていませんが、,l ,a の一覧表示の際などカテゴリタグがついていると便利な場合もあります。
let QFixHowm_UserSwActionLock = ['[ ]', '[:private]', '[:work]', '[:vim]']
「ユーザーアクションロック」でカテゴリタグを定義しているので<CR>で変更できます。
カテゴリタグはタイトル行になければいけないという物でもないので、キーマップを使わず直接 [ ] を入力して、アクションロックで変更しても良いでしょう。
タイトル行に必ずカテゴリタグを追加したいという場合は「新規エントリのテンプレート」を参照してください。
一ファイル複数エントリの補助コマンド
QFixHowmを一ファイル複数エントリでも利用しやすいように、いくつかのhowmバッファローカルコマンドが用意されています。